部署环境说明
在Ubuntu18.04的服务器上部署的程序。然后分别启动了两个docker,dockerA是我自己用DockerFile编写的环境,用于运行vue项目。dockerB则是直接从nginx官网拉下来的docker(docker pull nginx
)
方式一:通过HTTP协议
- 使用 HTTP 协议,通过端口(如 :5000)接收请求
- 需要 Nginx 或其他 Web 服务器代理,然后转发到 uWSGI
- 配置简单,适合小型项目
uWSGI的配置文件:
[uwsgi]
http = :5000 # 监听5000的端口来处理HTTP请求
chdir = /tired/gate/management # 运行目录
wsgi-file = main.py # 指定运行的Python文件
callable = APP # 这个文件中名为APP的可调用对象,它是一个Flask应用程序对象。
master = true # 启用主进程模式
http-websockets = true # 启用通过HTTP进行WebSocket通信的支持
gevent = 1000 # 将gevent工作进程的数量设置为1000。Gevent是一个基于协程的并发库
nginx的配置文件:
# 运行的子线程数量
worker_processes 5;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
# web应用后端服务
location /api {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://XXX.XXX.XXX.XXX:5000/api;
}
# web应用的前端服务
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
uwsgi_send_timeout 600;
uwsgi_connect_timeout 600;
uwsgi_read_timeout 600;
root /management/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
# 代理 uWSGI 和 Flask-SocketIO 之间的 WebSockets 连接
location /socket.io/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://XXX.XXX.XXX.XXX:5000/socket.io/;
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
}
后端的关键代码
APP = Flask(__name__)
APP.config['SECRET_KEY'] = 'secret!'
SOCKETIO = SocketIO(APP, async_mode="gevent_uwsgi")
SOCKETIO.init_app(APP, cors_allowed_origins='*')
NAME_PLACE = "/realtime"
前端的关键代码
const socket = io('/realtime')
注意事项
- dockerA在运行启动的时候,需要把5000端口映射出来
- nginx中的http://XXX.XXX.XXX.XXX要根据不同部署机器的IP进行修改
- 其中nginx中的配置可以进行替换,前提在nginx的docker中含有/etc/nginx/proxy_params文件
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
可替换为include proxy_params;
4. 前端代码的IO可以修改为对应的io('http://XXX.XXX.XXX.XXX:5000/realtime')
,这样nginx配置文件中的location /socket.io/
就不需要弄了(也会失去nginx高性能代理的能力)。
5. uWSGI配置文件中gevent = 1000不能丢了,不然前端 socketio可以访问到后端,后端的socketio无法访问前端。(这个不知道为啥会这样,欢迎懂得一起交流)
方式二:通过socket协议
- 使用 uWSGI 的 socket 协议,通过文件(/tired/gate/management/uwsgi_main.sock)接收请求
- 无需 Web 服务器,uWSGI 自身就可以处理请求
- 配置相对复杂,但性能更高,适合大型项目
uWSGI的配置文件:
[uwsgi]
module = main:APP
socket = /tired/gate/management/uwsgi_main.sock
chmod-socket = 666
vacuum = true
die-on-term = true
master = true
http-websockets = true
gevent = 1000
processes = 1
nginx的配置文件:
# 运行的子线程数量
# 运行的子线程数量
worker_processes 5;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
# web应用后端服务及,代理 uWSGI 和 Flask-SocketIO 之间的 WebSockets 连接
location ~ ^/(api|socket.io) {
include uwsgi_params;
uwsgi_pass unix:/management/uwsgi_main.sock;
# 提高uwsgi服务器接受请求数据的缓冲区大小,防止JS过大,访问失败
uwsgi_buffer_size 2m;
uwsgi_buffers 4 2m;
}
# web应用的前端服务
location / {
root /management/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
}
}
说明
建议使用该方法,原因:
- 不用每部署到一台机器,就修改对应的IP地址
- socket文件的性能比http的要高