Admin

Django部署+服务化进阶
2018年6月11日 16:09 182 3 1 2

操作系统:Centos7 x64 1804
服务:Nginx + uwsgi + djaongo项目

项目文件大致结构,整个项目是放在/projects/目录下:

  1. startblog #项目根目录 上级目录/projects/
  2. --startblog #项目同名目录
  3. ----setting.py
  4. ----wsgi.py
  5. --app_main #app
  6. --app_2

第一步:准备

1.Python环境:python3环境搭建
2.数据库:Mysql-community-server安装
3.防火墙:打开8000端口、80端口
4.代码拷贝到服务器,安装requirement.txt下所有依赖
5.修改setting.py中:ALLOWED_HOSTS = ['*']
6.尝试运行:

  1. python3 manage.py runserver 8000

7.不出意外,应该就能成功运行,并能从浏览器通过 IP地址:8000 访问
8.提取static文件到项目根目录

  1. python3 manage.py collectstatic

第二步:uwsgi

使用uwsgi来承载运行django项目,因为manage.py方式运行效率很低。

1.安装uwsgi:

  1. pip3 install uwsgi
  2. ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

2.在项目根目录下创建文件“uwsgi.ini”

  1. [uwsgi]
  2. socket = :8000
  3. chdir = /projects/startblog
  4. wsgi-file = startblog/wsgi.py
  5. module = startblog.wsgi:application
  6. master = True
  7. processes = 2
  8. threads = 2
  9. chmod-socket = 666
  10. vacuum = True
  11. pidfile = /projects/startblog/uwsgi.pid

3.尝试运行,测试完成使用ctrl+c结束运行:

  1. uwsgi --ini uwsgi.ini

不出意外,也能通过浏览器访问 IP:8000
最后将“uwsgi.ini”文件中socket行取消注释,注释http行(因为uwsgi和nginx通过socked通讯)
至此,uwsgi端就绪,通过命令“uwsgi --ini uwsgi.ini启动并保持

第三步:nginx

不要使用yum仓库中的nginx,配置文件完全不一样,一直配不成功

1.安装nginx

  1. wget http://nginx.org/download/nginx-1.13.7.tar.gz
  2. tar -zxvf nginx-1.13.7.tar.gz
  3. cd nginx-1.13.7
  4. ./configure
  5. make
  6. make install
  7. ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

