美文网首页
AWS 云应用安装与部署

AWS 云应用安装与部署

作者: esli | 来源:发表于2020-08-29 17:56 被阅读0次

    一、AWS服务器申请

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

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

    image-20200806184748127.png

    二、Xshell配置

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

    image-20200808181342208.png

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

    image-20200808181316932.png

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

    img
    image-20200808181622853.png

    三、FTP工具配置

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

    image-20200808181855440.png

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

    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 查看创建的守护进程,这样后台服务就启动了

    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后在安全组一栏未我们服务器所在的安全组添加以下策略。

    image-20200808092344545.png

    相关文章

      网友评论

          本文标题:AWS 云应用安装与部署

          本文链接:https://www.haomeiwen.com/subject/sksjsktx.html