django,uWSGI,nginx的环境搭建(下)(依然渣翻)

于是这部分是昨天那半的后续。说起来,居然昨天发现了这个blog的bug……幸好是自己写的,控制力十足,不然满篇404还真是受不了—-话说我这是在自吹自擂吧?然后,过几天把feed加上吧,当时为了偷懒没做这玩意。话说这东西怎么做……另外,有推荐的android上的rss阅读器么?然后,听说《我妻同学是我的嫁》日文有40多话,网上有分流么,我去追更去了,果然倚仗汉化组还是不靠谱的—-当然他们翻译的水准还是挺高的……

托福的文章看得蛋疼,经常逛逛course之类的在线教学平台会有什么裨益么?话说还有GRE……


正文:

基本的nginx测试

请先重启您的nginx:

sudo /etc/init.s/nginx restart 当然对于我(译者),我必须指出的一点是,这个命令不是对每个发行版都适用,比如arch的肯定不是这个。我的意见是,您最好去看看对应发行版的wiki。

然后现在确认media文件是否正在被服务器正确地处理。您需要访问 http://example.com:8000/media/media.png,如果能正确地取得资源,那么至少证明了您的配置基本上是没问题的。

(译注:这里有可能出现的错误—至少我遇见过的,第一是浏览器报错找不到页面,那么一定是您的nginx配置有问题。第二是出现403错误,这样的话,请确认一下您文件的权限,以及文件夹的权限。当然如果是localhost这样的本地测试环境,您大可以用777测试一下)

这个测试不仅仅是重启了nginx—-重启的意义在于,关闭了nginx然后又打开了nginx,这个过程中,如果有错误的话,nginx会提示,并且指示哪里弄错了。

nginx,uWSGI以及test.py

现在我们来让nginx运行test.py应用,从而说出'Hello World'。

uwsgi --socket :8001 --wsgi-file test.py

这个和前面的挺像,除了其中一个参数不太一样。

socket :8001:使用协议uwsgi,使用端口8001

nginx会根据配置让uWSGI在指定端口运行,然后给外界8000端口从而进行通信。

运行 http://example.com:8000/去确认一下吧。

然后现在我们的工作链是这样的:

the web client <-> the web server <-> the socket <-> uWSGI <-> Python

同时,你也可以通过访问http://example.com:8001去查看uwsgi,但是有可能,这玩意压根没工作—-原因是你浏览器请求的是http数据而不是uWSGI。所以你应该在终端中查看一下来自uWSGI的输出。

使用unix套接字代替端口通信

上面我们使用的是TCP端口套接字进行通信,因为很简单。但是,更好的选择是使用unix套接字—-它消耗更少的资源。

编辑您的mysite_nginx.conf,修改server的配置:

server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)

然后重启您的nginx。

(译注:这里的socket file可以放在任何路径—-嘛,当然高权限路径还是不推荐的—-并不是必须放在工程中。放在/tmp有可能也是不错的选择,不管怎么着吧,当你推出uwsgi的时候,这个文件是会被自动删除的,不用担心有残留什么的……)

然后重启您的uWSGI:

uwsgi --socket mysite.sock --wsgi-file test.py

这次,–socket这个参数,告知了uWSGI,哪一个文件应该被使用。

试试访问http://example.com:8000/

如果不能访问……

查看您nginx的error log(/var/log/nginx/error.log).如果你见到这样的内容:

connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission denied)

那么意味着,你需要更改socket的权限以便nginx访问。

使用下面的命令行应该就可以了:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)

当然如果您觉得666太洒脱,改成664也无不可。

也有可能,您需要把您自己加入进nginx组—-总之吧,您需要确定nginx有足够的权限可以写入和读取您给出的套接字文件。

让nginx的日志在终端中输出也是个不错的主意,这样您可以能容易在错误发生的时候找到问题。

使用uswgi和nginx运行django应用

现在运行我们的django应用吧:

uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664

现在,输出不是hello world了吧?而是熟悉(?)的django已经在运行的提示。

配置uWSGI到.ini文件中

建一个叫做mysite_uwsgi.ini的文件吧。

然后把这些弄进去,我会说说坑的……

# mysite_uwsgi.ini file
[uwsgi]

# django会用到的一些设置
# 基本目录 (full path)
chdir           = /path/to/your/project
# Django's wsgi file
module          = project.wsgi
# the virtualenv (full path)
home            = /path/to/virtualenv

# process-related settings
# master
master          = true
# 最大工作进程
processes       = 10
# the socket (use the full path to be safe
socket          = /path/to/your/project/mysite.sock
# 权限
chmod-socket    = 664
# 离开时清除环境
vacuum          = true

基本上,这个文件和以前那些在命令行直接给的配置差不了多少。特别说明的是基本目录chdir。这个目录是你项目的第一层目录。怎么知道是第一层目录?cd到这个路径,然后运行python,试试 import project.wsgi(当然project是你自己项目的名字。),如果成功,那么就是这个了。另外要说的是,最好不要有中文,上面之所以有,是因为那是我翻译的,ini到底有中文能不能正常运行,鬼才知道。所以,最好不要出现中文。

运行它吧:

uwsgi --ini mysite_uwsgi.ini # the --ini option is used to specify a file

正如预料的那样,django运行良好。

在系统范围内安装uWSGI

上面的uWSGI,我们是安装在虚拟环境中的—-当然也许您没有,那么跳过这里吧。现在,您希望它安装在系统中。

先退出虚拟环境(如果你在的话)。

deactivate

然后像以前那样安装就好。

然后运行也是一样的。

皇帝模式(Emperor mode)

uWSGI可以运行一种叫做皇帝模式的……模式。在这种模式中,uWSGI会注意到uWSGI配置文件夹的动静,然后对每一个,会生成一个vassals实例。

如果一个配置文件夹被更改了,emperor会自动重启vassals。

具体的话,这样做:

# create a directory for the vassals
sudo mkdir /etc/uwsgi
sudo mkdir /etc/uwsgi/vassals
# symlink from the default config directory to your config file
sudo ln -s /path/to/your/mysite/mysite_uwsgi.ini /etc/uwsgi/vassals/
# run the emperor
uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data

然后以sudo运行uwsgi:

sudo uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data

选项意义:

emperor:配置文件夹

uid:运行进程的用户id

gid:运行组的组id

确认一下站点,它本应是正在运行着的。

……

让uWSGI在系统启动时启动

最后一步是让uwsgi在每次系统启动的时候自动启动。

编辑 /etc/rc.local 然后加上:

/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data

记住添加的位置是在 exit 0那行之前。

然后……就没有然后了……

(译注:后面的个人用不上,感觉也没什么用,大致就是劝你去更深入地读文档……恩,就是这样,所以我偷懒了,就这样就好……)

今天没什么想说的,就这样吧。

以上。