搭建Flask+Gunicorn+Supervisor+Nginx的聊天室服务器端

上一个课程项目中开发了一个安卓的聊天软件,现在需要在AWS上搭建自己的服务器,就可以实现完整的聊天功能,思路大致是用Flask搭建Web框架,Gunicorn搭建WSGI服务器,Supervisor监控,Nginx前置作为HTTP服务器。

1.在AWS上创建一个Ubuntu的micro实例(关于如何创建实例可参考我之前的文章,传送门AWS Instance创建), 为了方便把流量进出限制都关掉。

2.为了更好地理解涉及到的各个框架,我将逐步搭建服务器。首先,连接到我们的实例上,安装pip和flask。

sudo apt-get update
sudo apt-get install python-pip
sudo pip install flask

如果出现了如下的错误,
locale.Error
可通过下列指令解决,

export LC_ALL=C

我暂时猜想可能是和python版本有关,具体可参考这里:stackoverflow
安装完Flask后,可在python中尝试import,若无报错即安装成功。
import flask

3.编写Flask的Hello Word
创建一个新的文件夹来存放Flask的python文件,并编写我们的第一个Flask demo。

mkdir FlaskApp
cd FlaskApp/
vim app.py

python文件中的代码如下:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

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

运行app.py,Flask成功启动,在浏览器中输入服务器的Public IP和端口号,应该能看到输出。
web browser
这里,推荐使用postman进行测试,十分方便!传送门:Postman
postman get
这样我们就用python 和Flask创建了一个网页服务器了,是不是很简单~

4.安装mysql,创建database
聊天室的信息我们存放到mysql中,并使用Flask进行读取、新增等操作。首先安装mysql,

sudo apt-get install mysql-server
sudo apt-get install python-mysqldb

对于mysql的操作这里不作赘述,相关的教程请自行百度,

mysql -uroot -p

创建数据库

CREATE DATABASE androidIM;
USE androidIM;

分别建立聊天室列表和聊天内容列表

CREATE TABLE chatrooms (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
PRIMARY KEY(ID)
)DEFAULT CHARSET=utf8;

CREATE TABLE messages (
id int(11) NOT NULL AUTO_INCREMENT,
chatroom_id varchar(11) NOT NULL,
user_id varchar(11) NOT NULL,
name varchar(100) NOT NULL,
messages varchar(300) NOT NULL,
timestamp varchar(30) NOT NULL,
PRIMARY KEY(ID)
)DEFAULT CHARSET=utf8;

向聊天室列表加入内容以便测试

INSERT INTO chatrooms (name) VALUES ('TEST');

为了连接Flask和mysql,创建mydb.py,建立MyDataBase类

import MySQLdb

class MyDataBase:
    db = None

    def __init__(self):
        self.connect()
        return

    def connect(self):
        self.db = MySQLdb.connect(
            host = "localhost",
            port = 3306,
            user = "root",
            passwd = "iems5722",
            db = "AndroidIM",
            use_unicode = True,
            charset = "utf8",
        )
        self.cursor = self.db.cursor(MySQLdb.cursors.DictCursor)
        return

修改app.py,这里省略了其它功能的代码

from flask import Flask, jsonify, g, request
import mydb

@app.before_request
def before_request():
    g.mydb = mydb.MyDataBase()
    return

@app.route("/api/asgn3/get_chatrooms")
def get_chatrooms():    
    query = "SELECT * FROM chatrooms ORDER BY id ASC"
    g.mydb.db.cursor.execute(query)
    chatroom_list = g.mydb.db.cursor.fetchall()
    return jsonify(data=chatroom_list,status="OK")

运行app.py,在postman中尝试获取聊天室列表
get chatroom

5.安装gunicorn并进行测试

sudo apt-get install gunicorn
cd FlaskApp/
gunicorn app:app -b 0.0.0.0:8000

在postman中测试api是否正常,记得把端口改为8000

6.安装supervisor,通过supervisor对gunicorn进行启动和监控

sudo apt-get install supervisor
sudo su - root -c "echo_supervisord_conf > /etc/supervisord.conf"
sudo vim /etc/supervisord.conf

在最后插入如下代码

[program:android_IM]
command = gunicorn app:app -b 0.0.0.0:8000
directory = /home/ubuntu/FlaskApp
user = ubuntu
autostart = true
autorestart = true
stdout_logfile = /home/ubuntu/FlaskApp/app.log
redirect_stderr = true

保存后运行

supervisord -c /etc/supervisord.conf
supervisorctl

若输出我们定义的程序名并且状态为运行,则安装成功,在postman中测试api

7.安装、调试Nginx

sudo apt-get install nginx

删除Nginx原有的配置文件并创建我们自己的配置文件

sudo rm /etc/nginx/sites-enabled/default
sudo vim /etc/nginx/sites-enabled/androidIM.conf

插入以下代码

server {

    listen 80;
    listen [::]:80;

    location /api/asgn3/ {
        proxy_pass http://0.0.0.0:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_redirect off;
        proxy_buffering off;
    }

}

最后,把我们建立的配置文件链接到Nginx的配置文件夹中,重启nginx

sudo ln -s /etc/nginx/sites-enabled/androidIM.conf /etc/nginx/conf.d/
sudo /etc/init.d/nginx restart

此时,通过Public IP应该就能直接获取到api的相关返回,至此配置大功告成!
final

如果你对上述命令或代码有任何疑问,欢迎与我联系~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值