可从 Internet 访问的 gunicorn 反向代理

gunicorn reverse proxy accessible from internet

我配置了 nginx 和 gunicorn 来为 flask 应用程序提供服务。我用这个命令启动了 gunicorn gunicorn --bind 0.0.0.0:5000 wsgi:app 我的网站可以通过我提供的 ip 地址在端口 80 上访问。但是它也可以在端口 5000 上访问。看来我的反向代理可以正常工作,但是 gunicorn 服务器也可以访问。

我打算禁用端口 5000,但不确定这是解决此类问题的正确、安全的方法。

这是我的 nginx 配置文件:

server {

  server_name <my_ip_adress>;
  access_log /var/log/nginx/domain-access.log;

  location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Forwarded-For  $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 10;
    proxy_read_timeout 10;

    # This line is important as it tells nginx to channel all requests to port 5000.
    # We will later run our wsgi application on this port using gunicorn.
    proxy_pass http://127.0.0.1:5000/;
  }

}

您将 gunicorn 绑定到 0.0.0.0 因此它可以在外部接口上使用。假设这只是一个盒子,而是:

gunicorn --bind 127.0.0.1:5000 wsgi:app

这不再监听来自外部接口的请求,这意味着所有请求都必须通过 nginx。

当然,如果你做了 将 gunicorn 绑定到 0.0.0.0,你可以使用 iptables 制定防火墙规则,以丢弃从外部接口到该端口的流量。

如果您使用的是云提供商,他们可能会在他们的平台上本地实现此防火墙功能 - 例如,AWS EC2 上的安全组将允许您创建一个 'webserver' 组,该组仅允许端口 80 的流量通过& 443.