12

我成功地在 CentOS 6.x 服务器上安装了 NGINX + uWSGI + Flask

但是在配置方面我还是有一些疑惑:

1)我正在将 NGINX 作为服务运行:
如果我输入“ps aux | grep nginx”,服务 nginx 启动/停止/重新启动,我可以看到 2 个进程:-(
通过用户 root)主进程 /usr/sbin/nginx -c /etc/nginx/nginx.conf
- (由用户 nginx)工作进程
可以吗?

2)我为Flask设置了一个virtualenv并在这样的virtualenv下安装了uWSGI包。
目前,我通过键入“uwsgi /somedir/uwsgi.ini”手动启动 uWSGI,其中 uwsgi.ini 如下:

chdir = /myappdir
uid = pyuser
chmod-socket = 666
socket = /tmp/uwsgi.sock
module = run
callable = app
virtualenv = /myappdir/myvirtualenv

是否可以将 uWSGI 作为服务启动,类似于 NGINX(如第 1 点所述)?这种情况下用户应该是root还是非root?

3)当我启动 uWSGI 时,我目前收到以下警告:

*** Python threads support is disabled. You can enable it with --enable-threads ***

我意识到在“uwsgi.ini”配置文件中还可以配置多个进程和线程。考虑到我正在运行的服务器只有 1 个核心,我可以设置多个进程和线程吗?如果有,有多少?

3b) 在 NGINX 配置文件“/etc/nginx/nginx.conf”上,也可以指定“worker_processes”,默认为 1。我可以增加它,或者它可以高于 1 仅用于多核服务器?

4) 除了禁用线程支持之外,当我启动 uWSGI 时,我也会收到这些警告。他们的意思是什么?

*** WARNING: you are running uWSGI without its master process manager ***
*** Operational MODE: single process ***
*** uWSGI is running in multiple interpreter mode ***
4

2 回答 2

6

我已经从评论中移走了最重要的观点。

  1. 是的,这是正常行为。Nginx 的主进程需要 root 权限来管理机器上的监听套接字。 论坛主题声明您可以更改它,但它可能会导致问题。但是,Nginx 确实允许更改工作进程的所有者。

  2. 这取决于 uWSGI 是如何安装的。如果 uWSGI 是通过安装的,apt-get您可以像这样启动(停止、重新启动)它:

    service uwsgi <action>

    您通过 安装了 uWSGI pip,因此daemonize选项可以解决问题:

    /path/to/uwsgi --daemonize /path/to/logfile

    你可以在任何你想要的用户下启动它,但是如果你决定在 root 下运行它,你应该指定giduid选项。uWSGI 的最佳实践页面说:

    常识:不要以 root 身份运行 uWSGI 实例。您可以以 root 身份启动 uWSGI,但请务必使用 uid 和 gid 选项删除权限。

    另请查看master-as-root选项。

  3. 您可以根据需要创建任意数量的进程和线程,但这应该取决于您尝试处理的请求数(并发或每秒)。您可以在此处阅读相关内容。我会尝试不同的配置并选择哪一种效果更好。

    3b。基本上,worker_processes有助于处理并发请求。看到这个问题。

  4. *警告:您正在运行没有主进程管理器的 uWSGI*

    您没有master在 .ini 文件中指定选项。虽然主进程当然是不必要的,但它非常有用。它有助于有效地控制工人并在他们死后重生。

于 2013-07-12T19:26:31.433 回答
1

3b) 当你的 nginx 消耗大量 CPU 时,你可以使用 multi-core with worker_process.

基本上,Python 应用程序比 nginx 反向代理慢得多。所以一个nginx进程就够了。但是一些 nginx 选项(例如gzip: on;gzip_proxied: any)会消耗一些 CPU。观看 top 命令输出。如果 nginx 进程消耗大量 CPU,可以增加 worker_process。

当使用 nginx 作为反向代理时,worker_process 应该 <= CPU 核心数。

于 2014-12-17T03:17:02.587 回答