一、创建虚拟环境
Python 3 内置了用于创建虚拟环境的 venv 模块。
-
mkdir一个喜欢的路径python_project文件夹,然后建立并激活py3,处于py3前缀下
-
建立虚拟环境py3:
python3 -m venv py3
-
进入py3 : source py3/bin/activate (py3) ➜ python -V
Python 3.6.1句首会一直显示(py3)…代表已经处于py3环境了> Python 3.6.1句首会一直显示(py3)…代表已经处于py3环境了
- 想退出,输入
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.py
和run.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的中间信息)
- 启动一下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