2.修改nginx配置文件

  1. cd /usr/local/nginx/conf
  2. cp nginx.conf nginx.conf.back
  3. vim nginx.conf
  1. user root; # 修改root运行
  2. #user nobody;
  3. worker_processes 1;
  4. #error_log logs/error.log;
  5. #error_log logs/error.log notice;
  6. #error_log logs/error.log info;
  7. #pid logs/nginx.pid;
  8. events {
  9. worker_connections 1024;
  10. }
  11. http {
  12. include mime.types;
  13. default_type application/octet-stream;
  14. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  15. # '$status $body_bytes_sent "$http_referer" '
  16. # '"$http_user_agent" "$http_x_forwarded_for"';
  17. #access_log logs/access.log main;
  18. sendfile on;
  19. #tcp_nopush on;
  20. #keepalive_timeout 0;
  21. keepalive_timeout 65;
  22. #gzip on;
  23. # 添加新的80端口
  24. server {
  25. listen 80;
  26. server_name localhost;
  27. charset utf-8;
  28. location / {
  29. include uwsgi_params;
  30. uwsgi_pass 127.0.0.1:8000;
  31. }
  32. location /static/ {
  33. alias /projects/startblog/static/;
  34. }
  35. location /media/ {
  36. alias /projects/startblog/media/;
  37. }
  38. }
  39. # 移走老的80
  40. server {
  41. listen 8080;
  42. server_name localhost;
  43. #charset koi8-r;
  44. #access_log logs/host.access.log main;
  45. location / {
  46. root html;
  47. index index.html index.htm;
  48. }
  49. ……

一共三处修改,自上而下分别是修改nginx运行身份为root、添加80端口转发给本机8000端口并且静态文件和Media文件直接通过nginx读取、将之前的80端口项目改成8080(弃用,避免端口冲突)

3.启动nginx

  1. nginx

因为前面已经打开了80端口,就可以直接访问 IP 应该就能看到页面了


进 阶

编写Nginx服务

教程中nginx是通过源代码安装的,没有注册系统服务,将nginx加入系统服务,以便使用systemctl控制

1.修改nginx的conf文件

  1. cd /usr/local/nginx/conf
  2. vim nginx.conf`
  1. ...
  2. pid logs/nginx.pid;

取消注释上述pid行

2.编写服务脚本,注意上面的配置文件中的pid路径是相对于“/usr/local/nginx/

  1. ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
  2. vim /usr/lib/systemd/system/nginx.service

添加文件内容

  1. #nginx服务配置到该文件中
  2. #服务描述性的配置
  3. [Unit]
  4. Description=nginx - high performance web server
  5. Documentation=http://nginx.org/en/docs/
  6. After=network.target remote-fs.target nss-lookup.target
  7. #服务关键配置
  8. [Service]
  9. Type=forking
  10. #pid文件位置
  11. #要与nginx配置文件中的pid配置路径一致,这个很重要,否则会服务启动失败
  12. PIDFile=/usr/local/nginx/logs/nginx.pid
  13. #启动前检测 nginx配置文件 是否正确
  14. ExecStartPre=/usr/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
  15. #启动
  16. ExecStart=/usr/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
  17. #重启
  18. ExecReload=/bin/kill -s HUP $MAINPID
  19. #关闭
  20. ExecStop=/bin/kill -s QUIT $MAINPID
  21. PrivateTmp=true
  22. [Install]
  23. WantedBy=multi-user.target

保存后杀掉后台nginx、用systemctl控制服务

  1. pkill nginx
  2. systemctl daemon-reload
  3. systemctl start nginx
  4. systemctl stop nginx
  5. systemctl enable nginx

参考连接:https://my.oschina.net/taoluoluo/blog/749134

编写Blog服务

类似地,uwsgi启动django项目也可以写入systemctl:

1.查看之前编写的项目下uwsgi.ini

  1. vim /projects/startblog/uwsgi.ini
  1. [uwsgi]
  2. socket = :8000
  3. chdir = /projects/startblog
  4. wsgi-file = startblog/wsgi.py
  5. module = startblog.wsgi:application
  6. master = True
  7. processes = 2
  8. threads = 2
  9. chmod-socket = 666
  10. vacuum = True
  11. pidfile = /projects/startblog/uwsgi.pid # 添加pid文件

末尾一行行就是uwsgi运行时的进程id文件, 注意一定要用绝对路径

2.编写控制脚本

  1. cd /projects
  2. vim blogd

添加文件内容

  1. #!/bin/bash
  2. if [ ! -n "$1" ];then #$1:指该脚本后跟的第一个参数,-n:判断$1是否为非空,!:取相反
  3. echo "Usages: blogd [start|stop|restart]"
  4. exit 0
  5. fi
  6. pro_root=/projects/startblog
  7. do_start(){
  8. nohup /usr/bin/uwsgi --ini $pro_root/uwsgi.ini > $pro_root/uwsgi.log 2>&1 &
  9. echo "Start uwsgi service [OK]"
  10. sleep 3
  11. ps -aux | grep uwsgi
  12. }
  13. do_stop(){
  14. ps -aux | grep uwsgi
  15. pid=`cat $pro_root/uwsgi.pid`
  16. if [ ! $pid ]; then
  17. echo "Pid not found"
  18. else
  19. echo $pid
  20. kill -INT $pid
  21. echo "Stop uwsgi service [OK]"
  22. fi
  23. }
  24. if [ $1 = start ];then
  25. do_start
  26. elif [ $1 = stop ];then
  27. do_stop
  28. elif [ $1 = restart ];then
  29. do_stop
  30. sleep 3
  31. do_start
  32. else
  33. echo "Usages: blogd [start|stop|restart]"
  34. fi
  1. chmod 777 blogd
  2. ln -s /projects/blogd /usr/bin/blogd
  3. ln -s /projects/blogd /usr/sbin/blogd

测试好不好使:

  1. blogd start
  2. blogd stop
  3. blogd restart
  4. ps -aux | grep uwsgi

3.编写服务脚本

  1. ln -s /usr/local/python3/bin/uwsgi /usr/sbin/uwsgi
  2. vim /usr/lib/systemd/system/blog.service

添加文件内容

  1. #uwsgi服务配置到该文件中
  2. #服务描述性的配置
  3. [Unit]
  4. Description=uwsgi web server
  5. Documentation=google.com
  6. After=network.target remote-fs.target nss-lookup.target
  7. #服务关键配置
  8. [Service]
  9. Type=forking
  10. #启动
  11. ExecStart=/usr/sbin/blogd start
  12. #重启
  13. ExecReload=/usr/sbin/blogd restart
  14. #关闭
  15. ExecStop=/usr/sbin/blogd stop
  16. PrivateTmp=true
  17. [Install]
  18. WantedBy=multi-user.target
  1. chmod 777 /usr/lib/systemd/system/blog.service
  2. systemctl daemon-reload

测试好不好使

  1. systemctl start blog
  2. systemctl stop blog
  3. systemctl restartblog
  4. ps -aux | grep uwsgi

参考链接:

https://www.cnblogs.com/hanhy/articles/7278336.html
http://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Management.html

发布内容,请遵守相关法律法规。
评论