Nginx

nginx、docker 和 gunicorn url,url 中沒有埠號

  • March 27, 2019

我有一個也使用 gunicorn 和 nginx 的 django 應用程序。我可以使用http://url:8000訪問我的網站,但我不知道如何正確配置它,所以我根本不必使用 url 中的埠號,即http:// urlhttp://url:8000相同。

這是我的 docker-compose.yml:

version: '3.2'

services:
 immweb:
   restart: always
   build: .
   expose:
     - "8000"
   command: gunicorn smn_imm.wsgi:application --bind 0.0.0.0:8000
   volumes:
     - type: volume
       source: smnvol
       target: /etc/smn_imm/smnvol
   ports:
     - "8000:8000"

 nginx:
   build: nginx
   depends_on:
     - immweb

nginx.conf:

upstream smn_imm {
   server web:8000;
}

server {

   listen 80;
   server_name smn-imm;

   location / {
       proxy_pass http://smn_imm;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       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_redirect off;
   }

}

您還沒有為該nginx服務打開任何埠。聽起來當你擊球時,http://url:8000你實際上是在直接擊中 gunicorn 容器。

在您的 nginx 配置中,我將完全刪除上游塊,並在您的proxy_pass行中指定 gunicorn 埠。但是,這應該指向 gunicorn 容器的 DNS 名稱(immweb如指定)。有關原因的更多資訊,請參閱本指南

server {
   listen 80;
   server_name smn-imm;
   location / {
       proxy_pass http://immweb:8000;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       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_redirect off;
   }
}

然後您需要更新撰寫文件:

version: '3.2'

services:
 immweb:
   restart: always
   build: .
   command: gunicorn smn_imm.wsgi:application --bind 0.0.0.0:8000
   volumes:
     - type: volume
       source: smnvol
       target: /etc/smn_imm/smnvol

 nginx:
   build: nginx
   depends_on:
     - immweb
   ports:
    - "80:80"

請注意,我添加了一個外部埠映射,但nginx刪除了. 請參閱我連結的文件中關於和之間區別的部分:ports``expose``immweb``HOST_PORT``CONTAINER_PORT

網路服務到服務的通信使用 CONTAINER_PORT。當 HOST_PORT 被定義時,服務也可以在 swarm 之外訪問。

現在連接到http://smn-imm/您的瀏覽器,它應該可以工作。如果這不是您打算用於服務的主機名,則server_name在 nginx 配置中更新,和/或配置您的 DNS。

顯然不要將其提供給網際網路,另一個反向代理應該終止 SSL,或者使用 SSL 證書配置您的 nginx 容器,並公開埠 443。

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