Nginx

Nginx 和 Gunicorn ’err_conn_refused’,但 nginx 沒有記錄錯誤

  • August 2, 2016

我一直在為本地項目使用 Django Cookie Cutter,並希望將它放在我的 DO Droplet 上作為半生產暫存環境。

該伺服器使用 Nginx 反向代理設置到各種項目,其中一些使用 Gunicorn,一種使用裸 Flask,另一種使用 uWSGI。每個項目都有自己的 virtualenv。

在部署和設置項目時,我遇到以下一系列錯誤。

Nginx conf 如下(它反映了這個 droplet 上的其他站點):

server {
       server_name test.myserver.com;

       access_log off;

       location /static/ {
           alias /var/www/myproject/static/;
       }

       location / {
               proxy_pass http://127.0.0.1:8085;
               proxy_set_header X-Forwarded-Host $server_name;
               proxy_set_header X-Real-IP $remote_addr;
               add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
       }
   }

在第一個實例中,在重置 nginx 並且沒有設置 Gunicorn 之後,這個“有效”/符合我的預期:拋出 502 Bad Gateway 錯誤,並且 nginx 日誌註釋:

2016/02/25 11:27:25 [error] 21217#0: *275 connect() failed (111: Connection refused) while connecting to upstream, client: my.ip.address, server: test.myserver.com, request: "GET / HTTP/1.1", upstream:$

好的,所以,開始 Gunicorn:

/var/www/test.myserver.com/env/bin/gunicorn -b 127.0.0.1:8085 myproject.wsgi:application &

(從包含 manage.py 的文件夾執行) - 這會在瀏覽器中引發 400 Bad Request;gunicorn 伺服器註釋(當我 ssh 進入並且可以看到時):

[Django] ERROR: Invalid HTTP_HOST header: u'127.0.0.1:8085'.You may need to add u'127.0.0.1' to ALLOWED_HOSTS.

有道理:django-cookiecutter 將大部分敏感配置放在環境變數中。我的 .env 文件(我已經檢查過它在 shell 中可用)如下所示:

TERM=xterm-256color
SHELL=/bin/bash
SSH_CLIENT=my.ip.address 57044 22
OLDPWD=/var/www/myproject/env
SSH_TTY=/dev/pts/0
USER=root
VIRTUAL_ENV=/var/www/myproject/env
MAIL=/var/mail/root


PATH=/var/www/treatout/env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
       PWD=/var/www/treatout/env/bin
       LANG=en_US.UTF-8
       PS1=(env)${debian_chroot:+($debian_chroot)}\u@\h:\w\$ 
       SHLVL=1
       HOME=/root
       LOGNAME=root
       SSH_CONNECTION=82.23.204.106 57044 178.62.47.176 22
       _=/usr/bin/env

如果我導出DJANGO_ALLOWED_HOSTS=127.0.0.1(映射到 Django 設置中的 ALLOWED_HOSTS 的 env 變數)或其他任何內容(字元串,而不是字元串,萬用字元,列表),它似乎完全破壞了某些東西,並且我在瀏覽器中收到'ERR_CONN_REF'錯誤,並且瀏覽器 URL 切換從 test.myserver.com 到 127.0.0.1:8085 (很明顯它沒有連接,我沒有在我的本地主機上的那個埠上執行伺服器。)

Nginx 日誌中沒有任何內容(我預計這里基本上會出現上游錯誤),而且 Gunicorn 從未看到該請求。它似乎也沒有(奇怪地)顯示在 nginx 訪問日誌中。

我也嘗試將包含我所有變數的 env.example 重命名為 .env,但它似乎沒有太大區別。

我顯然錯過了一些東西,但不確定是什麼,並且正在努力調試;其他站點執行正常,nginx 一般不受影響。嘗試unset DJANGO_ALLOWED_HOSTS 已將其從 .env 中刪除,但在重置 nginx 後我仍然遇到問題。

編輯:我回到了最後一個“工作”配置(即拋出 400 Bad Request 和記錄的東西)只刪除和重建 virtualenv;我真的不想多次這樣做,因為有很多依賴項並且需要相當長的時間!

第二次編輯:在使用django-environ檢查環境設置時,導出命令似乎弄亂了格式:

env('DJANGO_ALLOWED_HOSTS')
'my.server.ip.address:127.0.0.1'

這看起來不對,不應該用逗號分隔嗎?我覺得這是以前輸入的正確命令,所以相當不確定如何在這裡繼續……

當您不使用 Heroku 或 Docker 時,這種特殊情況的答案與 production.py 設置文件和環境設置之間缺乏連接有關。(取自第 490 期

我的問題是雙重的:允許的主機格式錯誤,由不正確地連接字元串引起,需要輸入:

“在您的設置文件(例如common.py)中,您可以像這樣閱讀它:)env.read_env(ROOT_DIR('.env')取決於您將副本放在哪裡。”

這樣做立即使(先前設置的)環境變數對 shell 和程序都可用。我不會討論由於無休止的 faffing 而導致的連鎖錯誤,那是另一回事了。:)

過了一會兒編輯:有一個相關的問題 - 在該站點的 nginx conf 文件中(在sites-available)我必須添加

proxy_set_header Host $http_host; 確保傳遞了正確的主機名;這可以防止在某些情況下發生重定向到本地主機。

因此,我的整個站點文件現在是:

server {
       server_name myservernamehere.com;

       access_log off;

       location /static/ {

           alias /var/www/mysitename/mysitename/mysitename/static/;
       }

       location / {
               proxy_pass http://127.0.0.1:8085;
               client_max_body_size 20M;
               proxy_set_header Host $http_host;
               proxy_set_header X-Forwarded-Host $server_name;
               proxy_set_header X-Real-IP $remote_addr;
               add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
       }
   }

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