做过运维的应该都知道:
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