OPENWRT 使用nginx作为web服务器

avatar
作者
筋斗云
阅读量:0

OPENWRT 使用nginx作为web服务器

在op上大家使用nginx作为web服务器,主要是为了其强大的反向代理功能,但op上的nginx官方做了一定的修改,配置上稍显复杂,几篇文章也是比较老的,配置也是一头雾水,作业都不好抄,索性自己查了资料学了些nginx的内容,实现了如下的功能:

外网 OP 内网 通过https+域名访问开放的端口 拒绝未开放的端口和http请求 内网ip地址直接访问OP 放行内网的访问请求 外网 OP 内网

####默认你已经完成 域名申请,配置DDNS 和 申请ssl证书的操作。

修改UCI控件

OP把uci配置加于nginx的配置之上,所以第一步先关闭uci的配置管理。
其实第三篇参考文章(官方文档)已经讲的很清楚了,如果你需要简单的管理nginx,用uci就够了,需要自己配置nginx的就关闭uci管理。
那当然是关闭啦:
第一种优雅的方式,登录后台命令行输入:

uci set nginx.global.uci_enable=false
uci commit nginx

这两步关闭了uci的配置接管
第二种直接的方式,修改/etc/config/nginx:

config main 'global' 	#把这里的true修改为false就行了 	option uci_enable 'false'  config server '_lan' 	option server_name '_lan' 	list include 'restrict_locally' 	list include 'conf.d/*.locations' 	option uci_manage_ssl 'self-signed' 	option ssl_certificate '/etc/nginx/conf.d/_lan.crt' 	option ssl_certificate_key '/etc/nginx/conf.d/_lan.key' 	option ssl_session_cache 'shared:SSL:32k' 	option ssl_session_timeout '64m' 	option access_log 'off; # logd openwrt'  config server '_redirect2ssl' 	list listen '80' 	list listen '[::]:80' 	option server_name '_redirect2ssl' 	option return '302 https://$host$request_uri' 

修改之后,重启后nginx也不再受到uci的管理了,其实到这里剩下的配置就和常规nginx一样了。

解除内网访问http重定向到https的问题

