正确使用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
如果您使用pip,请先安装python-dev:
sudo apt-get install python-dev
sudo pip install uwsgi
现在,你不再需要在ini文件中使用plugins=python
了。
注意到了pip前面的sudo了吗?是的,uwsgi应该被安装在全局系统中。
如果你忘记在这里使用sudo,那么你可能会将其安装在虚拟环境中。
这没有意义,而且你可能会在运行时遇到麻烦。
使uwsgi成为守护进程
守护进程意味着让uwsgi在系统启动时以及后台运行。
根据你安装uwsgi的方式,有两种方法。
apt-get方式
当你在Ubuntu上安装uwsgi时通过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管理的服务。
pip
如果你是通过pip安装uwsgi的,那么你只有可执行文件位于 /usr/local/bin/uwsgi
,你需要自己将其变成守护进程。
当你打开/etc/init.d/
下的一些文件时,你可能会感到难过:
我只想注册uwsgi作为一个服务,为什么我需要编写这么长的脚本,看起来与其他脚本类似?这没有意义。
好消息是,在Upstart的帮助下很简单,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的emperor模式,这非常方便和强大。
现在,您可以在/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
表示“example”。您不需要用真实名称替换它,uwsgi将为您完成此操作。
然后重新启动或重新加载uwsgi:
sudo service uwsgi restart
检查您的套接字文件:
ll /tmp/*.sock
如果您看到了这段话,那么现在uwsgi已经部署成功啦:)
您网站的nginx配置
以域名example.com为例:
server {
listen 80;
server_name www.example.com;
return 301 $scheme:
}
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:
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
就这些!