前置
我的项目部署逻辑:在一台服务器上 通过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 通不了的说法