修改/etc/nginx/nginx.conf这个配置文件:
那我这里就贴出具体修改的代码块

	server { #see uci show 'nginx._lan' 		listen 443 ssl default_server; 		listen [::]:443 ssl default_server; 		server_name _lan; 		include restrict_locally; 		include conf.d/*.locations; 		ssl_certificate /etc/nginx/conf.d/_lan.crt; 		ssl_certificate_key /etc/nginx/conf.d/_lan.key; 		ssl_session_cache shared:SSL:32k; 		ssl_session_timeout 64m; 		access_log off; # logd openwrt; 	}  	server { #see uci show 'nginx._redirect2ssl' 		listen 80; 		listen [::]:80; 		server_name _redirect2ssl; 		return 302 https://$host$request_uri; 	}  

修改为:

   server { #see uci show 'nginx._lan'    	listen 80;    	listen [::]:80;    	server_name _lan;    	include restrict_locally;    	include conf.d/*.locations;    	access_log off; # logd openwrt;    } 

这里解释一下,好多文章是留下了 _redirect2ssl这个虚拟服务器配置,这里保留哪个虚拟服务器并不影响使用,只是/etc/nginx/目录下有个lan的配置,凭感觉来的。

这个就是本地web端,即OP的管理页面:

   	include conf.d/*.locations; 

这个是局域网保留网段的过滤,使得只能内网ip才能访问op的管理页面:

   	include restrict_locally; 

加上国内三大运营商默认ban了80端口443端口等一系列常见端口,其实某种意义上讲非常安全。

修改好配置后,命令行输入:

nginx -t

检查一下配置是否存在低级的语法错误。
在输入重载重启nginx命令:

service nginx reload
service nginx restart

至此内网通过ip访问就不会再强制https访问了

添加SSL证书

网上教你怎么申请ssl证书的非常多,现在好多是通过acme.sh脚本自动申请,另外就是通过域名提供商申请免费的ssl证书,
这里就不再赘述了,自行搜索。
nginx添加ssl证书就是声明一下ssl_certificate和ssl_certificate_key两个值就行了,这里提供一种全局添加的方式。
修改/etc/nginx/nginx.conf这个配置文件:

   gzip_proxied any;        root /www;        #####将以下内容添加到配置文件中#####        # Mozilla Intermediate configuration    ssl_protocols          TLSv1.2 TLSv1.3;    #以下协议需要确认硬件是否支持,如果不支持或者不确定可以直接去除    ssl_ciphers            ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;        #以下修改为自己申请的域名公钥和私钥文件地址    ssl_certificate /etc/nginx/conf.d/example.com.crt;    ssl_certificate_key /etc/nginx/conf.d/example.com.key;    #以上修改为自己申请的域名公钥和私钥文件地址    ssl_session_cache shared:SSL:32k;    ssl_session_timeout 64m;        #####将以上内容添加到配置文件中#####        server { #see uci show 'nginx._lan' 

添加好后重载并重启nginx服务。
修改好后就有个全局的ssl证书声明,如果你有多个域名需要反向代理,那就需要为每个不同域名对应的服务器配置对应的ssl证书了。

添加反向代理

一般来说,需要外网的服务,直接做一个端口转发到内网指定ip的指定端口就行了:

外网 OP 内网服务 通过域名加端口访问 转发外网的访问请求 外网 OP 内网服务

但是使用nginx反向代理的话,外网数据首先要转发到op端的指定端口再由op上的nginx转发给局域网ip

外网 OP.NGINX 内网服务 通过域名加端口访问op的nginx服务器 nginx判断是否转发外网的访问请求 外网 OP.NGINX 内网服务

所以记得在op->防火墙->端口转发中将对应端口转发到op的本地端口:
在这里插入图片描述
我这里按照nginx的习惯做法,在/etc/nginx/conf.d目录下创建了一个example.com.conf的配置文件:

server {    #一般加ssl后缀就可以了,我这里添加了对http2协议的要求。    listen 9080 ssl http2;    listen [::]:9080 ssl http2;    #修改为自己申请的域名    server_name example.com;     location / {    	#修改为自己需要代理的局域网ip和端口号    	proxy_pass http://localserver:9080;    	proxy_set_header Host $host;    	#以下配置文件是参考配置网站生成的配置不添加也没问题    	include nginxconfig.io/proxy.conf;    }    access_log on; # logd openwrt;    # location / { ... } # root location for this server. }  

添加好后测试配置是否存在语法问题,重载并重启nginx服务,如果发现通过域名访问失败时,先不要慌。
1.在内网通过nginx所在服务器加配置的端口号访问一下,确认内网服务是否正常
2.确认域名动态解析是否生效正确
3.以上都不是,那可能你开放的端口被运营商ban了,换个端口吧

这里贴出/etc/nginx/nginxconfig.io/proxy.conf的配置内容

proxy_http_version                 1.1; proxy_cache_bypass                 $http_upgrade;  # Proxy SSL proxy_ssl_server_name              on;  # Proxy headers proxy_set_header Upgrade           $http_upgrade; proxy_set_header X-Real-IP         $remote_addr; proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host  $host; proxy_set_header X-Forwarded-Port  $server_port;  # Proxy timeouts proxy_connect_timeout              60s; proxy_send_timeout                 60s; proxy_read_timeout                 60s; 

这些改动都是参考NGINX配置生成网站的demo修改的,自行斟酌添加:NGINX 配置配置高性能、安全、稳定的NGINX服务器的最简单方法.

添加外网访问http自动转为https

到这里其实已经可以正常访问了,但是如果你用http去访问一个强制https访问的端口就会出现nginx的400报错,意思你该用https访问。
这里你自然可以参考内网http强制转https的写法,但我记得我测试有点问题,我这里贴出一个最近找到的对于域名访问全部重定向为https的方法,当然你也可以修改端口为指定端口:

server {                                                                                                   listen example.com;                                                                          server_name example.com;                                                                     rewrite ^/(.*)$ https://$host$1 permanent;                                                      } 

主要参考文章

K3终极折腾记<三> --通过ipv6域名远程访问openwrt、https证书安装配置.
OpenWrt 上设置 nginx HTTP 不重定向到 HTTPS 以正常使用 OpenClash yacd 面板.
Nginx webserver.

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!