AWS|AWS 云应用安装与部署

一、AWS服务器申请
登录awseducate.com,依次点击AWS Account->AWS educate starter account->Aws console 创建EC2实例
创建过程中选择系统,这里我们选择Ubuntu18.04 ,同时需要保存私钥mykey.pem文件。后面使用FTP工具及XShell客户端连接服务器时会用到。创建好的实例如下图所示
AWS|AWS 云应用安装与部署
文章图片
image-20200806184748127.png 二、Xshell配置
创建好EC2实例后,需要在本地电脑上通过客户端工具链接远端服务器,这里我们选择Xshell进行配置
AWS|AWS 云应用安装与部署
文章图片
image-20200808181342208.png 主机填写EC2实例的公有DNS名称,可以自行在EC2实例列表点击查看。
AWS|AWS 云应用安装与部署
文章图片
image-20200808181316932.png 选择用户身份验证,填写用户名ubuntu(这里名称根据我们所选的系统填写,一般为ec2-user)选择创建实例时保存的mykey.pem文件。然后点击连接就可以看到连接上云端服务器。
AWS|AWS 云应用安装与部署
文章图片
img
AWS|AWS 云应用安装与部署
文章图片
image-20200808181622853.png 三、FTP工具配置
FTP工具主要用于向服务器上传程序和资源,这里我们使用FileZilla。
AWS|AWS 云应用安装与部署
文章图片
image-20200808181855440.png 首先点击编辑->设置弹出上面的设置框,选择SFTP然后添加密钥文件,选择mykey.pem文件确认。
AWS|AWS 云应用安装与部署
文章图片
image-20200808182053331.png 然后点击文件->站点管理器,在协议选择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 funcBase = 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 resultclass 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 importsessionmaker 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为虚拟环境,其他未服务端项目文件
AWS|AWS 云应用安装与部署
文章图片
image-20200808190919386.png 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 查看创建的守护进程,这样后台服务就启动了
AWS|AWS 云应用安装与部署
文章图片
image-20200808143954895.png 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_namelocalhost; location / { root/home/ubuntu/caddy/h5; indexindex.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 云应用安装与部署】到这里所有的配置已经完成,最后还需要配置AWS的安全组,因为AWS服务默认是未开启HTTP的80端口,所以我们的项目访问不了,这里登录AWS后在安全组一栏未我们服务器所在的安全组添加以下策略。
AWS|AWS 云应用安装与部署
文章图片
image-20200808092344545.png

    推荐阅读