正确使用uwsgi
在 ubuntu 服务器上使用 uwsgi 部署 django 站点非常简单,但是在出错之前你还是需要了解一些事情。
安装
在 ubuntu 上安装 uwsgi 有两种方法:apt-get 或 pip
apt-get
如果使用apt-get,需要安装python插件:
sudo apt-get install uwsgi-plugin-python
sudo apt-get install uwsgi
并且,在您网站的 uwsgi ini 文件中,您需要添加以下内容:
plugins=python
点
如果使用pip,需要先安装python-dev:
sudo apt-get install python-dev
sudo pip install uwsgi
而且,您不再需要 ini 文件中的 plugins=python。
看到 pip 之前的 sudo 了吗?是的,uwsgi 应该安装在全局系统中。
如果你错过了这里的 sudo,你可以将它安装在你的 virtualenv 中。
它没有意义,您可能无法运行它。
守护 uwsgi
Daemonize 意味着使 uwsgi 在系统启动时和后台运行。
根据你安装uwsgi的方式,有两种方式。
apt-get
当您在 ubuntu 上 apt-get install uwsgi 时,它会自动安装为服务。神奇之处在于这个文件:
/etc/init.d/uwsgi
/etc/init.d 中的文件将由 sysvinit 加载。然后你可以像这样管理你的 uwsgi 服务:
sudo /etc/init.d/uwsgi start|stop|restart|reload
或:
sudo service uwsgi start|stop|restart|reload
service命令可以找到sysvinit管理的服务
点
如果你的uwsgi是pip安装的,你只有/usr/local/bin/uwsgi里面的可执行文件,需要自己去守护。
当您打开/etc/init.d/中的一些文件时,您可能会感到难过:
我只是想将uwsgi注册为服务,为什么我需要写这么长的脚本,看起来和其他的很相似?这没有意义。
好消息是,在 Upstart 的帮助下,它非常简单,它是 sysvinit 的替代品。它使用/etc/init/ 而不是/etc/init.d/。
只需创建一个文件/etc/init/uwsgi.conf,内容如下:
description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals/ --logto /var/log/uwsgi.log
然后,您可以像这样管理您的 uwsgi 进程:
sudo initctl start|stop|restart|reload| uwsgi
或者,还是这样:
sudo service uwsgi start|stop|restart|reload
是的,如您所见,service 命令很智能,它可以使用相同的命令管理来自 sysvinit 和 Upstart 的服务。
如果你同时拥有/etc/init.d/uwsgi 和/etc/init/uwsgi.conf,当你说:
sudo service uwsgi restart
它将重新启动 Upstart 文件 /etc/init/uwsgi.conf。
sysvinit 将被忽略,或类似的东西。
为您的站点配置uwsgi
推荐大家使用 pip 和 Upstart 方式,比 apt-get 方式好很多。
如果是这样,你使用的是uwsgi的帝王模式,非常好用,功能强大。
现在,您可以像这样在/etc/uwsgi/vassals/ 中创建一个ini文件:
[uwsgi]
virtualenv=/path/to/venv/
chdir=/path/to/proj/root
module=wsgi:application
env=DJANGO_SETTINGS_MODULE=settings
master=True
vacuum=True
socket=/tmp/%n.sock
pidfile=/tmp/%n.pid
daemonize=/var/log/uwsgi/%n.log
%n 表示您的文件名。例如,我的项目名称是'example',我为它创建了一个example.ini 文件。然后%n 表示“示例”。你不需要用真实姓名替换它。 uwsgi 会为你做这件事。
然后重启或者重新加载uwsgi:
sudo service uwsgi restart
检查您的套接字文件:
ll /tmp/*.sock
如果它在那里,你现在使用 uwsgi 成功了:)
您网站的 nginx 配置
以域名example.com为例:
server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80;
charset utf-8;
server_name example.com;
location /static/ {
alias /path/to/static/;
}
location /media/ {
alias /path/to/media/;
}
location / {
try_files $uri @django;
}
location @django {
uwsgi_pass unix:///tmp/example.sock;
include uwsgi_params;
}
}
重启nginx,你会看到你的站点!
回答你的问题
你的 uwsgi 配置文件是 /etc/init/uwsgi-server.conf
所以,你应该使用的名字是uwsgi-server,而不是uwsgi
你需要像这样重启你的 uwsgi Emperor 实例:
sudo initctl restart uwsgi-server
或:
sudo service uwsgi-server restart
就是这样!