uWSGI+Nginx+Flask在CentOS 7下的安装使用

流程

一、创建虚拟环境

Python 3 内置了用于创建虚拟环境的 venv 模块。

  1. mkdir一个喜欢的路径python_project文件夹,然后建立并激活py3,处于py3前缀下

  2. 建立虚拟环境py3:python3 -m venv py3

  3. 进入py3 : source py3/bin/activate (py3) ➜ python -V

Python 3.6.1句首会一直显示(py3)…代表已经处于py3环境了> Python 3.6.1句首会一直显示(py3)…代表已经处于py3环境了

  1. 想退出,输入deactivate

二、flask

1. 安装flask

pip3 install flask

pip3 list一下,list结果中一定要有flask等好几个依赖包才行!检查虚拟环境里可能没有真正装入!

2. 首先要有一个flask应用

参考文献:Ubuntu安装配置uWSGI Nginx部署Flask项目
https://www.centos.bz/2017/08/ubuntu-install-uwsgi-nginx-flask/

在python_project里写一个hello.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
    app.run(host='0.0.0.0',port=5000,debug=True)

再写一个启动文件run.py(其实也可以不写。。)

from hello import app

if __name__ == "__main__":
    app.run(host='0.0.0.0',port=5000,debug=True)

3. 直接运行一下看看(因为Flask内置了服务器)

cd到run.py的目录,再运行 python3 run.py即可启动Flask内置服务器,然后在Linux中火狐输入0.0.0.0:5000 ,即可访问!

或者在Mac宿主机访问10.211.55.4:5000

然后就可以ctrl+c给暂停了。。我们继续下面的步骤。。

X. 中间出的一点小问题:

发现在Linux的火狐中访问localhost:5000可以成功显示

但在宿主机Mac中用Chrome访问 10.211.55.4:5000,无法访问此网站

Google一下解决了:

说要关闭centos的防火墙:

systemctl stop firewalld.service

Mac的防火墙也要在“隐私与安全性”里关闭,不过默认就是关着的。

但还是不行。于是我在Mac上开了tomcat,访问mac的8080端口可显示内容。

这个过程是双向服务器测试,哈哈哈哈。

发现Linux可访问Mac的tomcat,10.211.55.2:8080

蛋疼,继续google,

找到了一个python自带的服务器测试代码:

python -m SimpleHTTPServer 8080

在Linux上开启了一个服务器,用8080可访问。

然后再Mac上可以成功访问 10.211.55.4:8080 !!贼几把激动,这说明mac还是可以访问通Linux的

这时候主要矛盾就转化为:可以访问虚拟机的8080等端口,唯独5000访问不了。大概率是Flask出了问题

最终发现问题:

hello.pyrun.py都要改一下,不能设置为空app.run(),而是要写0.0.0.0,给写死!:

app.run(host='0.0.0.0',port=5000,debug=True)

然后Mac终于可以访问Linux上的flask,用10.211.55.4:5000!!嗨的一匹。

Y. 还有一招,用外网通过NAT端口映射,访问Linux的Web服务器
开启PD虚拟机偏好设置的NAT后,使得宿主机Mac的65531端口直接对应Linux虚拟机的5000端口,对齐!

这样外网任何一台手机电脑用浏览器输入 192.168.31.106:65531 (访问的是宿主机的公网IP,查一下WiFi就可得到),即转换为Linux的5000端口,即可访问Flask服务器!实现全网通用服务器!!!

三、uwsgi

1. 安装uwsgi

Uwsgi 需要一些其他环境的支持,因此在安装 Uwsgi 前要把先行条件准备好:

yum -y install gcc  gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel GeoIP gd libXpm libxslt sqlite-devel

完成之后,再使用下面语句安装 Uwsgi。

pip3 install uwsgi

2. 先小用一下uwsgi玩玩:

安装后运行:

uwsgi --socket 0.0.0.0:5000 --protocol=http -w run:app

protocol说明使用 http 协议,-w指明了要启动的模块,run就是项目启动文件run.py去掉扩展名,app是run.py文件中的变量app,即Falsk 实例

