Nginx 容器反向代理和 SSL 配置

前言

本文简记使用 Nginx 容器进行反向代理和 SSL 配置。

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 设置最后要加 ; 英文分号。
posted @ 2020-07-21 23:07  Yogile  阅读(827)  评论(0编辑  收藏  举报