uWSGI+nginx+django+virtualenv+supervisor部署项目

1、前言

在部署项目前,你已有一个可以在你本机测试过,能正常启动的Django项目(毕竟本文主要讲解部署Django项目),以及掌握了Linux系统的一些基本命令。html

相关连接:node

Centos7安装python3和pippython

Centos7安装MySQL5.7(yum)nginx

pipreqs(找当前项目依赖的包)git

virtualenv(虚拟环境)github

2、WSGI、uWSGI、uwsgi详解

WSGI:(Web Server Gateway Interface)服务器网关接口,是一种协议。要实现WSGI协议,必须同时实现Web服务器和Web应用,由于它描述的是Web服务器(如nginx、uWSGI等服务器)如何与Web应用(如用Django框架写的程序)进行通讯。django

uWSGI:是一个Web服务器,实现了WSGI协议、uwsgi协议、http协议等。它要作的就是把http协议转化成语言支持的网络协议。好比把http协议转化成WSGI协议,让Python能够直接使用。 Nginx中HttpUwsgiModule的做用是与uWSGI服务器进行交换。flask

uwsgi:是一种线路协议,并不是是通讯协议,在此经常使用于在uWSGI服务器与其余网络服务器的数据通讯。uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型。它与WSGI相比是两样东西。浏览器

3、uwsgi安装与基本使用

uwsgi官网安全

pip3 install uwsgi

基本测试

新建一个test.py:

def application(env, start_response): start_response("200 OK", [("Content-Type", "text/html")]) return [b"Hello World"]

uwsgi热加载python应用程序:

uwsgi --http :8000 --wsgi-file --py-autoreload=1 test.py

PS:若是执行了上面命令显示 uwsgi: command not found

则配置软连接,方便使用:

ln -s python安装路径/bin/uwsgi /usr/bin/uwsgi 例如个人: ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

启动成功后,打开浏览器,访问"服务器公网IP:8000″(或者在本机访问""http://localhost:8000),就能够看到"Hello World"字样了。

PS:我使用的是阿里云服务器,若是你也是;项目部署好了,在浏览器打不开的话,能够登陆服务器控制台,添加安全组规则便可,具体请自行百度。

用uwsgi启动flask

# app.py
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "这是个人第一个flask程序!"

if __name__ == "__main__": app.run()

PS:若是是flask程序,须要再加 --callable app

uwsgi --http :8000 --wsgi-file app.py --callable app

用uwsgi启动django

修改配置文件,将 ALLOWED_HOSTS 设置为:当前服务器IP或*,如:

ALLOWED_HOSTS = ["*",]

启动django:

uwsgi --http :8000 --chdir /usr/local/django/mysite/ --wsgi-file mysite/wsgi.py

根据配置文件启动

一、建立配置文件 uwsgi.ini

[uwsgi] # 指定ip端口(直接运行设置为http、用nginx则设置为socket)
http = 0.0.0.0:8000
# 执行项目的目录
chdir = /usr/local/django/mysite/
# Django的wsgi.py文件
module = mysite.wsgi  # 至关于mysite/wsgi.py # 容许主进程存在
master = true # 开启的进程数量
processes = 4
# 后台运行
daemonize2 = true # uwsgi.pid文件能够用来重启和中止uwsgi服务
pidfile = %(chdir)/uwsgi/uwsgi.pid # uwsgi.status能够用来查看uwsgi的服务状态
stats = %(chdir)/uwsgi/uwsgi.status # 当服务器退出的时候自动清理环境 
vacuum = true # 将日志打到指定的日志文件
logto = /tmp/mysite.log # 虚拟环境
home=/root/envs/pdsite

二、根据配置文件启动(注意路径)

# 启动
uwsgi --ini uwsgi.ini # 中止
uwsgi --stop uwsgi.pid # 重启
uwsgi --reload uwsgi.pid # 查看uwsgi的服务状态
uwsgi --connect-and-read uwsgi.status

此时访问时,会出现找不到静态文件的错误。

想要uwsgi处理静态文件,须要先将django的静态文件收集到制定目录,而后再设置对应关系。

