一、AWS服务器申请
登录awseducate.com,依次点击AWS Account->AWS educate starter account->Aws console 创建EC2实例
创建过程中选择系统,这里我们选择Ubuntu18.04 ,同时需要保存私钥mykey.pem文件。后面使用FTP工具及XShell客户端连接服务器时会用到。创建好的实例如下图所示
二、Xshell配置
创建好EC2实例后,需要在本地电脑上通过客户端工具链接远端服务器,这里我们选择Xshell进行配置
主机填写EC2实例的公有DNS名称,可以自行在EC2实例列表点击查看。
选择用户身份验证,填写用户名ubuntu(这里名称根据我们所选的系统填写,一般为ec2-user)选择创建实例时保存的mykey.pem文件。然后点击连接就可以看到连接上云端服务器。
三、FTP工具配置
FTP工具主要用于向服务器上传程序和资源,这里我们使用FileZilla。
首先点击编辑->设置弹出上面的设置框,选择SFTP然后添加密钥文件,选择mykey.pem文件确认。
然后点击文件->站点管理器,在协议选择SFTP-SSH File Transfer Protocol ,主机填写公有DNS,登录类型选择交互式,用户名同样的填ubuntu,点击连接即可。
四、Caddy项目环境配置
4.1 为服务器设置密码
Caddy项目前端使用uni-app(vue框架)开发,后端使用python3+flask+mysql开发,由于AWS服务器几乎是一台裸机,所以首先需要配置安装mysql用于存储数据以及python3及flask的部署环境。
首次通过xshell连接上服务器,先为EC2实例设置root密码,随后我们就可以使用su命令使用root用户了。
sudo passwd root
su
4.1 mysql的配置安装
sudo apt-get install mysql-server
sudo mysql_secure_installation
配置过程需要设置密码,设置好后通过以下命令进入mysql
sudo mysql -uroot -p
进入后先为我们的项目创建数据库
create database my_db;
4.2 创建Mysql数据模型
mysql的数据模型通过python代码来创建
#base_model.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
from db import engine
from sqlalchemy.sql.sqltypes import VARCHAR, BIGINT, DATETIME, INTEGER, \
TEXT, CHAR, BOOLEAN
from sqlalchemy.sql.functions import func
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
__table_args__={
'mysql_charset':'utf8'
}
id = Column(Integer, primary_key=True )
name = Column(String(32))
pwd = Column(String(16))
sex = Column(VARCHAR(2))
age = Column(INTEGER)
address = Column(String(255))
avatar = Column(String(255))
reg_time = Column(DATETIME,default=func.now())
__table_args__ = (
UniqueConstraint('id', 'name', name='uix_id_name'),
Index('ix_id_name', 'name'),
)
def single_to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
def dobule_to_dict(self):
result = {}
for key in self.__mapper__.c.keys():
if getattr(self, key) is not None:
result[key] = str(getattr(self, key))
else:
result[key] = getattr(self, key)
return result
class Gallery(Base):
__tablename__ = 'gallery'
__table_args__={
'mysql_charset':'utf8'
}
id = Column(Integer,primary_key = True)
create_by=Column(Integer,ForeignKey(User.id),nullable=False)
title = Column(String(100))
img_type = Column(VARCHAR(20))
uuid = Column(String(60))
story = Column(String(500))
url = Column(String(255))
thumb_up=Column(INTEGER,default=0)
create_time=Column(DATETIME,default=func.now())
def single_to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
def dobule_to_dict(self):
result = {}
for key in self.__mapper__.c.keys():
if getattr(self, key) is not None:
result[key] = str(getattr(self, key))
else:
result[key] = getattr(self, key)
return result
...
...
...
def init_db():
Base.metadata.create_all(engine)
def drop_db():
Base.metadata.drop_all(engine)
#drop_db()
init_db()
通过命令python base_model.py 引擎会自动未我们创建数据库表,其中引擎是通过以下代码创建
#db.python
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from server_config import MYSQL_DATABASE_CONN_URI, db_config
#define engine
engine = create_engine(MYSQL_DATABASE_CONN_URI % (\
db_config['user'],
db_config['passwd'],
db_config['host'],
db_config['db'],
db_config['charset']),
echo=True,pool_size=100, max_overflow=20);
Session = sessionmaker(autocommit=False,bind=engine)
4.2 python3 及flask环境配置
在AWS上的python3安装会出现问题,这里使用dev版本,dev版本包含了所需编译的所有依赖。
sudo apt-get install python3-dev
4.3 配置flask环境
flask环境需要先下载virtualenv为其创建虚拟环境
sudo pip install virtualenv
或者
sudo apt-get install python-virtualenv
使用以下命令创建并激活虚拟环境
cd /home/ubuntu
mkdir caddy //创建项目跟目录
cd caddy 切换到根目录
virtualenv flask 创建虚拟环境
source ./flask/bin/activate 激活虚拟环境
下载项目所需依赖
pip install Flask //国内的可以使用豆瓣源 -i https://pypi.doubanio.com/simple
pip install flask-sqlalchemy ORM
pip install pymysql 连接数据库
pip install flask-cors 解决跨域
pip install flask-restful retfule Api
通过FileZilla将项目拷贝到 /home/ubuntu/caddy根目录下,其中h5为我们的前端项目,flask为虚拟环境,其他未服务端项目文件
4.4 配置gunicorn
部署要使用 gunicorn 作为web服务容器,首先要先切换到虚拟环境通过以下命令安装。
(flask) root@ip-xxx-xx-xx-xx:/home/ubuntu/caddy# pip install gunicorn
切换到项目根目录,创建gunicore.conf配置文件
workers = 4
backlog = 2048
bind = '127.0.0.1:5000'
proc_name='caddy'
logfile = '/home/ubuntu/caddy/log/debug.log'
daemon=True
errorlog='/home/ubuntu/caddy/log/error.log'
daemon=True 表示创建的是守护进程。通过命令启动后台服务
gunicorn run:app -c gunicore.conf //这里run:app 表示run.py模块以及内部通过Flask创建的对象名
启动完成后,可以通过ps -ef | grep caddy 查看创建的守护进程,这样后台服务就启动了
4.4 配置Nginx
caddy采用了前后端分离的方式进行开发,需要使用Nginx进行代理,通过以下命令下载nginx
sudo apt-get install nginx
进入用户配置目录/etc/nginx/conf.d下创建caddy.conf ,并进行以下配置
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
location / {
root /home/ubuntu/caddy/h5;
index index.html index.htm;
}
location ^~/api {
client_max_body_size 20m;
proxy_pass http://127.0.0.1:5000;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
}
location /images/ {
alias /home/ubuntu/caddy/images/;
autoindex on;
}
}
location访问的根目录配置为我们的前端项目目录 /home/ubuntu/caddy/h5,默认80端口,location ^~/api配置的是前端页面访问的后端接口,这里需要设置代理,我们的后端接口是在http://127.0.0.1:5000上,这样前端页面访问后端接口的连接应该为http://服务器公网Ip/api/接口名称,请求会通过Nginx转发给flask服务端。location /images/配置的是项目的静态资源图片,配置后可以通过http://服务器公网IP/images进行访问。
配置修改后,通过命令载入启动
nginx -s reload
其他命令
service nginx start
nginx -s quit
到这里所有的配置已经完成,最后还需要配置AWS的安全组,因为AWS服务默认是未开启HTTP的80端口,所以我们的项目访问不了,这里登录AWS后在安全组一栏未我们服务器所在的安全组添加以下策略。