我想知道之前是否有人使用 uwsgi 和 nginx 来服务高负载 django 站点。如果是这样,他们有什么问题吗?
我无法理解部署使用 uwsgi/gunicorn 的 Django 项目的“正确”方法是什么(我还没有决定使用什么,可能是 uwsgi,因为它具有更好的性能和建议?)和 nginx 使用码头工人。
我看到有些人把所有东西都放在同一个容器里。我不是 docker 的专家,但容器应该只做一 (1) 件事。因此,拥有 Django + nginx 似乎是 2 而不是 1。
现在,我的部署想法是:
有没有其他方法可以做到?有没有更深入地介绍这种情况的教程。我需要一个可靠的产品,而不仅仅是在我的电脑上测试一些代码。
我正在通过 EC2 Ubuntu 14.04 LTS 在 uWSGI 上运行 Python Flask 服务器。服务器配置如下:
[uwsgi]
http-socket = :9000
plugin = python
wsgi-file = /path/to_wsgi.py
enable-threads = true
Run Code Online (Sandbox Code Playgroud)
但是,日志是使用没有读取访问权限的 root 权限创建的:
$ ls -ltrh /var/log/uwsgi/app
total 34M
-rw-r----- 1 root root 2.3M Jun 4 06:50 reporter-uwsgi.log.2.gz
-rw-r----- 1 root root 24M Jun 5 06:51 reporter-uwsgi.log.1
-rw-r----- 1 root root 8.4M Jun 5 17:27 reporter-uwsgi.log
Run Code Online (Sandbox Code Playgroud)
这是一个烦恼,因为我的一些脚本以普通用户身份运行并解析这些日志。
知道如何配置 uWSGI 以使用全局读取权限写入吗?
这看起来像是 Nginx+uWSGI 超时的一个众所周知的问题,但我的设置不同,我找不到有关它的信息。
我在 uWSGI 上运行 Flask 应用程序,使用 http 协议(不是套接字)。当我查询 API 时,有时会收到错误消息:
uwsgi_response_write_body_do() TIMEOUT !!!
IOError: : write error
Run Code Online (Sandbox Code Playgroud)
我在“工作时间”收到它的频率更高,即在晚上不那么频繁。我正在查询长 JSON 数据(地理坐标,最多 50 MB),有时我根本没有得到响应,有时我得到了部分响应。这些是来自 Pythonrequests请求的错误:
requests.exceptions.ConnectionError: ('Connection aborted.', error(104, 'Connection reset by peer'))
requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))
ValueError: Expecting object: line 1 column 5590371 (char 5590370)
ValueError: Unterminated string starting at: line 1 column 20998536 (char 20998535)
ValueError: end is out of bounds
# when I set `timeout=None` in Python
requests.exceptions.ReadTimeout: HTTPConnectionPool(host='mydomain.com', port=80): …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Ubuntu 12.04 上启动 uWSGI。
在$ sudo service uwsgi start或 时# uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/file.ini,我收到以下错误:
opendir(): No such file or directory [uwsgi.c line 471]
第一个调用将此错误记录到/var/log/uwsgi,第二个调用将此错误输出到stdout。
怎么了?
好的,我在我的服务器上设置了 Django、nginx 和 uWSGI……问题是我通过以下命令手动启动了 uWSGI:
uwsgi -s /home/user/sites/sock/uwsgi.sock -t 10 -M -p 1 -C --pythonpath /home/user/sites/ -w mysite.django_wsgi
而且效果很好。我想做的是使用 supervisord 来控制 uWSGI 进程(启动、停止等)。我将如何做到这一点,supervisord 配置会是什么样子?
是否可以将 Nginx 配置为代理到 uwsgi 服务器 ( ),如果 uwsgi 服务器不可用,则uwsgi_pass回退到标准 http 代理 ( )?proxy_pass
我的开发环境在给定端口上作为标准 HTTP 服务器运行,但在生产中它将在 uWSGI 套接字下运行。我希望能够开发我的应用程序,然后(仍在我的开发机器上)在 uwsgi 服务器下启动应用程序进行测试,而不必每次都切换我的 nginx 配置。如果 nginx 可以配置为尝试使用 uwsgi_pass,但如果出现错误(因为 uwsgi 服务器未运行),则回退到 proxy_pass,那将是理想的选择。
我还可以看到这在生产环境中很方便:通常,只需代理到本地 uwsgi 套接字,但如果由于某种原因不起作用(对于不起作用的某些任意定义),则代理到其他地方的某些辅助 http 服务器。不过,目前对我来说只是为了让开发更方便。
问题有点长!让我用下面的例子来解释。一世
有一个/etc/logrotate.d/用于 uwsgi的日志轮换配置文件:
"/var/log/uwsgi/*.log" "/var/log/uwsgi/*/*.log" {
copytruncate
daily
rotate 5
compress
delaycompress
missingok
notifempty
}
Run Code Online (Sandbox Code Playgroud)
假设我有大约 12 个 uwsgi 模块,我想保留一个 uwsgi 应用程序日志文件比其他模块多,所以我有如下配置:
/var/log/uwsgi/app/MY_APP.log {
daily
missingok
rotate 60
compress
delaycompress
notifempty
create 0640 www-data adm
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是我应该如何像上面那样创建日志轮换并保留*其他 11 个模块。我不想用相同的配置创建 11 个日志轮换,我应该怎么做才能只覆盖一个模块?
我最近有了一台 Ubuntu 18 服务器,至少可以说我有点困惑。
第一:如果我运行sudo service nginx start或sudo systemctl start nginx,一切似乎都有效。我的网站加载,并且都sudo service nginx status和sudo systemctl status nginx返回的所有明确的信息。
现在的问题是:当我重新启动我的服务器时,nginx不会自动启动,因为网站没有被加载。我试过sudo systemmctl enable nginx又试了一次重新启动。同样,nginx由于网站未加载而未运行。
事实上,如果我重新启动我的服务器sudo reboot然后sudo service nginx status或者sudo systemctl status nginx我收到一条错误消息。尽管有错误消息,但我可以运行sudo service nginx start或者sudo systemctl start nginx它会全部恢复工作。
我收到的错误消息如下:
(venv) user@server:/data/project$ sudo systemctl status nginx
? nginx.service - A high performance web server and a reverse proxy server
Loaded: …Run Code Online (Sandbox Code Playgroud)