关于如何在生产服务器上部署nginx+uwsgi+django,最近遇到了不少坑啊,不过总算解决了,不用通过开发服务器进行访问了。
下面就把最近遇到的坑说一说,同时捋一遍流程。
声明,所有操作实在ubuntu服务器上进行的。
django
安装django
1 | sudo pip install django sudo easy_install django |
以上两种方法都可以,建议不要用apt-get
那个版本太低了,会出现不可预计的错误。
创建django项目
在目录/root/dev/
下面执行命令1
django-admin startproject myproject
那个myproject
换成自己的项目名.
然后进入/root/dev/myproject
下,创建一个应用1
python manage.py startapp myapp
然后就是编写djiango
的代码了。这里就不多说了。网上很多教程的。
使用开发服务器运行
关于如何调试django项目,只要在/root/dev/myproject
下执行1
python manage.py runserver 0.0.0.0:8000
uwsgi
安装uwsgi
1 | sudo apt-get install python-dev sudo pip install uwsgi |
建议也不要使用apt-get
那个版本也是过低,出现了不可预知的错误。
运行uwsgi
然后在app
目录下创建一个文件wsgi.py
,即/root/dev/myproject/myapp/wsgi.py
在文件中写入:1
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
application = get_wsgi_application()
注意要修改你的项目名。
完成后,便可以通过uwsgi
去跑django
1
uwsgi --http :8000 --chdir /root/dev/myproject --module myapp.wsgi
当我们访问网站的时候发现我们的静态资源全部找不到了,这里我们就要用到nginx
了。
当然我们之后要使用unix socket
去代替它的端口,因为它要和nginx
进行通信。
nginx
安装nginx
1 | sudo apt-get install nginx |
安装完成后可以访问127.0.0.1
来查看是否启动。
配置文件
然后在项目的根目录/root/dev/myproject/
下建立一个nginx
的配置文件myproject.conf
,在配置文件中写入:1
# myproject.conf
# @InnerAc
# the upstream component nginx needs to connect to
upstream myproject {
server unix:///root/dev/myproject/myapp.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 8000;
# the domain name it will serve for
server_name 127.0.0.1; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /root/dev/myproject/media; # your Django project's media files - amend as required
}
location /static {
alias /root/dev/myproject/static; # your Django project's static files - amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass myproject;
include uwsgi_params; # the uwsgi_params file you installed
}
}
需要修改哪里,大家应该也能看的出来,然后将这个配置文件复制或者软链接到/etc/nginx/sites-enabled
下。我是复制的,因为我软链接过去好像有时有用,有时没用。1
sudo ln -s /root/dev/myproject/myproject.conf /etc/nginx/sites-enabled
或者
sudo cp /root/dev/myproject/myproject.conf /etc/nginx/sites-enabled
然后重启nginx
1
sudo /etc/init.d/nginx restart
Start
配置好nginx
后,通过上面那个socket
去启动uwsgi
1
uwsgi --socket myapp.sock --module myapp.wsgi --chmod-socket=666
一定要给666
权限,否则会报错的。报错信息在/var/log/nginx/error.log
查看。
至此我们的生产服务器就部署完成了。
当然,也可以写一个xml
文件来方便启动。
xml启动uwsgi
创建一个django.xml
在项目根目录下:1
<uwsgi>
<socket>/root/dev/myproject/myapp.sock</socket>
<chdir>/root/dev/myproject</chdir>
<module>myapp.wsgi</module>
<chmod>666</chmod>
</uwsgi>
然后通过:1
uwsgi -x django.xml
启动。
PS
有人说,一定要用sock么?,我的回答是,可以不用,如果不用的话,仍然可以访问网站,但是你可以看一下你的静态资源的地址是不是就变了。