一、前言

在部署项目前,你已有一个能够在你本机测试过,能正常启动的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. uboot中添加自己的命令【转】

    本文转载自:http://blog.csdn.net/huanghai381/article/details/51206646 每个命令都是通过U_BOOT_CMD宏来定义的.这个宏定义了一个相关的结 ...

  2. easyui 生成tas方式

    1.采用<a>标签形式 <div id="tabs" style="width:100%;"> <ul> <li id ...

  3. CAS和Oauth2的区别

    CAS是单点登陆(SSO) Oauth2是对某种资源进行授权访问

  4. bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】

    不能用read会TLE!!不能用read会TLE!!不能用read会TLE!! 一开始以为要维护每个点,线段树写了好长(还T了-- 首先dfs一遍,求出点1为集会地点的答案,处理处val[u]为以1为 ...

  5. idea下载安装指南

    官网地址 https://www.jetbrains.com/idea/ 点击download 有收费版本和社区免费版.我下载了免费的. 有zip和exe两个版本.我先下载了zip绿色版,发现用不了. ...

  6. Beyond Compare 激活解决办法

    问题: 当你使用过一段时间后会提示有问题,需要激活或者什么. 解决办法: 找到这个路径并删除其下Beyond Compare 3文件夹即可正常使用. C:\Users\******\AppData\R ...

  7. 制作并发布个人CocoaPods库

    随着对 CocoaPods 越来越多的依赖,我们也可以尝试把自己的库发布到它上面. 1.在Github上新建一个项目(名字我随便取了一个,其他步骤截图为WCUIKit).自己做相应修改即可. 2.克隆 ...

  8. 暴力/思维 HDOJ 5386 Cover

    题目传送门 /* 题意:给出刷墙的所有的方法,求一种顺序,使得原矩阵刷成目标矩阵 暴力:(题解)我们只要每次找一行或一列颜色除了0都相同的,然后如果有对应的操作,就把这行这列都赋值成0即可 */ /* ...

  9. 递推DP UVA 1424 Salesmen

    题目传送门 /* 题意:给定包含n个点的无向图和一个长度为L的序列,修改尽量少的点使得相邻的数字相同或连通 DP:状态转移方程:dp[i][j] = min (dp[i][j], dp[i-1][k] ...

  10. 二分搜索 POJ 3258 River Hopscotch

    题目传送门 /* 二分:搜索距离,判断时距离小于d的石头拿掉 */ #include <cstdio> #include <algorithm> #include <cs ...