我正在尝试使用 Gunicoron 在托管多个 Nginx Web 服务的服务器上托管 Flask 应用程序。我正在使用 AWS ubuntu 作为测试平台,最终将其托管在所述 Nginx 多个 Web 服务(不是 AWS)上。我一直试图通过将 IP 从外部 AWS 更改为带有套接字 8006 和其他套接字的本地主机 127.0.0.1 来使其处于生产状态。我尝试进行反向代理,但没有成功。我收到 502 Bad Gateway 错误,错误如下:
站点错误日志
2019/06/11 05:08:58 [错误] 9310#9310:*9 connect()连接到上游时失败(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:权限被拒绝)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;
}
}
答案1
好的,我发现了这个问题,所以首先让我们解决 /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% 源自大卫其中也有 Apache 版本。我希望它能帮助大家解决这个问题。