Django + Nginx + Gunicorn 部署
一、前期准备
1、版本
- Ubuntu 18
- python 3.6.5
- Django 1.11.12
- Nginx 1.14.0
- Gunicorn 19.9.0
- gevent 1.4.0
2、安装(服务器)
1、安装nginx
sudo apt install nginx
2、安装python3(已经安装请忽略)
# ubuntu 18 自带的就是3.6.5 其它Ubuntu版本的请使用命令安装
sudo apt update
sudo apt install python3.6
3、安装pip(已经安装请忽略)
sudo apt-get install python3-pip
4、安装虚拟环境
sudo pip install virtualenv
二、Django项目
1、修改相关配置
1、关闭debug,修改hosts
#在Django的settings配置文件中将DEBUG,ALLOWED_HOSTS
DEBUG = False
#设置允许访问的ip地址,*代表所有,也可以写具体的ip地址
ALLOWED_HOSTS = [ '*' ]
2、修改数据连接,如图所示
3、将静态资源打包
使用命令 collectstatic
4、导出项目所依赖的库到项目根目录
pip freeze > requirements.txt
2、项目上传
1、注意
最好将本地项目复制一份,然后将项目下的虚拟环境删除
2、在windows下可以使用图形化界面工具WinScp或者Xshel
scp -r 本地项目根目录绝对路径 服务器用户名@服务器ip地址:上传服务器的目录
3、linux或者mac使用命令
scp -r 本地项目根目录绝对路径 服务器用户名@服务器ip地址:上传服务器的目录
例如:scp /home/xxx/work/PycharmProjects/DjangoDeployExample [email protected]:/home/www/django
3、连接远程服务器创建虚拟环境
1、说明
由于python兼容性的问题,不建议在全局环境中部署,而且一个服务器有可能部署多个项目,所以推荐在虚拟环境中部署
连接远程服务器
ssh 用户名@IP地址 -p 端口号(默认80)
2、安装虚拟环境
扫描二维码关注公众号,回复:
6637133 查看本文章
sudo pip install virtualenv
3、创建虚拟环境
# 在项目的根目录(建议),也可以在其他地方均可
cd /home/www/django
# 创建虚拟环境,名字随意
virtualenv venv
4、激活虚拟环境
source .venv/bin/activate
4、导入虚拟环境
使用pip
pip install -r requirement.txt
三、Gunicorn
1、安装
1、在项目的虚拟环境安装gunicorn
# 如果下载速度过慢使用国内源
pip3 install gunicorn -i https://pypi.douban.com/simple
2、在项目的虚拟环境中安装gevent
# 基于协程的库,提高并发量
pip3 install gevent -i https://pypi.douban.com/simple
2、通过Gunicorn启动项目
2.1、命令启动(不推荐)
1、命令
# 常见的参数
gunicorn -w 10 -k 'gevent' -b 0.0.0.0:9000 DjangoDeployExample.wsgi:application --reload -t 500 -D --access-logfile logs/gunicorn.log
2、参数说明
2.2、通过配置文件启动(常用)
1、创建gunicorn.conf文件
# 并行工作进程数
workers = 4
# 指定每个进程的线程数
threads = 2
# 监听内网端口8000
bind = '192.168.58.44:8000'
# 设置守护进程(linux有效)
daemon = 'true'
# 工作模式协程
worker_class = 'gevent'
# 设置最大并发量
worker_connections = 2000
# 设置进程文件目录
pidfile = '/home/xxx/work/DjangoDeployExample/product/gunicorn//gunicorn.pid'
# 设置访问日志和错误信息日志路径
accesslog = '/home/xxx/work/DjangoDeployExample/product/gunicorn/logs/gunicorn_acess.log'
errorlog = '/home/xxx/work/DjangoDeployExample/product/gunicorn/logs/gunicorn_error.log'
# 设置日志记录水平
loglevel = 'error'
2、启动
gunicorn -c gunicorn.conf DjangoDeployExample.wsgi:application
3、注意
注意用户权限问题,比如pid文件 访问日志 errorlog 如果权限不够可以给目录授权一下
四、nginx
1、说明
本教程是通过命令安装,一般默认安装在/etc/nginx/,下载安装包的安装的可以根据自己的目录来配置,具体的一些细节这里不介绍,具体请自行查询
注意:在系统的命令窗口中使用,上面都是在虚拟环境下使用
2、命令介绍
1、查看nginx是否启动
ps aux|grep nginx
2、检查nginx配置文件是否有错
# -t 测试 nginx的配置文件
sudo nginx -t xxx/xxx/nginx.conf
3、通过配置文件启动
sudo nginx -c xxx/xxx/nginx.conf
4、关闭nginx
nginx -s stop
# 其它方式
sudo pkill -9 nginx
3、反向代理
1、nginx.conf配置文件
不建议直接修改nginx的配置文件,最好复制一份通过指定配置文件启动
# 用户 用户名 用户组
user zhangwei zhangwei;
#设置值和CPU核心数一致
worker_processes auto;
# 全局错误日志 (注意权限)
error_log /home/xxx/work/PycharmProjects/DjangoDeployExample/product/nginx/logs/error.log;
# pid文件所在目录 (注意权限)
pid /home/xxx/work/PycharmProjects/DjangoDeployExample/product/nginx//nginx.pid;
# events块配置
events {
# 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
use epoll;
# 单个work进程允许的最大连接数,默认为512
worker_connections 65535;
}
# http块配置
http {
# 文件扩展名与文件类型映射表。设定mime类型(邮件支持类型),类型由mime.types文件定义
#
include /etc/nginx/mime.types;
#默认文件类型,默认为text/plain
default_type application/octet-stream;
# http模块的的访问日志
access_log /home/zhangwei/work/PycharmProjects/DjangoDeployExample/product/nginx/logs/access.log;
# #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
#(sendfile系统调用不需要将数据拷贝或者映射到应用程序地址空间中去)
sendfile on;
# 连接超时时间,默认为75s,可以在http,server,location块
keepalive_timeout 65;
server {
listen 80;
# 有域名的话绑定域名,没域名写ip地址
server_name www.hello.com;
# 全局错误的界面
error_page 404 /404.html;
# 反向代理的路径(和upstream绑定),location后面设置映射的路径
location / {
# 注意代理的ip地址一定要和gunicorn里的端口一致
proxy_pass http://192.168.58.44: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 {
alias /home/xxx/work/PycharmProjects/DjangoDeployExample/static;
# 过期30天,静态文件不怎么更新,过期可以设大一点,
# 如果频繁更新,则可以设置得小一点。
expires 30d;
}
# 多媒体资源等文件 路径
location /media {
alias /home/xxx/work/PycharmProjects/DjangoDeployExample/media/;
# 过期30天,静态文件不怎么更新,过期可以设大一点,
# 如果频繁更新,则可以设置得小一点。
expires 30d;
}
}
}
2、本案例直接将nginx放在工程下
sudo nginx -c xxx/xxx/nginx.conf
3、注意
- 一定要注意文件的权限问题日志 pid文件的权限问题
- 代理的ip地址一定要和gunicorn里的端口一致
- mime.types注意引入的路径,因为不是修改默认的nginx配置文件