26

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

我希望在 80 端口上运行 gunicorn。

我有一个“部署脚本”:

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

我希望在 80 端口上运行 gunicorn 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.

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

有什么建议吗?

4

3 回答 3

43

如果您在类似 unix 的环境中,端口 < 1024(如 80)将需要超级用户权限。

于 2013-04-25T22:41:22.403 回答
14

尝试将 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

然后运行./deployment.run 80

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

于 2013-04-25T23:15:46.597 回答
5

您可以使用authbind来实现这一点。安装 authbind

sudo apt-get install authbind

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

sudo touch /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80
sudo chown USER /etc/authbind/byport/80

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

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

现在您的 gunicorn 命令将如下所示:

authbind gunicorn -c gunicorn.conf wsgi:app

只需authbind在您的 gunicorn 命令之前附加

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

authbind --deep newrelic-admin run-program gunicorn -c gunicorn.conf wsgi:app

有关 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)

希望这对您有所帮助。

于 2020-05-14T16:15:09.083 回答