• 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 设置最后要加 ; 英文分号。
  • 相关阅读:
    [译文] 实体与值对象到底是不是一回事?
    实现 WebApi 自托管服务宿主于 WinForms 及其交互
    [译文] C# 8 已成旧闻, 向前, 抵达 C# 9!
    [译文] 为什么你在 C# 里总是应该使用 "var" 关键字
    通过设置iis在局域网中访问网页
    windows 10 安装使用kafka
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 2) 定义命名化和类型化的客户端
    Asp.net Core 2.0 OpenId Connect Handler缺失Claims?
  • 原文地址:https://www.cnblogs.com/Yogile/p/13358013.html
Copyright © 2020-2023  润新知