Nginx 容器反向代理和 SSL 配置
前言
本文简记使用 Nginx 容器进行反向代理和 SSL 配置。
Nginx 容器部署
- 请参阅: 运行配置 Nginx 容器 。
反向代理
最简单示例
-
在
server{}
块中的localtion
块:server{ listen 80; server_name localhost; location / { proxy_pass http://192.168.1.110; } }
location 映射规则
优先级
-
排列:
(= 匹配) > (路径匹配) > (开头路径匹配) > (正则匹配) > (通用匹配) > (默认/匹配)
-
示例:
(location =) > (location /xxx/) > (location ^~) > (location ~/~*) > (location /xxx) > (location /)
= 匹配
-
示例:
location = / { ...... }
-
精准匹配,主机名后面不能跟任何字符串。
路径匹配
-
示例:
locatio /xxx/ { ...... }
-
精准匹配,只匹配主机名后面
/xxx/
字符串。
通用匹配
-
示例:
location /XXX { ...... }
-
匹配以
XXX
或/xxx
开头的路径。
正则匹配
-
示例:
location ~ /XXX { ...... }
-
匹配以
XXX
或/xxx
开头的路径。 -
实际上
开头路径匹配
-
示例:
location ^~ /XXX/ { ...... }
-
匹配以
XXX
或/xxx
开头的路径。
结尾路径匹配
-
示例:
~* \. (gif/jpg/png)$ { ...... }
-
匹配以
gif/jpg/png
结尾的路径。
我的示例
-
我的 Nginx 配置示例:
upstream rasamber-owncloud{ server 192.168.1.110:10100; } upstream rasamber-pi-dashboard{ server 192.168.1.110:10000; } server{ listen 80; return 301 https://$host$request_uri; } server{ listen 443 ssl; server_name rasamber; # SSL 设置 ...... # HSTS add_header Strict-Transport-Security "max-age=15552000; includeSubdomains; preload; connect-src *"; location /owncloud/ { proxy_pass http://rasamber-owncloud/owncloud/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Cookie $http_cookie; proxy_cookie_path /owncloud/ /; client_max_body_size 5000M; } location /pi-dashboard/ { proxy_pass http://rasamber-pi-dashboard/pi-dashboard/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Cookie $http_cookie; proxy_cookie_path /pi-dashboard/ /; } location / { root /etc/nginx/conf.d/nginxHtml; index index.html index.htm; } }
-
一些参数:
-
更多请参阅: Nginx 反向代理 owncloud 问题处理 。
-
client_max_body_size
:Nginx 默认只允许传输 2M 大小的文件,owncloud 传输文件动辄几百兆、几个G,需要设置允许最大文件传输大小。 -
proxy_set_header
:多个参数设置,为了避免 owncloud 等 docker 容器判断不信任域名访问,将 Nginx 代理访问给排除。 -
add_header Strict-Transport-Security
:是为了开启 HSTS 。
-
配置 SSL 证书
-
请参阅: 树莓派/Debian Apache2 实现 HTTPS(SSL) 服务 。
讲了部署 HTTPS 的两种方式:
- 使用第三方 CA 。
- 使用自建 CA 。
-
将生成的 Server 证书和密钥放到你的目标文件夹,在 Nginx 的
/etc/nginx/conf.d/default.conf
文件中设置:server{ listen 80; return 301 https://$host$request_uri; } server{ listen 443 ssl; server_name localhost; # SSL ssl_certificate /etc/nginx/conf.d/ownSSL/Server/Server_root.crt; ssl_certificate_key /etc/nginx/conf.d/ownSSL/Server/Server_private.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:sslcache:20m; location /owncloud/ { ...... } }
-
检查配置正确与否:
nginx -t
-
重载配置文件:
nginx -s reload
-
然后重启 Nginx 容器即可:
sudo docker-compose restart
-
要注意,Nginx 的 SSL 设置与 Apache 不同的一点细节:
- Nginx 的 SSL 设置最后要加
;
英文分号。
- Nginx 的 SSL 设置最后要加