cenos7 下 docker ----->Nginx https/ssl 配置避坑指南

61 阅读2分钟

前置

我的项目部署逻辑:在一台服务器上 通过docker 将Jenkins,vue项目,flask项目 分容器部署管理,在VUE项目容器中安装了nginx ,通过nginx 反代,访问flask项目接口 如果,你的项目部署也跟我的类似,完全可以参考

正文

Dockerfile 配置:

FROM nginx:latest
MAINTAINER test1
COPY dist/ /usr/share/nginx/html/
COPY default.conf /etc/nginx/conf.d/default.conf
COPY ssl.pem /var/log/nginx/
COPY ssl.key /var/log/nginx/

default.conf 配置

server {
    listen 80;
    server_name ilcin.online  www.ilcin.online;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name ilcin.online www.ilcin.online;

    ssl_certificate /usr/share/nginx/cert/fullchain.pem;
    ssl_certificate_key /usr/share/nginx/cert/privkey.pem;
    ssl_session_timeout 10m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/host.access.log;
    error_log /var/log/nginx/error.log;

    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        add_header 'Access-Control-Allow-Origin' '*';
    }
    location /api/ {
      rewrite ^/api(/.*)$ $1 break;
      proxy_pass http://服务器IP:端口/;
      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 X-Forwarded-Proto $scheme;

      # 其他跨域配置
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'User-Agent,Keep-Alive,Content-Type';
      add_header 'Access-Control-Max-Age' 1728000;

      if ($request_method = 'OPTIONS') {
          return 204;
      }
  }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}


docker 容器运行 配置

docker run --name vue-admin -p 80:80 -p 443:443 -d admin-vue

重点!!!! 这一段就是 在同一台服务器下,docker 的nginx 的 配置关键!其中rewrite ^/api(/.*)$ $1 break; 这一句,是灵魂关键,反代后不能拼接上后段接口地址,差的可能就这一句

 location /api/ {
      rewrite ^/api(/.*)$ $1 break;
      proxy_pass http://服务器IP:端口/;
      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 X-Forwarded-Proto $scheme;

      # 其他跨域配置
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'User-Agent,Keep-Alive,Content-Type';
      add_header 'Access-Control-Max-Age' 1728000;

      if ($request_method = 'OPTIONS') {
          return 204;
      }

总结:

1、Dockerfile 文件 建议增加密钥 权限;

2、如果没有做 宿主机映射,建议将密钥 放在 dist 文件同目录

3、很关键!!!docker 容器运行 记得在原基础上增加 -p 443:443 端口范围权限(呜呜呜,我就是在这里掉坑的,这个小关键也是很多大神都没提及的坑)

4、同一台服务器上,如果出现跨域,或者反代 不生效,不要怀疑逻辑理论,那肯定就是对软件不熟,http 能通的,就不应该出现HTTPS 通不了的说法