CentOS7 部署 Python3.7 + Django + MySQL5.7 + Nginx + uwsgi

做过运维的应该都知道:
Python需要使用nginx + uWSGI 提供静态页面访问,和高并发
php 需要使用 nginx + fastcgi 提供高并发,
java 需要使用 nginx + tomcat 提供 web 服务
参考文档
https://my.oschina.net/u/4354879/blog/3432384
https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgi/
https://www.cnblogs.com/wkfvawl/p/15310834.html
https://uwsgi-docs.readthedocs.io/en/latest/

WSGI 协议

WSGI:是一种协议规范,起到规范参数的作用,就像告诉公路一样,规定超车靠右行,速度不低于90km/h,等。但这一切都是对双方进行沟通,比如,重庆到武汉这条高速路,这儿重庆和武汉就各为一端,他们之间的行车规范就按照WSGI规则即可。我们现在需要记住,WSGI沟通的双方是wsgi server (比如uWSGI) 要和 wsgi application(比如django )

wsgi server (比如uWSGI)实现wsgi协议规范的服务器我们叫做wsgi服务器,也就是uWSGI服务器,
wsgi application(比如django )实现wsgi协议的应用,我们叫做wsgi应用,比如Django,Falsk

uWSGI

uWGSI:是一个web服务器,或者wsgi server服务器,他的任务就是接受用户请求,由于用户请求是通过网络发过来的,其中用户到服务器端之间用的是http协议,所以我们uWSGI要想接受并且正确解出相关信息,我们就需要uWSGI实现http协议,没错,uWSGI里面就实现了http协议。所以现在我们uWSGI能准确接受到用户请求,并且读出信息。现在我们的uWSGI服务器需要把信息发给Django,我们就需要用到WSGI协议,刚好uWSGI实现了WSGI协议,所以。uWSGI把接收到的信息作一次简单封装传递给Django,Django接收到信息后,再经过一层层的中间件,于是,对信息作进一步处理,最后匹配url,传递给相应的视图函数,视图函数做逻辑处理......后面的就不叙述了,然后将处理后的数据通过中间件一层层返回,到达Djagno最外层,然后,通过WSGI协议将返回数据返回给uWSGI服务器,uWSGI服务器通过http协议将数据传递给用户。这就是整个流程。

这个过程中我们似乎没有用到uwsgi协议,但是他也是uWSGI实现的一种协议,鲁迅说过,存在即合理,所以说,他肯定在某个地方用到了。我们过一会再来讨论

我们可以用这条命令:python manage.py runserver,启动Django自带的服务器,具体叫什么名字,我真不知道(知道的可以留言)。DJango自带的服务器(runserver 起来的 HTTPServer 就是 Python 自带的 simple_server)。是默认是单进程单多线程的,对于同一个http请求,总是先执行一个,其他等待,一个一个串行执行。无法并行。而且django自带的web服务器性能也不好,只能在开发过程中使用。于是我们就用uWSGI代替了。但是uWSGI也不够好,为什么看下图。

为什么有了uWSGI为什么还需要nginx?

因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。这时候nginx和uWSGI之间的沟通就要用到uwsgi协议。





一、依赖库安装

参考文档
https://www.jianshu.com/p/4e97a9d78d1f
如果看到 yum 前面加sudo的,例如:sudo yum -y install openssl-devel,记得向root用户提权才能安装,因为我用的是root 用户操作的,所以没加。
//
# 1 安装依赖包 
yum -y install gcc-c++
yum -y install openssl
yum -y install openssl-devel 
yum -y install zlib-devel
yum -y install pcre-devel

二、Python3.7 安装

我是通过下载Python3.7的安装包进行编译安装的

# 1 下载
wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz
# 2 解压
tar -zxvf Python-3.7.9.tgz
# 3 进入目录
cd Python-3.7.9
# 4 生成 Makefile,为下一步的编译做准备
//  ./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本
// 比如代码:./configure –prefix=/usr/python3 意思是将该软件安装在 /usr/python3 下面,./configure –help 察看详细的说明帮助。
// 执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。
./configure --prefix=/usr/python3
# 5 编译 它从Makefile中读取指令,然后编译
make
# 6 安装 Makefile中读取指令,安装到指定的位置。
make install 
# 7 添加软连接 (ln -s 源文件 目标文件)
ln -s /usr/python3/bin/python3 /usr/bin/python3
//
# 8 查看python3 版本
python3 -V
# 9 给 pip3 添加软连接
ln -s /usr/python3/bin/pip3.7 /usr/bin/pip3
# 查看pip3 版本
pip3 -V  

三、Django 安装

//
# 安装django 3.2.6 版本
pip3 install django==3.2.6

四、uwsgi 安装

//
# 通过 pip3 安装 uwsgi 
pip3 install uwsgi

# yum 安装 python3-devel 依赖库(如果执行pip3 install uwsgi 安装不成功可能需要安装python3-devel)根据报错情况判断,可能确实其他
yum install -y python3-devel

五、Nginx 安装

源码安装

可以通过wget nginx的源码然后手动编译安装到指定目录

