海滨擎蟹

mac 下 docker 本地部署若依分离版,nginx 反向代理无效问题解决

若依分离版本地 docker 部署,安装 nginx 容器 后将 ruoyi-ui(前端)打包放到 html 下,修改默认的 /conf.d/default.conf:

    server {
        listen       80;
        server_name  localhost;
        charset utf-8;

        location / {
            root   /usr/share/nginx/html/ruoyi-ui;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }
        
        location /prod-api/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://localhost:8080/;
        }

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

try_files $uri $uri/ /index.html; 做了 vue 的静态访问映射,去除 .html 后缀。
/prod-api/ 对应正式站打包后台接口路径,/stage-api/ 对应测试站打包访问后台接口路径。这两者因为 vue 项目打包 代理器失效,所以需要通过 web 服务器反向代理来实现访问。

然后通过 http://localhost/prod-api/ 按照理论上来说,应该访问是 8080 端口服务。本地 nohup java -jar targets/ruoyi-admin.jar & 启动之后,8080 端口服务是存在的,但 /prod-api/ 并没有代理到后台的 8080 端口服务。

尝试通过百度解决,但搜索到的都是关于 nginx 如果配置反向代理的,之后缩小搜索范围,改为 docker、nginx、反向代理无效,找到了 在docker下安装nginx实现反向代理宿主机请求

突然意识到 nginx 服务与我在本地环境启动的 8080 端口服务不在一台设备,或者更准确一点不在一个 ip 上,nginx 内的 8080 端口没有服务,所以提示报错,这恰好说明了 nginx 的反向代理是起作用的。

所以只需要修改代理服务的地址为本地环境,即宿主机的局域网 ip,就可以正常访问了。

可以通过设置->网络查看到当前的 ip 地址,也可以通过 ifconfig,eth0 inet 查看到。替换掉 localhost,再次重启 nginx,登录页正常显示了。


2023-03-17

在通过 docker 安装了 php-fpm(php80)和 nginx 之后,配置 nginx 的 default.conf 文件增加一条 server 来解析 php 项目。

server {
    listen       80;
    server_name  localhost;
    charset utf-8;

    location / {
        root   /usr/share/nginx/html/carcar/public;
#        try_files $uri $uri/ /index.html;
        try_files $uri $uri/ /index.php?$query_string;
        index  index.html index.htm index.php;
    }

    location ~ \.php$ {
        fastcgi_pass   php80:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/carcar/public/$fastcgi_script_name;
        include        fastcgi_params;
    }

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

在尝试将 fastcgi_pass 设置为 http://docker.for.mac.host.internal:9000 时,启动报错:invalid host in upstream "http://docker.for.mac.host.internal:9001"。更换成本地地址 10.7.2.48 也是一样的错。

为什么之前使用 proxy_pass 还能识别,到了 fastcgi_pass 就不认识了?没办法,经过一端时间的查询,没有结果,但有了一个新的方法:docker --link,这个叫做容器互联

使用时需要链接的容器处于运行状态,这里就是 php-fpm 的容器名 php80,可以通过 : 后面增加一个别名。解析时,会把 php80 的网络并入 nginx,并通过修改 nginx 的 /etc/hosts,把容器名(或别名,如果有设置的话)php80 映射成 127.0.0.1,让 nginx 通过 php80:9000 访问 php-fpm。

docker run \
-p 80:80 \
--name nginx \
--restart=always \
--link php80 \
-v /Users/mac/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/mac/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /Users/mac/docker/nginx/log:/var/log/nginx \
-v /Users/mac/docker/nginx/html:/usr/share/nginx/html \
-d nginx:latest

nginx 启动成功!在本地 /Users/mac/docker/nginx/html 地址下放一个 phpinfo.php 文件,查看一下当前的 php-fpm 信息。

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »