上一个课程项目中开发了一个安卓的聊天软件,现在需要在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
如果出现了如下的错误,
可通过下列指令解决,
export LC_ALL=C
我暂时猜想可能是和python版本有关,具体可参考这里:stackoverflow
安装完Flask后,可在python中尝试import,若无报错即安装成功。
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和端口号,应该能看到输出。
这里,推荐使用postman进行测试,十分方便!传送门:Postman
这样我们就用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中尝试获取聊天室列表
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的相关返回,至此配置大功告成!
如果你对上述命令或代码有任何疑问,欢迎与我联系~