随着服务器性能的提升和业务的需求,一台服务器上往往会同时有多个服务,这些服务都希望监听80端口,比如有www.baidu.com和www.google.com。这时候我们可以使用nginx的代理转发功能帮我们实现共用80端口的需求。
项目1目录
├── envs # 项目虚拟环境
├── static # 存储nginx静态文件地址
├── views # 项目虚拟环境
├── app.py # flask入口文件
├── pro1_uwsgi.ini # uwsgi启动文件,下文会介绍
└── pro1_uwsgi.pid
项目2目录
├── envs # 项目虚拟环境
├── static # 存储nginx静态文件地址
├── views # 项目虚拟环境
├── index.py # flask入口文件
├── pro2_uwsgi.ini # uwsgi启动文件,下文会介绍
└── pro2_uwsgi.pid
一、环境准备
因为我的项目一和项目二用到的虚拟环境是一样的,所以只新建一套虚拟环境即可
注意:我的当前目录是在/var/www/virtualenv下,新建的envs在该目录下
# 获取虚拟环境工具
apt-get install virtualenv
# 创建虚拟环境
virtualenv -p /usr/bin/python3.6 envs
# 开启虚拟环境
source envs/bin/activate
# 然后下载依赖
pip install uwsgi --no-cache-dir
# 以下install内容根据自己而定
pip install flask flask_cors pymysql
二、下载nginx
非root用户,记得命令前加sudo
1、更新软件源
apt-get update
2、安装nginx
apt-get install nginx
3、启动nginx 默认80端口
etc/init.d/nginx start
4、nginx常用操作
etc/init.d/nginx reload 不重启重新载入最新配置文件内容
etc/init.d/nginx stop 停止服务
etc/init.d/nginx restart 重启服务
配置nginx
在目录/etc/nginx/sites-available/下,编辑default
vim /etc/nginx/sites-available/default
注意:server_name 域名的不同之处,以及uwsgi_pass 端口不同
这将对应你,不同域名,访问不同uwsgi服务
server {
listen 80;
server_name www.baidu.com;
charset utf-8;
client_max_body_size 75M;
location / {
uwsgi_pass 127.0.0.1:8001; # flask服务地址+端口
include uwsgi_params; # 默认uwsgi_params
root /etc/init.d/nginx; # nginx根目录
index index.html index.html;
}
}
server {
listen 80;
server_name www.google.com;
charset utf-8;
client_max_body_size 75M;
location / {
uwsgi_pass 127.0.0.1:8002; # flask服务地址+端口
include uwsgi_params; # 默认uwsgi_params
root /etc/init.d/nginx; # nginx根目录
index index.html index.html;
}
}
启动nginx
/etc/init.d/nginx start
这时候你访问配置好的域名这两个都是502,因为两个项目并没有启动,所以,nginx他也不知道路由到那里去
三、配置项目
两个项目根目录下都有一个.ini的文件,即为uwsgi配置文件。
什么是uWSGI
uWSGI是一个web服务器,它实现了WSGI协议、uwsgi协议、http协议等。
什么是WSGI
WSGI是一种Web服务器网关接口。它是一个Web服务器(uWSGI等服务器)与web应用(如用Django/Flask框架写的程序)通信的一种协议。
何为uwsgi呢?
uwsgi是一种线路协议而不是通信协议,常用于在uWSGI服务器与其他网络服务器的数据通信。
作用
进行协议之间进行转换
与Python application进行通信
基本命令
# 启动
uwsgi–ini 配置文件路径
# 停止
uwsgi–stop uwsgi.pid路径
项目一pro1_uwsgi.ini 文件配置
[uwsgi]
# 使用nginx启动使用socket。单独通过uwsgi启动用 http:127.0.0.1:8001
socket=127.0.0.1:8001
chdir = /var/www/index
pythonpath=/var/www/virtualenv/envs
wsgi-file = /var/www/index/app.py
callable = app
master = true
vacuum = true
chmod-socket = 664
processes = 3
daemonize = /var/www/log/index/index.log
pidfile = /var/www/index/pro1_uwsgi.pid
项目一pro2_uwsgi.ini 文件配置
[uwsgi]
# 使用nginx启动使用socket。单独通过uwsgi启动用 http:127.0.0.1:8002
socket=127.0.0.1:8002
chdir = /var/www/index2
pythonpath=/var/www/virtualenv/envs
wsgi-file = /var/www/index2/index.py
callable = app
master = true
vacuum = true
chmod-socket = 664
processes = 3
daemonize = /var/www/log/index2/index.log
pidfile = /var/www/index/pro2_uwsgi.pid
分别启动这两个项目
在各自的目录下运行:
uwsgi –-ini pro1_uwsgi.ini
uwsgi –-ini pro2_uwsgi.ini
然后访问域名即可
uwsgi对应的日志请查看var/www/log/index/index.log和var/www/log/index2/index.log
nginx对应日志请查看
tail -f /var/log/nginx/access.log