Flask:在Centos上配置两个Flask项目

源于

一开始我是只有一个项目的,非常好配置,而且也简单。但是后来发现,又有一个新项目需要新增上去。结果配置搞了好几天,今天终于搞定。(在网上的提问

其实精髓很简单,配置两个类似的就行,端口,日志文件,项目路径分开就行。

在这里不谈如何安装环境,关于安装环境可以参考(地址)。

Python flask
image-2417

开始操作

这里使用:Nginx + Uwsgi + virtualenv 进行配置操作.

首先是要配置Nginx,那么安装好之后,Nginx一般是在/usr/local/nginx这个目录下面,配置文件则在/usr/local/nginx/conf下面,因为我们需要配置多个站点,因此需要新建/usr/local/nginx/conf/vhost目录,然后把相关文件放在这个目录下面即可.

首先看nginx.conf的文件[/usr/local/nginx/conf/nginx.conf]:
下面这个配置文件基本只是改动了几个地方,第一行需要注意,这是使用www用户进行操作.所以需要新建用户.另外就是
include /usr/local/nginx/conf/vhost/*.conf;很关键,这一行表示加载vhost目录下面所有conf结尾的文件(在Nginx上配置子站点就是这样操作的).

user www;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}

# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}
include /usr/local/nginx/conf/vhost/*.conf;
}

下面是子站点A的conf[目录:/usr/local/nginx/conf/vhost/A.conf]:


server {
listen 80;
server_name A;
#charset koi8-r;
access_log /var/www/venv/logs/access.log;
error_log /var/www/venv/logs/error.log;

location / {
include uwsgi_params; # 引入
uwsgi_pass 127.0.0.1:3031;# 监听端口,此处不同
uwsgi_param UWSGI_PYHOME /var/www/venv/A;# 项目根目录,此处不同
uwsgi_param UWSGI_CHDIR /var/www/venv;# venv虚拟根目录
uwsgi_param UWSGI_SCRIPT main:app; # 启动文件和Flask实例名称(通常都是app)
}
}

下面是子站点B的conf[目录:/usr/local/nginx/conf/vhost/B.conf]:


server {
listen 80;
server_name A;
#charset koi8-r;
access_log /var/www/venv/logs/access.log;
error_log /var/www/venv/logs/error.log;

location / {
include uwsgi_params; # 引入
uwsgi_pass 127.0.0.1:8081;# 监听端口,此处不同
uwsgi_param UWSGI_PYHOME /var/www/venv/B;# 项目根目录,此处不同
uwsgi_param UWSGI_CHDIR /var/www/venv;# venv虚拟根目录
uwsgi_param UWSGI_SCRIPT main:app; # 启动文件和Flask实例名称(通常都是app)
}
}

配置文件都搞定之后,新建/var/www/venv目录,使用mkdir /var/www/venv -p.之后virtualenv A 创建虚拟环境A,完成之后,virtualenv B创建虚拟环境B.都依次创建完之后,分别在项目根目录[就是A,B两个目录]里面新建一个main.py文件.

切换到A目录,使用cd A .

main.py[目录:/var/www/venv/A]:

#!/usr/bin/env python3
# coding=utf-8
# -*-coding:utf-8-*-

from flask import Flask

app = Flask(__name__)

@app.route('/')
def show():
return "A.............."

if __name__ == '__main__':
app.run()

之后需要创建一个xml配置文件,指出如何初始化A项目.
文件:app_config.xml[目录:/var/www/venv/A/]
下面的文件不能有空格,切记切记!!!

/var/www/venv/A main
app
127.0.0.1:3031
4


至此,A项目创建完成.

接着来B项目.切换到B目录,使用cd ../B

main.py[目录:/var/www/venv/B]:

#!/usr/bin/env python3
# coding=utf-8
# -*-coding:utf-8-*-

from flask import Flask

app = Flask(__name__)

@app.route('/')
def show():
return "B.............."

if __name__ == '__main__':
app.run()

之后需要创建一个xml配置文件,指出如何初始化B项目.
文件:app_config.xml[目录:/var/www/venv/B/]
下面的文件不能有空格,切记切记!!!

/var/www/venv/B main
app
127.0.0.1:8081
4


至此,B项目创建完成.

都搞定之后,可以写一个启动脚本.
如下[startserver.sh]:

#!/bin/bash
# Startup script for the nginx Web Server
# ?P.~J?wsgi
/usr/local/python3.4/bin/uwsgi -x /var/www/venv/A/app_config.xml -d /var/log/uwsgi/uwsgiA.log --pidfile /tmp/uwsgiA.pid
/usr/local/python3.4/bin/uwsgi -x /var/www/venv/B/app_config.xml -d /var/log/uwsgi/uwsgiB.log --pidfile /tmp/uwsgiB.pid
# 启动nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf


之后使用chmod +x startserver.sh 即可启动.

总结

一共使用了如下目录或文件:

Nginx

服务器配置文件:
/usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/vhost/A.conf
/usr/local/nginx/conf/vhost/B.conf

Flask

项目文件[项目中还有其它自动生成的文件,忽略不计]:
/var/www/venv/A/app_config.xml
/var/www/venv/A/main.py
/var/www/venv/B/main.py
/var/www/venv/B/app_config.xml

之后就是启动脚本了,可以放在你想放的地方,比如/pyscript/startserver.sh,到此,大功告成!

参考:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据