项目开发完毕后,需要将代码放到服务器上,这样用户才能访问。接下来我们一步一步来进行一波部署操作
打包上传代码
项目开发完毕,在部署之前需要再配置文件中将 ALLOWED_HOSTS配置设置为:当前服务器IP或*,如:
ALLOWED_HOSTS = ["*",]
这个配置就是允许别人通过哪个ip访问你,*表示所有ip
上线时还要将配置中的DEBUG改为False
不同系统如何传代码
windows:
yum install lrzsz
压缩zip包,拖进来。
mac:
scp /home/xx/s8day145.zip root@192.11.11.11:/data/
在真正的线上环境应该从git上拖代码
安装Python3
a. 下载Python:https://www.python.org/ftp/python/3.5.4/ b. 解压 tar -xvf Python-3.5.4.tgz c. cd Python-3.5.4 d. 先装依赖: - yum install openssl-devel - yum install sqlite-devel e. 编译安装 - ./configure - make - make install /usr/local/bin python3 f. 安装django
pip3 install django==1.11.7
第一版本上线:简单粗暴
进入python程序目录
python3 manage.py runserver 0.0.0.0:8000
uwsgi
Django框架运行依赖wsgi(本质提供socket服务端),众多模块实现了wsgi规范,而django框架中默认使用wsigiref模块来实现,他由于性能比较低,所以用于本地开发和测试,而线上部署时需要使用uwsgi来代替
在服务器上安装uwsgi
pip3 install uwsgi
单文件使用uwsgi
在服务器上编写一个Python文件app.py:
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]
在服务器上执行命令启动Web服务器:
uwsgi --http :9001 --wsgi-file app.py # 或 uwsgi --http :9002 --wsgi-file app.py --master --processes 4 # 启动4个进程
PS: flask需要再加 --callable app
uwsgi --http :9002 --wsgi-file app.py --callable app
django程序
方式一
uwsgi --http :9003 --chdir /data/s8day145/ --wsgi-file s8day145/wsgi.py # chdir进入后面的项目目录 然后wsgi-file找到项目中的wsgi.py文件
方式二
可以看到上面的方法参数很多,我们可以将参数写到一个文件中
s8day145_uwsgi.ini [uwsgi] http = 0.0.0.0:9005 chdir = /data/s8day145/ wsgi-file = s8day145/wsgi.py processes = 4 # 进程数 static-map = /static=/data/s8day145/allstatic # 静态文件的目录
启动时
uwsgi --ini s8day145_uwsgi.ini
此时访问时,会出现找不到静态文件的错误。
想要uwsgi处理静态文件,需要先将django的静态文件收集到制定目录,然后再设置对应关系。
收集django静态文件
- 在django的配置文件中添加:STATIC_ROOT = os.path.join(BASE_DIR,"allstatic")
- 执行 python3 manage.py collectstatic 命令,至此django项目所有相关静态文件都会收集到制定目录。
设置uwsgi静态文件对应关系
- uwsgi --http :9005 --chdir /data/oldboy/ --wsgi-file oldboy/wsgi.py --master --processes 4 --static-map /static=/data/oldboy/allstatic
第三版本上线:uwsgi + nginx
nginx作用:
- 处理静态文件
- 反向代理
- 负载均衡(LVS、haproxy)
uwsig作用:
- 处理动态请求
nginx配置文件
user root; worker_processes 4; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; include /etc/nginx/mime.types; default_type application/octet-stream; upstream django { server 127.0.0.1:8001; server 127.0.0.1:8002; } server { listen 80; charset utf-8; # max upload size client_max_body_size 75M; location /static { alias /data/s8day145/allstatic; } location / { uwsgi_pass django; include uwsgi_params; } } }
uwsgi配置:/data/s8day145/
s8day145_uwsgi_8001.ini [uwsgi] socket = 127.0.0.1:8001 chdir = /data/s8day145/ wsgi-file = s8day145/wsgi.py processes = 1 s8day145_uwsgi_8002.ini [uwsgi] socket = 127.0.0.1:8002 chdir = /data/s8day145/ wsgi-file = s8day145/wsgi.py processes = 1
启动
nginx: /etc/init.d/nginx start /bin/systemctl restart nginx.service /bin/systemctl start nginx.service /bin/systemctl stop nginx.service uwsgi: uwsgi --ini s8day145_uwsgi_8001.ini & uwsgi --ini s8day145_uwsgi_8002.ini &
如果进程挂了,supervisor帮助你自动将服务重新启动
supervisor是一个对进程管理的软件,可以帮助我们启动uwsgi并维护(uwsgi进程关闭时,自动将其启动起来)
安装
yum install supervisor
配置/etc/supervisord.conf
[program:s8day145] command=/usr/local/bin/uwsgi --ini /data/s8day145/s8day145_uwsgi_8001.ini ;命令 priority=999 ; 优先级(越小越优先) autostart=true ; supervisord启动时,该程序也启动 autorestart=true ; 异常退出时,自动启动 startsecs=10 ; 启动后持续10s后未发生异常,才表示启动成功 startretries=3 ; 异常后,自动重启次数 exitcodes=0,2 ; exit异常抛出的是0、2时才认为是异常 stopsignal=QUIT ; 杀进程的信号 stopwaitsecs=10 ; 向进程发出stopsignal后等待OS向supervisord返回SIGCHILD 的时间。若超时则supervisord将 使用SIGKILL杀进程 user=root ; 设置启动该程序的用户 log_stdout=true ; 如果为True,则记录程序日志 log_stderr=false ; 如果为True,则记录程序错误日志 logfile=/var/log/cat.log ; 程序日志路径 logfile_maxbytes=1MB ; 日志文件最大大小 logfile_backups=10 ; 日志文件最大数量
启动
systemctl start supervisord.service
公司正式上线流程
公司中的部署步骤及负责人: - 开发提交代码 - 测试人员开始测试 - 运维人员进行上线 使用软件:jenkins+自己写脚本,运维人员点点点。 - 从git上啦代码到一个服务器,在该服务器上对代码进行编译(c/vue/java) - 通过以下工具 将代码同步到每台服务器上 - saltstack - ansible - 执行命令启动程序