Nginx

在 docker 容器中使用反向代理 Nginx

  • July 15, 2021

因此,嘗試使用 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 進行重定向;不是你的程式碼。

引用自:https://serverfault.com/questions/1069645