Nginx
在 docker 容器中使用反向代理 Nginx
因此,嘗試使用 docker 將 Nginx 設置為反向代理 - 我有三個節點 js 容器(一個前端和兩個後端服務),前端服務呼叫兩個後端服務。所以我希望 nginx 重定向到前端(這是 Web 應用程序),但每次我嘗試發送一些東西時,我都會收到 502 bad gateway 錯誤。當我直接執行到 docker 容器中時,我可以通過 dns_hostname 或 ip 地址(我從 docker inspect 獲取)ping 其他容器這是我的 docker-compose 和我的 nginx.conf 的編輯版本
version: "3.8" services: frontend: image: frontend hostname: frontend env_file: /.env networks: - network restart: on-failure expose: - "3000" container_name: frontend backend-service-01: image: backend-service-01 hostname: backend-service-01 env_file: ./backend-service-01/.env networks: - network restart: on-failure container_name: backend-service-01 backend-service-02: image: backend-service-02 hostname: backend-service-02 env_file: ./backend-service-02/.env networks: - network restart: on-failure container_name: backend-service-02 nginx-proxy: image: nginx:stable-alpine hostname: nginx-proxy networks: - network restart: on-failure volumes: - /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf - /data/nginx/certs/crt_file.crt:/etc/nginx/crt_file.crt - /data/nginx/certs/priv_key.key:/etc/nginx/priv_key.key:ro ports: - 80:80 - 443:443 container_name: nginx-proxy depends_on: - frontend - backend-service-01 - backend-service-02 networks: network:
這裡也是我正在使用的 nginx conf 文件:
worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 1024; } http { upstream frontend { server frontend:3000; } server { # Listen Directive on Port 443 (TLS) listen 443 ssl; listen [::]:443 ssl; ssl_certificate /etc/nginx/crt_file.crt; ssl_certificate_key /etc/nginx/priv_key.key; # Where we store our error.log and access.log error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; location / { root /usr/src/app/public/; proxy_pass https://frontend; } } }
我幾乎已經做了所有事情來排除網路問題,因為我可以從 nginx 容器內部 ping ip 地址和前端 docker 主機名(使用 docker exec -it nginx-proxy sh)是否有人有任何建議接下來要嘗試什麼,或者如果我做錯了什麼,他們可以清楚地看到,我們將不勝感激。
問題已解決 - 問題既不是 Docker 也不是 Nginx。問題是一位前開發人員試圖提供幫助,但從長遠來看最終讓我們大吃一驚。他們在他們的程式碼中創建了一個重定向,如果有人試圖使用 HTTP 協議,它會自動重定向到 HTTPS 協議,一旦我們註釋掉這幾行討厭的程式碼並重建容器,驚喜,驚喜…… Nginx 照原樣做了告訴。經驗教訓:讓 Nginx 進行重定向;不是你的程式碼。