然后访问 10.211.55.4:5000,同样会运行成功!说明uwsgi正常。(刚才是用python3启动,这次是用uwsgi启动

3. 配置uwsgi

但是这样的话每次都从命令行启动太麻烦,可以在 /myproject目录下创建一个配置文件 uwsgi.ini

[uwsgi]
socket = 0.0.0.0:5000
chdir = /home/zhang/my_project/python_project
wsgi-file = run.py
callable = app
processes = 4
threads = 2
buffer-size=32768
stats = 127.0.0.1:9191

Uwsgi可以正常开启,但一用Chrome访问,就会出现:

invalid request block size: 21573 (max 4096)…skip

大概意思就请求block是超过最大值了呗,果断Google,得到如下方法:

在uWSGI.ini 里,加入一行:

buffer-size=32768

X. 两个没有试过的sock, log

(第一次配置没有用下面两个文件,以后可以试试:

创建Log,socket的文件路径:

1、建立log/logofzjz.log文件。

2、不过,socket只建立到sock文件夹即可,myproject.sock文件会自动创建,sock文件用来传递uwsgi和nginx的中间信息)

  1. 启动一下uwsgi试试
    启动uwsgi :
uwsgi uwsgi.ini

没有什么作用,看着正常就可以Ctrl+C中断了

四、nginx

1. 安装nginx

参考文章:CentOS 7 用 yum 安装 Nginx
https://chaishiwei.com/blog/1281.html

步骤如下:

1、在 CentOS 7 中,直接使用 yum 安装 Nignx 会提示无下载源。因此需要添加 Nginx 的下载源:

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

2、指定了下载源后,就可以使用 yum 命令来安装 Nginx 了:

sudo yum install -y nginx

3、输入开启命令:

sudo nginx

即可在Linux的火狐中运行localhost,得到官方欢迎界面!!!

或者在Mac浏览器中输入10.211.55.4,也可得到官方欢迎界面!!!

(因为nginx默认使用80端口,HTTP协议端口~ 所以任何单一输入IP(例如只输入 192.168.31.106,不输入端口号)的,都会转接至80端口)

2. 配置Nginx

参考文章:在服务器上简单配置flask+uwsgi+nginx(只是可工作~嘿)
https://blog.csdn.net/werewolf_st/article/details/49206051

其中这个阶段总共就三个文件:

1、uwsgi.ini(前面已经编辑过了)

2、nginx.conf(原装文件,nginx文件夹内)

3、nginx.conf(自建的python_project文件夹内,然后生成了个快捷方式在vhost中)

在自己python_project文件夹下,vi一个nginx.conf文件,作为与uwsgi连接的配置:

server{

    listen 80;
    server_name  0.0.0.0;

    location /{
        include uwsgi_params;
        uwsgi_pass  0.0.0.0:5000;
        uwsgi_param   UWSGI_CHDIR  /home/zhang/my_project/python_project;
        uwsgi_param   UWSGI_SCRIPT  run:app;
    }
}

/etc/nginx/目录中,新建目录:conf/vhost/

vi一下系统原有的etc/nginx/nginx.conf文件,然后http{}大括号里面的最后一行添加

include /etc/nginx/conf/vhost/*.conf;

同时删掉原来的 include /etc/nginx/conf.d/*.conf; 指令

(即弃置原装conf.d/default.conf的配置信息了)

接下来,把自己python_project中的nginx.conf生成一个快捷方式,加到 vhost中,即执行:

sudo ln -s /home/zhang/my_project/python_project/nginx.conf /etc/nginx/conf/vhost

搞完就会发现。/etc/nginx/conf/vhost文件夹内会新增一个nginx.conf,这个就是快捷方式啦。

X. 中间的一些小问题:

配置时,sock用sock文件,老出问题。。。比如说端口已被占用,还查不出来是哪个进程。([emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use))

所以我Google了一些方案:

查看某端口的占用
netstat -lnp|grep 5000
杀死进程号6640
kill -9 6640
sudo fuser -k 80/tcp   
杀死占用80端口的没有进程号的空进程~

当然,这个80占用问题。。。我最后是通过卸载重装nginx的玄学方法搞得。。然后就不会出现这个了。

完全卸载nginx的流程:

sudo rm -rf /etc/nginx/
sudo rm -rf /usr/sbin/nginx
sudo rm /usr/share/man/man8/nginx.8.gz
yum remove nginx

五、全部给老子跑起来!!

1. 启动uwsgi

uwsgi uwsgi.ini

2. 启动 sudo nginx

sudo nginx  

然后会没有任何反应…即代表成功。
这个时候访问虚拟机ip地址 10.211.55.4即可

3. 开启关闭命令

开启

sudo nginx

关闭

sudo pkill -9 nginx

开启

uwsgi uwsgi.ini

关闭

sudo pkill -9 uwsgi

猜你喜欢

转载自blog.csdn.net/weixin_43153178/article/details/83831114