项目部署(Python3 + ubuntu 16.04(ali server) + Nginx + uWSGI + Django 1.11)
提前知识
Runserver是一个单进程单线程的服务器,是一个非常基础非常low的服务器,常用于测试,和开发。并发性非常差,可以说是完全高并发废物的服务器。
Nginx
负责静态文件的服务和反向代理。其实也就是一个中间件。
正向代理客户端(类似VPN),反向代理服务器。
生动介绍:
同学1为客户端 同学2 为nginx 同学3为服务端uwsgi
同学1 同学2 同学3
同学1问同学3借钱,同学1让同学2向同学3借钱给同学1,同学2问同学3有没有100。 说白了就是同学2转发,帮同学1(客户端)转发消息给同学3,消息传到同学2再回去同学1。这个是正向代理。
同学1打电话叫同学3出来打球,同学二给了同学3的电话号码给同学1知道,就是代理的同学3.。这个是反向代理,
Uwsgi、gunicorn
提供动态页面的服务。
一个是协议wsgi 一个是服务器Uwsgi 都不一样的
Uwsgi完美解决runserver的不足,支持高并发。
Django的主要部署平台就是WSGI,它也是Python的标准web服务器和应用。
uWSGI是实现了WSGI的工具,我们需要下载和安装它。
uWSGI的官网地址:https://uwsgi-docs.readthedocs.io/en/latest/index.html
版本最好是最新版本的。
Settings里面的debug提供静态服务功能(图片,等等等)
settings:
Debug=True
Debug=False // 真实部署 只做擅长的事情,已经有很多开源的服务器阿帕奇,nginx等等 runserver只是做测试
如果没有设置为False,django就不会为我们提供静态文件的服务
则会暴露接口,接下来的漏洞你懂的。别人会利用你这个接口进行恶心操作,密钥,数据库配置信息全部暴露出来。所以404页面要自己定义。(为了安全着想)
生成requirements.txt文件
在xshell里面生成requirements.txt 文件(将项目里面的包,存放到requirements.txt文件中)
pip freeze > requirements.txt
上传到服务器
方法一:
可以使用xshell连接阿里云服务器,通过rz命令将本地项目目录压缩为zip后,上传到服务器
在阿里云服务器上,使用uzip解压项目压缩文件
uzip你的项目压缩文件.zip
方法二:
可以使用提供的ssh连接工具,将项目目录发送到服务器家目录中
scp -r 你的项目目录 服务器用户名@服务器ip: ~/ -p ssh服务端口
安装python3以及虚拟环境
安装python3、virtuawrapper 都可以查看官方文档安装,这里省略
创建虚拟环境
mkvirtualenv 虚拟环境的名字
安装项目相关包
workon 虚拟环境名字
需要重新对requirements.txt文件中每一个版本仔细检查是否版本不对等等问题,再去修改
pip install -r requirments.txt
UWSGI安装以及测试
# 安装uwsgi pip install uwsgi # 测试uwsgi是否安装成功: # test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"] # python3 #return ["Hello World"] # python2 # 运行uwsgi: uwsgi --http :8000 --wsgi-file test.py # 测试uwsgi运行是否正常: curl 127.0.0.1:8000 测试访问 http://192.168.216.137:8000/
1uwsgi 配置
在项目根目录中创建deploy目录,新建uwsgi_conf.ini文件。 [uwsgi] 使用nginx连接时使用,Django程序所在服务器地址 选择阿里内网IP和端口 socket=192.168.216.137:8001 项目根目录 chdir= 阿里云上的项目 项目中wsgi.py文件的相对目录 wsgi-file= django里面wsgi文件 (是nginx和wsgi沟通桥梁) 进程数 processes=2 线程数 threads=2 uwsgi服务器的角色 master=True 存放进程编号的文件 pidfile= uwsgi.pid 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。以前的runserver是依赖终端的 daemonize= 要自己设置log 目录紧跟着chdir
指定虚拟环境所在目录,不能填相对目录 virtualenv= 找出配置本次项目的虚拟环境地址
2启动uwsgi
换到deploy目录中,创建logs文件夹,用于存放日志文件
启动uwsgi
uwsgi --ini uwsgi_conf.ini &
停止uwsgi
uwsgi --stop uwsgi.pid
nginx配置
1、安装nginx
sudo apt install nginx
2,启动nginx,查看启动状态,如果启动状态未active,则代表启动成功
sudo systemctl start nginx && sudo systemctl status nginx
3,默认开启80端口,可以查看一下是否提供web服务
curl -I 192.168.216.137
4,管理命令
项目配置
创建/etc/nginx/conf.d/nginx_conf.conf文件:
upstream pro_mysite { # 此处为uwsgi运行的ip地址和端口号 server 192.168.216.137:8005; } server { # 监听端口 listen 80; # 服务器域名或者ip地址 server_name 192.168.216.137; # 编码 charset utf-8; # 文件最大上传大小 client_max_body_size 75M; # 媒体文件 location /media { alias /home/pyvip/pro_mysite/media; } # 静态文件 location /static { alias /home/pyvip/pro_mysite/static; } # 主目录 location / { uwsgi_pass pro_mysite; include /etc/nginx/uwsgi_params; } } # 修改sudo vim /etc/nginx/nginx.conf # 第一行开头修改用户,将www-data改为你当前的用户 创建 Nginx 运行使用的用户 www: user pyvip; etc /nginx /conf.d / 把配置的nginx配置文件放进去 # 测试nginx配置文件是否正确, sudo nginx -t -c /etc/nginx/nginx.conf # 打印如下内容,则没问题 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # 重新加载配置 sudo nginx -s reload -c /etc/nginx/nginx.conf
查看nginx 进程
ps -e | grep nginx
# 杀进程PID sudo pkill -9 nginx # 查端口 netstat -a # 查看指定端口 netstat -ap | grep 8000