AWS 云应用安装与部署

一、AWS服务器申请

登录awseducate.com,依次点击AWS Account->AWS educate starter account->Aws console 创建EC2实例

创建过程中选择系统,这里我们选择Ubuntu18.04 ,同时需要保存私钥mykey.pem文件。后面使用FTP工具及XShell客户端连接服务器时会用到。创建好的实例如下图所示

AWS 云应用安装与部署_第1张图片
image-20200806184748127.png

二、Xshell配置

创建好EC2实例后,需要在本地电脑上通过客户端工具链接远端服务器,这里我们选择Xshell进行配置

AWS 云应用安装与部署_第2张图片
image-20200808181342208.png

主机填写EC2实例的公有DNS名称,可以自行在EC2实例列表点击查看。

AWS 云应用安装与部署_第3张图片
image-20200808181316932.png

选择用户身份验证,填写用户名ubuntu(这里名称根据我们所选的系统填写,一般为ec2-user)选择创建实例时保存的mykey.pem文件。然后点击连接就可以看到连接上云端服务器。

AWS 云应用安装与部署_第4张图片
img

AWS 云应用安装与部署_第5张图片
image-20200808181622853.png

三、FTP工具配置

FTP工具主要用于向服务器上传程序和资源,这里我们使用FileZilla。

AWS 云应用安装与部署_第6张图片
image-20200808181855440.png

首先点击编辑->设置弹出上面的设置框,选择SFTP然后添加密钥文件,选择mykey.pem文件确认。

AWS 云应用安装与部署_第7张图片
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 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为虚拟环境,其他未服务端项目文件

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 云应用安装与部署_第8张图片
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_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后在安全组一栏未我们服务器所在的安全组添加以下策略。

AWS 云应用安装与部署_第9张图片
image-20200808092344545.png

你可能感兴趣的:(AWS 云应用安装与部署)