使用nginx提供静态网页服务

前言

由于想在自己的机器上建一个博客,需要提供静态网页服务(偶尔来点动态内容)
使用的newifi mini路由器刚好使用的是padavan系统,有lnmp环境选项
就使用了nginx来提供网页服务,实际上路由器还自带了apache,但是先接触的先用吧

安装

padavan上

padavan上下载opt-lnmp包的链接失效了
需要手动从别的地方将opt-lnmp安装包的压缩文件=opt-lnmp.tgz=放在U盘并插入路由器
路由器重启自动识别U盘作为软件安装位置,并解压安装opt-lnmp
得到的lnmp环境不是最新的,使用

1
2
opkg update
opkg upgrade

进行升级
貌似opt-lnmp已经不再维护了(2017-02-18)

在openwrt上使用

1
opkg install nginx

以现在的知识范围来看,还用不上php和mysql,所以先不安装

设置网站的站点信息

nginx配置文件路径

/opt/etc/nginx/vhost/*.conf

  • 由于padavan上使用 /opt/ 文件夹存放安装的所有插件,
    所以配置文件所在的 /etc 文件夹也在这下面,不然一般是在根目录下

配置文件范本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Blog_real.conf
server {
listen 81; # 监听端口81
# 定义基于域名的网页服务,也可以基于其他,如IP地址,端口等
server_name www.chougBlog.com chougBlog.com chougBlog;
# 网站项目文件的根目录
root /media/AiDisk_a1/opt/www/public/;
# 定义的默认主页
index index.html index.htm;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 一些关于php的设置,可以忽略
location ~* ^.+\.php(\/.*)*$ {
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/tmp/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

至此已经可以使用 192.168.123.1:81 访问博客,但是使用域名仍然不行,以为默认的是80端口
若要不带端口号访问网站,可以将上述81端口改为80端口
但是
路由器一般都自带了web管理页面,占用80端口,并使用Apache提供网页服务,(有时为了性能使用uhttpd)
在浏览器访问默认的80端口似时,
nginx要提供监听后判断的内容
而Apache要提供默认设置好的管理页面
结果是Apache胜利了,每次都指向管理界面

Apache与nginx在80端口冲突的解决

nginx拥有反向代理功能
什么是反向代理先不要纠结,nginx可以作为中间人为客户端提供内容,而对中间人不透明
如果恰巧在同一个IP的同一个端口(比如这里的80端口)上访问多个网站,可以利用nginx的之一功能
即nginx作中间人,寻找不同网址,Apache提供的指向管理页面的功能很单一,就把80端口让出来,让nginx去找Apache吧

设置反向代理

由于希望使用 192.168.123.1 这样的地址访问路由器时出现的是路由器管理界面
而使用同样解析成 192.168.123.1 的域名 www.Blog.com 能够找到博客页面,
需要在web服务的默认端口80端口设置一个监听器并根据不同情况导向不同方向

  1. 请求博客页面时

    1
    2
    3
    4
    5
    6
    7
    8
    # blog.conf
    server {
    listen 80;
    server_name www.Blog.com Blog.com Blog;
    location / {
    proxy_pass http://192.168.123.1:81;
    }
    }

    这里nginx指向81端口,但并不关心81端口是谁提供的

  2. 请求管理界面时

    1
    2
    3
    4
    5
    6
    7
    8
    # manage.conf
    server {
    listen 80;
    server_name http://192.168.123.1 192.168.123.1;
    location / {
    proxy_pass http://192.168.123.1:8080;
    }
    }

    配置文件的前提是管理页面本身被放在了8080端口处

    在openwrt中是修改/etc/config/uhttpd文件中的端口,后使用/etc/init.d/uhttpd
    restart重启服务

    此时可以使用 192.168.123.1:8080192.168.123.1 访问管理页面

启动nginx

测试配置文件

1
nginx -t

启动服务

1
nginx

停止服务

1
nginx -s stop

重启服务

1
nginx -s reload

网络状况查看

1
2
3
4
5
6
7
8
9
10
11
12
[RT-AC54U /]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:4200 0.0.0.0:* LISTEN 15669/shellinaboxd
tcp 0 0 0.0.0.0:38604 0.0.0.0:* LISTEN 621/miniupnpd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 8479/nginx: master
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 682/httpd
tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN 8479/nginx: master
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 11909/dnsmasq
tcp 0 0 192.168.123.1:53 0.0.0.0:* LISTEN 11909/dnsmasq
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1366/vsftpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 27154/dropbear

可以看到nginx在80端口工作(提供中转),也在81端口工作(指向网站项目根目录)
httpd(属于Apache)工作在8080端口

访问

设置了 www.Blog.com 这样的域名,想要在本地生效,需要两步

路由器设置hosts文件

/etc/hosts 文件后添加一条 192.168.123.1 www.Blog.com Blog.com Blog

1
echo '192.168.123.1 www.Blog.com Blog.com Blog' >> /etc/hosts

一般hosts文件的改动是及时生效的

下级终端设置DNS服务器

  • 不设置
  • 改动过DNS设置的话要确保有一条是 192.168.123.1

访问效果

链接 页面
192.168.123.1 管理页面
192.168.123.1:8080 管理页面
192.168.123.1:81 博客
www.Blog.com 博客
Blog.com 博客
Blog 失败,可能是浏览器认为是个词,于是谷歌/百度去了
www.Blog.com:8080 管理页面,端口都指定了,听话去找

外部访问

路由器开启端口转发

需要在端口转发(UPnP)中设置外部端口到内部端口的映射关系,不然所有请求都被防火墙挡住
比如可以设置外部端口8001映射内部=192.168.123.1:81=等
小米路由器限制设置自身为被映射的对象,但是也能在配置文件中更改
如果网站放在二级路由器上(这次的newifi就是)
需要上级路由器转发到二级路由器
二级路由器再设置自身的转发(好在newifi并不限制转发到自身)

尝试DDNS

路由器IP地址可能不固定
需要路由器间歇地向一个DNS服务器发送自己的IP地址,然后才能用同一个域名访问不同的IP
推荐=no-ip=
注册免费,域名可以自定义,比花生壳好多了

使用效果

使用 www.xxxBlog.ddns.net:8001 访问博客

  • 不带端口号? 还是使用VPS吧,那个可以在保证安全的情况下开放80端口