Ubuntu

本地主機反向代理失敗 nginx AWS Ubuntu

  • June 19, 2019

我正在嘗試在 Nginx 上託管多個 Web 服務的伺服器上託管一個帶有 Gunicoron 的 Flask 應用程序。我正在使用 AWS ubuntu 作為測試平台,最終將它託管在所述 Nginx 多重 Web 服務(這不是 AWS)上。我一直在嘗試通過將 IP 從外部 AWS 更改為 localhost 127.0.0.1 以及套接字 8006 以及其他來使其成為生產狀態。我試圖做反向代理但沒有運氣。我收到 502 Bad Gateway 錯誤並出現以下錯誤:

站點錯誤日誌

2019/06/11 05:08:58

$$ error $$9310#9310:*9 連接()失敗(111:連接被拒絕)同時連接到上游,客戶端:162.155.112.131,伺服器:127.0.0.1,請求:“GET /favicon.ico HTTP/1.1”,上游:“ http ://127.0.0.1:8006/favicon.ico ”,主機:AWS

錯誤日誌:

2019/06/11 05:08:08

$$ emerg $$9311#9311: open() “/run/nginx.pid” 失敗 (13: Permission denied) 2019/06/11 05:08:25$$ warn $$9313#9313: 無法建立最佳proxy_headers_hash,你應該增加proxy_headers_hash_max_size: 512 或proxy_headers_hash_bucket_size: 64; 忽略 proxy_headers_hash_bucket_size

這是複制的程式碼。我嘗試展示我所做的事情,同時使其可重現

/etc/nginx/sites-available/Flask

upstream tester {
   server 127.0.0.1:3306;
}
server {
   listen 80;
   server_name 127.0.0.1;
   listen [::]:80;
   listen 443 ssl;
   location / {
       include proxy_params;
#       proxy_pass 34.215.33.211;
#       proxy_pass http://unix:/tmp/Flask.sock;
       proxy_pass http://127.0.0.1:8006;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
   location ^~ /static/  {
       rewrite ^/static$ / break;
       rewrite ^/static/(.*) /$1 break;
       include  /etc/nginx/mime.types;
       proxy_pass http://127.0.0.1:8009;
       }

}

/etc/nginx/nginx.conf(僅限虛擬主機)

  ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

請並感謝您在這個問題上幫助我。

編輯:http://unix:/tmp/Flask.sock適用於我的 AWS 上的代理傳遞,但不適用於生產伺服器

編輯 2:現在我還觸發了 500 個錯誤,如下所示:

768 worker_connections are not enough while connecting to upstream, client: 127.0.0.1, server: [AWS] request: "GET /favicon.ico HTTP/1.0"

/etc/nginx/sites-available/Flask 的程式碼現在如下:

upstream gnx{
       server  127.0.0.1:8006;
}
server {
   listen 80;
   server_name [AWS URL];
   listen [::]:80;
   listen 8006;
   listen [::]:8006;
   listen [::1];
   access_log /var/log/nginx/site_access.log;
   error_log /var/log/nginx/site_error.log;

   location / {
       include proxy_params;
#        proxy_pass http://unix:/tmp/Flask.sock;
       proxy_pass http://gnx;
       proxy_redirect off;
   }
   location ^~ /static/  {
       #root  /home/ubuntu/Flask/static/;
       #proxy_pass http://gnx;

       proxy_redirect http://127.0.0.1:8006/static/ http://$host/static/;
       proxy_set_header SCRIPT_NAME /static;
       }

   location /docs  {
       alias /home/ubuntu/Flask/docs;
}
}

好的,我找到了問題,所以首先讓我們解決 /sites-available/Flask(或 /default)文件

upstream gnx{
       server  127.0.0.1:8006;
}
server {
   listen 80;
   server_name [AWS URL];
   listen [::]:80;
   listen [::1];
   access_log /var/log/nginx/site_access.log;
   error_log /var/log/nginx/site_error.log;

   location / {
       include proxy_params;
#        proxy_pass http://unix:/tmp/Flask.sock;
       proxy_pass http://gnx;
      proxy_set_header X-SCRIPT-NAME "/";
   }
   location ^~ /static/  {
       #root  /home/ubuntu/Flask/static/;
       #proxy_pass http://gnx;

       proxy_redirect http://127.0.0.1:8006/static/ http://$host/static/;
       proxy_set_header SCRIPT_NAME /static;
       }

   location /docs  {
       alias /home/ubuntu/Flask/docs;
}
}

所以我們不需要監聽 8006 埠,因為我們將使用它們。我們添加的下一部分如下:

proxy_set_header X-SCRIPT-NAME "/";

X-SCRIPT-NAME 允許將 Flask 反向代理重定向到 Flask 腳本。您也可以將它放在 proxy_params 文件 (/etc/nginx/proxy_params) 中,我這樣做了,但我想將它放在腳本中以便它可見。

所以現在,訣竅是實現反向代理。這是您要放入的 Python 程式碼和函式:

from werkzeug.serving import WSGIRequestHandler
class ScriptNameHandler(WSGIRequestHandler):
   def make_environ(self):
       environ = super().make_environ()
       script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
       if script_name:
           environ['SCRIPT_NAME'] = script_name
           path_info = environ['PATH_INFO']
       if path_info.startswith(script_name):
           environ['PATH_INFO'] = path_info[len(script_name):]
       scheme = environ.get('HTTP_X_SCHEME', '')
       if scheme:
           environ['wsgi.url_scheme'] = scheme
       return environ

最後,對於您的 app.run 文件,您希望將其切換為以下內容:

app.run(request_handler=ScriptNameHandler)

現在為您執行反向代理並進行設置。這種方法 99.9% 來自David,David 也有 Apache 版本。我希望它對這個問題的任何人都有幫助。

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