随着服务器性能的提升和业务的需求,一台服务器上往往会同时有多个服务,这些服务都希望监听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