一、前期准备工作
1、版本
- Ubuntu 18
- python 3.6.5
- Django 1.11.12
- Nginx 1.14.0
- Gunicorn 19.9.0
- gevent 1.4.0
2、安装(服务器)
- nginx
sudo apt install nginx
- 安装python3(已经安装请忽略)
# ubuntu 18 自带的就是3.6.5 其它Ubuntu版本的请使用命令安装 sudo apt update sudo apt install python3.6
- 安装pip(已经安装请忽略)
sudo apt-get install python3-pip
- 安装虚拟环境
sudo pip install virtualenv
二、Django项目
1、修改相关配置
-
关闭debug,修改hosts
image -
修改数据连接, 例如下图所示
image - 将静态文件打包
image
使用命令collectstatic
image
收集完成之后如下图所示
image - 导出项目所依赖的库到项目根目录
pip freeze > requirements.txt
- 注意
一定要确保你的项目在本地运行没有问题,否则在服务器终端下出了问题对于新手来说不好解决
2、项目上传
- 注意
最好将本地项目复制一份,然后将项目下的虚拟环境删除 - 在windows下可以使用图形化界面工具WinScp或者Xshel
scp -r 本地项目根目录绝对路径 服务器用户名@服务器ip地址:上传服务器的目录
- linux或者mac使用命令
scp -r 本地项目根目录绝对路径 服务器用户名@服务器ip地址:上传服务器的目录
scp /home/xxx/work/PycharmProjects/DjangoDeployExample test@192.168.0.112:/home/www/django
3、连接远程服务器创建虚拟环境
- 说明
由于python兼容性的问题,不建议在全局环境中部署,而且一个服务器有可能部署多个项目,所以推荐在虚拟环境中部署 - 连接远程服务器
ssh 用户名@IP地址 -p 端口号(默认80)
- 安装虚拟环境
sudo pip install virtualenv
- 创建虚拟环境
# 1.在项目的根目录(建议),也可以在其他地方均可 cd /home/www/django # 创建虚拟环境,名字随意 virtualenv venv
- 激活虚拟环境
imagesource .venv//bin/activate
4、导入虚拟环境
- 使用pip
pip install -r requirement.txt
三、Gunicorn
1、安装
- 在项目的虚拟环境安装gunicorn
# 如果下载速度过慢使用国内源 pip3 install gunicorn -i https://pypi.douban.com/simple
- 在项目的虚拟环境中安装gevent
# 基于协程的库,提高并发量 pip3 install gevent -i https://pypi.douban.com/simple
2、通过Gunicorn启动项目
2.1、命令启动(不推荐)
- 命令
# 常见的参数 gunicorn -w 10 -k 'gevent' -b 0.0.0.0:9000 DjangoDeployExample.wsgi:application --reload -t 500 -D --access-logfile logs/gunicorn.log
- 参数说明
参数 说明 备注 -w 10 开启10个进程 根据服务器配置来定 -k 'gevent' 使用gevent异步模式,提高了响应速度。 必须先安装好gevent -b 0.0.0.0:9000 表示绑定ip地址和端口 DjangoDeployExample.wsgi:application settings.py文件同级目录的wsgi.py中 这里使用的是相对路径 -–reload 监听到项目文件变动自动重启gunicorn 生效 -D 让命令后台执行 如果想看命令错误可不要 -t 500 配置每个请求的超时时间为500秒 –access-logfile logs/gunicorn.log 将请求日志保存到该文件中 logs目录必须创建 -
示例图
image
image - 备注
详细参数,请看其他附录
2.2、通过配置文件启动(常用)
- 创建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'
- 启动
gunicorn -c gunicorn.conf DjangoDeployExample.wsgi:application
- 注意
- 注意用户权限问题,比如pid文件 访问日志 errorlog 如果权限不够可以给目录授权一下
四、nginx
1、说明
本教程是通过命令安装,一般默认安装在
/etc/nginx/
,下载安装包的安装的可以根据自己的目录来配置,具体的一些细节这里不介绍,具体请自行查询注意:在系统的命令窗口中使用,上面都是在虚拟环境下使用
2、命令介绍
- 查看nginx是否启动
imageps aux|grep nginx
- 检查nginx配置文件是否有错:
# -t 测试 nginx的配置文件 sudo nginx -t xxx/xxx/nginx.conf
- 通过配置文件启动
sudo nginx -c xxx/xxx/nginx.conf
- 关闭nginx
nginx -s stop # 其它方式 sudo pkill -9 nginx
3、反向代理
- 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; } } }
- 本案例直接将nginx放在工程下
sudo nginx -c xxx/xxx/nginx.conf
- 注意
- 一定要注意文件的权限问题日志 pid文件的权限问题
- 代理的ip地址一定要和gunicorn里的端口一致
- mime.types注意引入的路径,因为不是修改默认的nginx配置文件
五、附录
1、gunicorn详细参数
命令 | 简写 | 参数类型 | 说明 |
---|---|---|---|
--config | -c | 字符串 | 配置文件路径,路径形式的字符串格式 |
--bind | -b | ip地址 | 绑定服务器套接字 |
--workers | -w | 整型 | 用于处理工作进程的数量,为正整数,默认为1。worker 推荐的数量为当前的CPU个数*2 + 1 |
--backlog | 整型 | 等待服务的客户的数量, 必须是正整数,一般设定在64~2048的范围内 | |
--worker-class | -k | 字符串 | 要使用的工作模式,默认为sync 可选值 gevent tornado |
--threads | 整型 | 处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1 | |
--worker-connections | 整型 | 最大客户端并发数量,默认情况下这个值为1000 | |
max_requests | 整型 | 超过这么多秒后工作将被杀掉,并重新启动。一般设定为30秒 | |
--timeout | -t | 整型 | |
--keep-alive | 整型 | `连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间 | |
--limit-request-line | 整型 | HTTP请求行的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。值是0~8190的数字。此参数可以防止任何DDOS攻击 | |
--limit-request-fields | 整型 | 限制HTTP请求中请求头字段的数量。此字段用于限制请求头字段的数量以防止DDOS攻击,与limit-request-field-size 一起使用可以提高安全性。默认情况下,这个值为100,这个值不能超过32768 |
|
--limit-request-field-size | 整型 | 限制HTTP请求中请求头的大小,默认情况下这个值为8190。值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制 | |
--reload | 无 | 代码更新时将重启工作,默认为False。此设置用于开发,每当应用程序发生更改时,都会导致工作重新启动。 | |
--check-config | 布尔 | 显示配置文件信息 | |
--chdir | 路径 | 切换到指定的工作目录 | |
--daemon | -D, | 布尔 | 守护Gunicorn进程,默认False |
-pid | -p | 文件 | 设置pid文件的文件名,如果不设置将不会创建pid文件 |
--worker-tmp-dir DIR | 路径 | 设置工作临时文件目录,如果不设置会采用默认值 | |
--access-logfile | 文件 | 要写入的访问日志目录 | |
--error-logfile | 文件 | 要写入错误日志的文件目录 | |
--log-file | 文件 | 要写入日志的文件目录 |
网友评论