# 下载
wget http://nginx.org/download/nginx-1.20.2.tar.gz
# 解压
tar -zxvf nginx-1.20.2.tar.gz
# 进入 nginx-1.20.2 目录
cd nginx-1.20.2
# 生成 Makefile,为下一步的编译做准备
./configure --prefix=/usr/local/nginx
# 编译
make 
# 安装
make install
# 启动
cd /usr/local/nginx/sbin/
./nginx
# 重载
/usr/local/nginx/sbin/nginx -s reload
# 停止
/usr/local/nginx/sbin/nginx -s stop

// 扩展
# 查看 nginx 服务器状态 
netstat  -anptu  |  grep nginx

-a显示所有端口的信息

-n以数字格式显示端口号

-t显示TCP连接的端口

-u显示UDP连接的端口

-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口

-p显示监听端口的服务名称是什么(也就是程序名称)

另一种方式安装(yum安装):

//
# 也可以直接通过yum安装
yum install nginx

# 不同版本的linux系统可能会遇到No package nginx available.那么请尝试先安装epel(视情况而定)
yum install epel-release

# 开启 nginx 
service nginx start   // 开启
service nginx stop    // 停止
service nginx restart // 重启


# 设置Nginx服务开机自启动
systemctl enable nginx

Nginx 配置文件

server {
        listen       80;
        server_name  test;
        charset      utf-8;
        # 静态路径相关配置
        location /static {
            autoindex on;
            #root /var/www/test_project/;
            alias /var/www/test_project/static;
        }

        location / {
            uwsgi_pass 127.0.0.1:9090;
            include /etc/nginx/uwsgi_params;     
            #这里我们使用默认文件即可,此处若不指定或指定错误,会出现502错误,uwsgi.log文件中会看到  KeyError: 'REQUEST_METHOD'的错误
            index index.html index.htm;
        }
    }

# 如还需要其他参数请自行了解后配置添加

uwsgi配置文件

[uwsgi]
#重要重要重要!!!此处的9090端口和之前nginx配置文件需要一致,相当于链接通路
socket = 192.168.92.131:9090
# 指定test_project项目所在路径,一般放在 /var/www 这个目录,避免遇到nginx root权限问题
chdir = /usr/local/nginx/html/test99
# 指定Django's wsgi file
wsgi-file = /usr/local/nginx/html/test99/test1/wsgi.py
# 最大工作进程 processes
processes = 10
#每个工作进程processes启动后开启线程个数threads
threads = 2
#环境退出时自动清理
vacuum = true

#记录uwsgi日志路径 
#daemonize = /var/log/uwsgi.log

##如还需要其他参数请自行了解后配置添加

# uwsgi 启动
uwsgi --ini /etc/uwsgi_config.ini       #初始化uwsgi服务
uwsgi --stop /etc/uwsgi_config.ini      #停止uwsgi服务
uwsgi --reload /etc/uwsgi_config.ini    #重新加载uwsgi服务

六、MySQL 5.7安装

// 
# 1、运行以下命令更新YUM源
rpm -Uvh  http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

# 2、运行以下命令安装MySQL
如果您使用的操作系统内核版本为el8,可能会提示报错信息No match for argument。
您需要先运行命令 
# yum module disable mysql 
禁用默认的mysql模块,再安装MySQL

# 3、安装MySQL
yum -y install mysql-community-server

# 4、运行以下命令查看MySQL版本号。
mysql -V
返回结果如下所示,表示MySQL安装成功
mysql  Ver 14.14 Distrib 5.7.28, for Linux (x86_64) using  EditLine wrapper

# 5、运行以下命令启动MySQL。
systemctl start mysqld

# 6、运行以下命令设置开机启动MySQL
systemctl enable mysqld
systemctl daemon-reload

七、拓展

//
要想使用此命令,需要装psmisc
yum -y install psmisc

killall命令用于杀死指定名字的进程(kill processes by name),即结束同名的的所有进程。

killall   [参数]   [进程名]
参数选项  解释说明
-i       交互模式,终止进程前先询问用户是否确认
-g       终止该进程组的进程
-I       忽略大小写
-q       如果没有终止进程则不提示
-l       列出所有的已知信号名称
-r       使用正则表达式匹配要终止的进程名称
-u       终止指定用户的进程
-w       等待所有被终止的进程死去。

例子:
killall mysqld

在使用kill命令终止进程需要先获取进程PID,而使用killall命令直接使用进程名称,即可终止进程。
kill -9 2709

# yum针对软件包操作常用命令
使用yum查找软件包
yum search + 软件名或者关键字 //例如:yum search ifconfig

列出所有可安装的软件包
yum list 

列出所有可更新的软件包 
yum list updates

列出所有已安装的软件包
yum list installed 

列出所有已安装但不在 yum Repository 内的软件包
yum list extras

使用yum获取软件包信息 
yum info + 软件包

列出所有可更新的软件包信息
yum info updates 

列出所有已安装的软件包信息
yum info installed

列出所有已安装但不在 yum Repository 内的软件包信息 
yum info extras 

列出软件包提供哪些文件
yum provides +  软件包  //yum provides semanage

# 3 清理/生成缓存
清理缓存
yum clean all

更新缓存
yum makecache
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容