在部署django开发的站点时,通常有两种选择方式,nginx+django+uwsgi或者django+nginx+gunicorn,本文不讨论apache方式,在linux下通常都使用nginx,速度快,还经常做代理服务器,功能强大。。 nginx+django+uwsgi个人觉得uwsgi配置较为麻烦,所以选择了gunicorn,一个开源Python WSGI UNIX的HTTP服务器,据说速度快(配置快、运行快)、简单,默认是同步工作,支持Gevent、Eventlet异步,支持Tornado。有兴趣可以自行查阅官方文档
需要在服务器端安装我们所需要的环境nginx Python nginx gunicorn… django等站点需要的依赖将不进行介绍
在ubuntu上支持apt-get 直接安装,其他系统请自行搜索安装方式
$ sudo apt-get install nginx
gunicorn只是一个Python的库 这里建议使用pip安装,简单方便 ps:要么网络好,要么建议更改pip源为豆瓣源
$ sudo pip install gunicorn
注:
其实也很简单,要想简单的跑起来只需要更改几个配置文件即可 首先请把你的django站点放在服务器合适的地方
一般网站都配置在80端口上,域名默认解析到80端口,所以nginx配置文件如下,在更改nginx的配置文件之前建议把默认文件进行备份,以备后续出现问题参照使用 打开nginx配置文件/etc/ningx/sites-enable/default 进行修改为如下内容:
server {
listen 80;
server_name 192.168.84.199;
server_name_in_redirect off;
access_log /home/webserver/web/nginx.access.log;
error_log /home/webserver/web/nginx.error.log;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_pass_header Authorization;
proxy_pass_header WWW-Authenticate;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static/ {
root /home/webserver/web/WebServer/;
}
核心配置文件就上述那么多,重点使将请求转发到django的服务器上
注:
gunicorn启动一般有两种方式,可以在项目目录下建立gunicorn.conf.py配置文件,也可以在启动gunicorn时直接加上相关命令
INSTALLED_APPS = [
...
...
'gunicorn', # 部署用
]
import multiprocessing
bind = "127.0.0.1:8000" #绑定的ip与端口
workers = 2 #核心数
errorlog = '/home/xxx/xxx/gunicorn.error.log' #发生错误时log的路径
accesslog = '/home/xxx/xxx/gunicorn.access.log' #正常时的log路径
#loglevel = 'debug' #日志等级
proc_name = 'gunicorn_project' #进程名
如还需要其他配置,可以自行查看官方文档
gunicron需要启动后需要长期运行在后台,如果直接启动会在关闭终端后进程就被杀死,这肯定不是我们的需求,所以这里给出两种解决方式
使用配置文件方式
$ sudo nohup gunicorn 项目名.wsgi:application -c /home/xxx/xxx/gunicorn.conf.py&
[program:x508server]
command=gunicorn x508server.wsgi:application -b 0.0.0.0:8000 ; 被监控的进程路径
directory=/home/webserver/web/WebServer/ ; 执行前要不要先cd到目录$
autostart=true ; 随着supervisord的启动而启动
autorestart=true ; 自动重启。。当然要选上了
startretries=10 ; 启动失败时的最多重试次数
exitcodes=0 ; 正常退出代码
stopsignal=KILL ; 用来杀死进程的信号
stopwaitsecs=10 ; 发送SIGKILL前的等待时间
redirect_stderr=true ; 重定向stderr到stdout
stdout_logfile=/home/webserver/web/logfile.log ; 指定日志文件
; 默认为 false,如果设置为 true,当进程收到 stop 信号时,会自动将该信号发给该进$
stopasgroup=true ; send stop signal to the UNIX process
; 默认为 false,如果设置为 true,当进程收到 kill 信号时,会自动将该信号发给该进$
killasgroup=true ; SIGKILL the UNIX process group (def false)
server {
listen 80;
server_name 192.168.84.199;
server_name_in_redirect off;
access_log /home/webserver/web/nginx.access.log;
error_log /home/webserver/web/nginx.error.log;
index login.html;
root /home/webserver/web/html/WebHtml/;
location / {
try_files $uri $uri/ =404;
}
location /apis {
rewrite ^.+apis/?(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8000;
proxy_pass_header Authorization;
proxy_pass_header WWW-Authenticate;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /admin {
proxy_pass http://127.0.0.1:8000;
proxy_pass_header Authorization;
proxy_pass_header WWW-Authenticate;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static/ {
root /home/webserver/web/WebServer/;
}
# 收集app静态文件到项目目录使nginx能访问到
STATIC_ROOT = os.path.join(BASE_DIR, "static")
# 执行python manage.py collectstatic
STATICFILES_FINDERS = (
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder"
)
然后在终端中进入项目目录在终端执行:
$ python manage.py collectstatic
将会自动将app中所含有的静态文件自动收集到项目的setting目录下,解决了某些app,比如admin在部署后找不到静态文件的现象
注: