一、前言

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

相关链接:

Centos7安装python3和pip

Centos7安装MySQL5.7(yum)

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

virtualenv(虚拟环境)

二、WSGI、uWSGI、uwsgi详解

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

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

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

三、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

根据配置文件启动

1、创建配置文件 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

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

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

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

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

1、收集django静态文件

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

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

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

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

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

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

再次使用配置文件方式启动,所有静态文件就可以加载了。

四、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;
}
}
}

这个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

五、使用supervisor来管理process

官方文档

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

1、安装

yum install supervisor

2、在/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 ; 日志文件最大数量

3、启动supervisor

supervisord -c /etc/supervisord.conf

...

https://www.cnblogs.com/pyyu/p/9481344.html

...

...

uWSGI+nginx+django+virtualenv+supervisor部署项目的更多相关文章

  1. nginx+uwsgi+virtualenv+supervisor部署项目

    一.导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的 ...

  2. nginx+uwsgi+django+virtualenv+supervisor部署web服务器

    wsgi 全称web server gateway interface,wsgi不是服务器,也不是python模块,只是一种协议,描述web server如何和web application通信的规则 ...

  3. uwsgi+nginx+django生产环境部署

    1.升级python到2.7版本 2.安装uwsgi 出现uwsgi未找到 yum groupinstall "Development tools"yum install zlib ...

  4. nginx+uWSGI+django+virtualenv+supervisor发布web服务器

    nginx+uWSGI+django+virtualenv+supervisor发布web服务器   导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以 ...

  5. Linux - nginx+uWSGI+django+virtualenv+supervisor发布web服务器

    目录 Linux - nginx+uWSGI+django+virtualenv+supervisor发布web服务器 crm django项目部署流程 使用supervisro启动uwsgi,退出虚 ...

  6. 10: Django + Uwsgi + Nginx 的生产环境部署

    1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI:  最早的协议 2. FCGI:  比CGI快 ...

  7. Django + Uwsgi + Nginx 的生产环境部署实战

    目录 Django + Uwsgi + Nginx 的生产环境部署实战 安装Uwsgi 一.使用命令来启动django项目 二.使用配置文件来启动我们的Django项目 安装Nginx 配置Nginx ...

  8. 12,nginx+uWSGI+django+virtualenv+supervisor发布web服务器

    导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的框架 ...

  9. nginx+uWSGI+django+virtualenv+supervisor发布web服务器流程

    导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求)基于wsgi运行的框架有 ...

随机推荐

  1. 【POI 2010】 Pilots

    [题目链接] 点击打开链接 [算法] 单调队列 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 3000010 ...

  2. 解决 jquery dialog 弹框destroy销毁方法不能把弹出元素设置成初始状态

    在使用jquery ui中的dialog弹出窗口的时候遇到一个问题,就是页面弹出窗口关闭后希望表单元素能回到初始状态 例如文本框输入内容后关闭dialog后里面的内容清除,使用了destroy方法也不 ...

  3. Ueditor 单独使用上传图片及上传附件方法

    1 <script type="text/plain" id="upload_ue"></script> 2 <script ty ...

  4. setsockopt 设置socket 详细用法(转载)

    转自:http://www.cppblog.com/killsound/archive/2009/01/16/72138.html 1.closesocket(一般不会立即关闭而经历TIME_WAIT ...

  5. 如何成为一名牛逼的C/C++程序员?

    每一个学技术的人 都想干个三五年就能成为大牛 跳槽去大厂,薪水翻番 或者在一个小公司里,带个小团队 在30岁左右成为项目经理 晋升管理层 买房买车,实现人生理想 然而技术之路漫漫 想要成为牛×的程序员 ...

  6. [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

    Description N(1<=N<=100000)头牛,一共K(1<=K<=30)种特色,每头牛有多种特色,用二进制01表示它的特色ID.比如特色ID为13(1101),则 ...

  7. 浅谈算法——splay

    BST(二叉查找树)是个有意思的东西,种类巨TM多,然后我们今天不讲其他的,我们今天就讲splay 首先,如果你不知道Splay是啥,你也得知道BST是啥 如上图就是一棵优美的BST,它对于每个点保证 ...

  8. 377 Combination Sum IV 组合之和 IV

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

  9. working hard to be a professional coder

    1:read 2 : code 3 : 勤奋 4:技术栈 就前端主流技术框架的发展而言,过去的几年里发展极快,在填补原有技术框架空白和不足的同时也渐渐趋于成熟.未来前端在已经趋向成熟的技术方向上面将会 ...

  10. Java 8 (9) Optional取代null

    NullPointerException,大家应该都见过.这是Tony Hoare在设计ALGOL W语言时提出的null引用的想法,他的设计初衷是想通过编译器的自动检测机制,确保所有使用引用的地方都 ...