让Gunicorn在80端口上运行

dis*_*dng 13 python http gunicorn

我用烧瓶制作了一个API.我的应用程序没有任何静态资产,因此我没有理由使用nginx.

我希望在80号港口上运行枪炮.

我有一个"部署脚本":

mkdir .log 2> /dev/null
DEBUG=0 gunicorn -b 0.0.0.0:80 backend:app --access-logfile .log/access.log --error-logfile .log/general.log
Run Code Online (Sandbox Code Playgroud)

我希望在80号港口用枪炮authbind.我在这里遵循了这个指南.

请注意,我能够运行 authbind python -m SimpleHTTPServer 80

当我试图跑authbind ./deployment.run 80,

我看到以下错误:

2013-04-25 15:32:55 [24006] [ERROR] Can't connect to ('0.0.0.0', 80)
2013-04-25 15:33:08 [24018] [INFO] Starting gunicorn 0.17.4
2013-04-25 15:33:08 [24018] [ERROR] Retrying in 1 second.
2013-04-25 15:33:09 [24018] [ERROR] Retrying in 1 second.
2013-04-25 15:33:10 [24018] [ERROR] Retrying in 1 second.
2013-04-25 15:33:11 [24018] [ERROR] Retrying in 1 second.
2013-04-25 15:33:12 [24018] [ERROR] Retrying in 1 second.
Run Code Online (Sandbox Code Playgroud)

任何想法为什么我无法将gunicorn绑定到端口80?

有什么建议?

Uku*_*kit 26

如果您使用的是类似Unix的环境,则端口<1024(如80)将需要超级用户权限.

  • 是不是authbind的全部目的是覆盖它? (3认同)

bha*_*man 9

您可以使用authbind它来实现此目的。安装authbind

sudo apt-get install authbind
Run Code Online (Sandbox Code Playgroud)

然后使用 auth bind 修改 80 端口,确保 80 端口可以被非超级用户(又称无超级用户权限)使用。您可以使用以下三个命令来实现此目的。

sudo touch /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80
sudo chown USER /etc/authbind/byport/80
Run Code Online (Sandbox Code Playgroud)

USER - 可以是系统上的任何用户,例如 bhatman、ubuntu 或 ec2-user。

注意:只需将 80 更改为任何所需的端口,它将适用于任何端口。我的朋友,请负责任地使用它。:)

现在你的gunicorn命令看起来像这样:

authbind gunicorn -c gunicorn.conf wsgi:app
Run Code Online (Sandbox Code Playgroud)

authbind只需在您的gunicorn命令之前添加即可

奖励:如果您在gunicorn之前使用一些命令,例如newrelic等,那么您需要在authbind之后添加 --deep 标志

authbind --deep newrelic-admin run-program gunicorn -c gunicorn.conf wsgi:app
Run Code Online (Sandbox Code Playgroud)

有关 authbind 的更多信息请查看其 ubuntu 联机帮助页:此处

但在盲目运行这些命令之前,我建议您阅读以下几点。

  1. Gunicorn 是一个应用程序服务器,并不意味着直接在那里处理请求,最好在 Nginx 或 AWS ALB 等 Web 服务器后面使用它。
  2. 小于 1024 的端口是特权端口,不应像这样打开或使用,您应该有充分的理由在此类端口上运行应用程序。

NGINX 不是gunicorn 的必需品,您可以使用任何Web 服务器。你的架构应该总是这样的。

WEB SERVER (NGINX, AWS ALB etc) -> APPLICATION SERVER (Gunicorn, uWsgi etc) -> Application (Flask, Django etc)
Run Code Online (Sandbox Code Playgroud)

希望这对您有帮助。


rmu*_*unn 5

尝试将authbind放入您的部署脚本中,例如:

mkdir .log 2> /dev/null
DEBUG=0 authbind gunicorn -b 0.0.0.0:80 backend:app --access-logfile .log/access.log --error-logfile .log/general.log
Run Code Online (Sandbox Code Playgroud)

然后运行./deployment.run 80

(此外,您的脚本似乎没有使用任何参数;也许80$1?替换了您的脚本)