一、收集django静态文件

  • 在django的配置文件中添加:STATIC_ROOT = os.path.join(BASE_DIR, "allstatic");
  • 执行 python3 manage.py collectstatic 命令,至此django项目全部相关静态文件都会收集到指定目录。

二、设置uwsgi静态文件对应关系

在上面的 mysite.ini 文件中加入如下配置:

# static-map(映射一个资源到静态文件区)
static-map = /static=/usr/local/django/mysite/allstatic

映射媒体文件(看你需不须要配置):

static-map = /media=/usr/local/django/mysite/media

再次使用配置文件方式启动,全部静态文件就能够加载了。

4、Nginx

Nginx是一款轻量级的高性能Web服务器/反向代理服务器。咱们能够利用Nginx作反向代理、负载均衡以及处理静态文件。

安装:点击这里

下面的全部配置都是为Django项目配置的

uwsgi官网:使用uwsgi和Nginx设置Django和Web服务器

配置nginx

首先要确保你安装的Nginx中有uwsgi_params文件哦,以下;没有能够从这里获取:点我

配置nginx.conf:

user root; worker_processes 4; error_log /opt/nginx/logs/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /opt/nginx/conf/mime.types; default_type application/octet-stream; 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 /opt/nginx/logs/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; # 定义负载均衡池,名字叫作django,池子中写入uwsgi发布django的socket地址
 upstream django { server 127.0.0.1:8001; } server { listen 80; server_name www.zouxin.top; charset utf-8; client_max_body_size 75M; location / { # nginx自带ngx_http_uwsgi_module模块,起到nginx和uwsgi交互做用
            # 经过uwsgi_pass设置服务器地址和协议,将动态请求转发给uwsgi处理
 uwsgi_pass django; include uwsgi_params; } # nginx处理静态页面资源
        location /static { alias /usr/local/django/mysite/allstatic; } } }
View Code

这个nginx.conf文件告诉nginx从文件系统中提供媒体和静态文件,以及处理须要django干预的请求。对于大型部署,让一台服务器处理静态/媒体文件,另外一台服务器处理django应用程序,被认为是一种良好的作法,就目前而言,这样作会很好。

部署静态文件

在运行nginx以前,必须收集静态文件夹中的全部Django静态文件。这一步咱们已经在上面完成了。

配置uwsgi(ini文件)

[uwsgi] socket = 127.0.0.1:8001
chdir = /usr/local/django/mysite/ module = mysite.wsgi master = true processes = 4 daemonize2 = true pidfile = %(chdir)/uwsgi/uwsgi.pid stats = %(chdir)/uwsgi/uwsgi.status vacuum = true logto = /tmp/mysite.log static-map = /static=/usr/local/django/mysite/allstatic

启动uwsgi和nginx(注意路径)

# 启动uwsgi
uwsgi --ini mysite.ini # 启动nginx
cd /opt/nginx/sbin/ ./nginx

5、使用supervisor来管理process

官方文档

项目正式部署的时候,咱们一般会将其转化为系统的守护进程,将其放到后台运行,可是其并不会为咱们监控进程的运行状态,一旦进程崩溃,咱们的项目就没法继续提供服务。因此咱们要借助supervisor,帮助咱们启动uwsgi并维护(uwsgi进程关闭时,自动将其启动起来)。

一、安装

yum install supervisor

二、在/etc/supervisord.conf末尾添加上以下代码

[program:mysite] ; mysite是进程的名字(后面要用) command=/root/envs/pdsite/bin/uwsgi --ini /usr/local/django/mysite/uwsgi/uwsgi.ini ; 虚拟环境下的uwsgi,和项目uwsgi.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 ; 设置启动该程序的帐号为chrism log_stdout=true ; 若是为True,则记录程序日志 log_stderr=false ; 若是为True,则记录程序错误日志 logfile=/var/log/cat.log ; 程序日志路径 logfile_maxbytes=1MB ; 日志文件最大大小 logfile_backups=10           ; 日志文件最大数量

三、启动supervisor

supervisord -c /etc/supervisord.conf

...

http://www.javashuo.com/article/p-hqwwbbrz-gk.html

...

...

相关文章
相关标签/搜索