本地主機反向代理失敗 nginx AWS Ubuntu
我正在嘗試在 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 版本。我希望它對這個問題的任何人都有幫助。