AWS EC2配置Node和Python的线上环境

本地的Webapp搭建完成,自然要送到外网上,是骡子是马遛一遛先,于是自然而然地选择了拥有一年免费试用权的AWS EC2服务器。闲话少叙,直接上配置(账号申请步骤略去,只需要有有效的Email、信用卡和手机号即可):

一 初见EC2

  1. 进入EC2控制台后,首先选择EC2节点的地域,目测并没有中国相关的可以选,我先选择了新加坡节点,后来发现并不好用,于是选择了首尔节点。


    选择区域
  2. 依次完成以下步骤:


    启动实例
  3. 选择实例类型


    选择实例类型

    默认走起

    点击启动
  4. 配置秘钥


    选择“创建新密钥对”

    填写密钥对名称并下载,然后启动实例

    wellDone

    可以查看实例状态

    至此,免费的EC2实例搞定!

二 配置EC2

  1. 连接EC2
chmod 400 devildi.pem

ssh -i "devildi.pem" ec2-user@ec2-13-124-88-25.ap-northeast-2.compute.amazonaws.com

sudo passwd root #进入EC2后配置root用户,密码需要输入两次
exit #退出root用户
  1. 安装nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash

source ~/.bashrc

nvm install 14
  1. 安装配置Nginx
//安装
sudo yum install nginx
//配置

cd /etc/nginx 
sudo vim nginx.conf

//配置文件如下:
user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    map $http_upgrade $connection_upgrade {
      default upgrade;
      ' '   close;
     }
     upstream websocket {
      ip_hash;
      server localhost:4000;
     }
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80;
        listen       [::]:80;
        server_name  nextsticker.cn;
        root         /home/ec2-user/mywork/build;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
           try_files $uri /index.html =404 ;
           add_header   Cache-Control no-cache;
           expires      1d;
       }
       location /api/ {
           proxy_pass http://127.0.0.1:4000;
       }
        location /socket.io {
            proxy_pass http://localhost:4000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade; #此处配置 上面定义的变量
            proxy_set_header Connection $connection_upgrade;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
    # Settings for a TLS enabled server.
#
    server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  nextsticker.cn;
        root         /home/ec2-user/mywork/build;
#
        ssl_certificate "/home/ec2-user/mywork_backend/Nginx/nextsticker.cn.crt";
        ssl_certificate_key "/home/ec2-user/mywork_backend/Nginx/nextsticker.cn.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
     #   ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
#
        location / {
           index  index.html index.htm;
           try_files $uri /index.html =404 ;
           add_header   Cache-Control no-cache;
           expires      1d;
        }
        location /api/ {
           proxy_pass http://127.0.0.1:4000;
        }
        location /socket.io {
            proxy_pass http://localhost:4000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade; #此处配置 上面定义的变量
            proxy_set_header Connection $connection_upgrade;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}
//重启Nginx
sudo service nginx restart
//删除Nginx
sudo yum remove nginx
  1. 安装git并clone项目
sudo yum install git
git clone https://github.com/devildi/nt-koa.git
  1. 安装配置mongodb
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.2.7.tgz
tar -zxvf mongodb-linux-x86_64-amazon-3.2.7.tgz
mkdir -p mongodb/data
mkdir -p mongodb/log
touch /home/ec2-user/mongodb/log/master.log
touch /home/ec2-user/mongodb/master.pid
cd mongodb-linux-x86_64-amazon-3.2.7
sudo vim config.conf

//在config.conf文件中编辑
dbpath=/home/ec2-user/mongodb/data
logpath=/home/ec2-user/mongodb/log/master.log  
pidfilepath=/home/ec2-user/mongodb/master.pid  
directoryperdb=true  
logappend=true  
#replSet=testrs  
bind_ip=127.0.0.1
port=27017  
oplogSize=10000  
fork=true  
noprealloc=true  

#启动mongod服务
./bin/mongod -f config.conf

//本地数据备份到本地
sudo ./bin/mongodump -h 127.0.0.1:27017 -d davinci -o /Users/apple/Desktop/projects/mywork_backend/database -u woody -p ******
//云端数据库备份到本地
sudo ./bin/mongodump -h 54.180.82.174:27017 -d davinci -o /Users/apple/Desktop/projects/mywork_backend/database -u woody -p ******
//本地数据恢复
./bin/mongorestore -h 127.0.0.1:27017 -d davinci /Users/apple/Desktop/projects/mywork_backend/database/davinci -u woody -p ****** --drop
//云端数据库数据恢复
./bin/mongorestore -h 54.180.82.174:27017 -d davinci /Users/apple/Desktop/projects/mywork_backend/database/davinci -u woody -p ****** --drop

安装数据库时可能会遇到如下错误:

error while loading shared libraries: libssl.so.10: cannot open shared object file: No such file or directory

解决方案:

wget https://vault.centos.org/centos/8/AppStream/x86_64/os/Packages/compat-openssl10-1.0.2o-3.el8.x86_64.rpm

rpm -ivh compat-openssl10-1.0.2o-3.el8.x86_64.rpm --nodeps --force
  1. 安装PM2
npm install pm2 -g

pm2 start app.js -i max#启动服务

pm2 list #查看所有进程

pm2 stop all #关闭所有进程
  1. 配置EC2 入口策略
    选择安全组


    选择安全组

    添加入站策略
  2. 阿里云域名解析
    11.11买的域名,一年十几块钱:


    阿里云注册域名
  3. 配置Python开发环境之切换Python默认版本为3.x

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
sudo update-alternatives --config python

10.安装配置Python的守护进程工具:Supervisor

pip install supervisor #安装
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
#生成supervisor配置文件,位置在:/etc/supervisor/supervisord.conf

vim /etc/supervisor/supervisord.conf
#去掉“;”,“;”相当于注释
[include]
files = /etc/supervisor/config.d/*.conf

#在/etc/supervisor/config.d文件夹下新建项目的.conf配置文件,每个文件管理一个进程:
mkdir /etc/supervisor/config.d
vim grpc.conf

[program:grpc]   #grpc 为程序的名称
command=python server.py #需要执行的命令
directory=/home/ec2-user/mywork_backend/GRPC  #命令执行的目录
user=root #用户
stopsignal=INT
autostart=true #是否自启动
autorestart=true #是否自动重启
startsecs=3 #自动重启时间间隔(s)
stderr_logfile=/home/ec2-user/ossoffical.err.log #错误日志文件
stdout_logfile=/home/ec2-user/ossoffical.out.log #输出日志文件

#启动supervisor
supervisord -c /etc/supervisor/supervisord.conf

#查看进程状态
supervisorctl
grpc    RUNNING   pid 20732, uptime 0:17:52#输出显示grpc正在运行中
#当端口被占用时
ps -ef |grep supervisor
kill -9 端口号#

11.配置root用户

sudo passwd root#必须要要在ec2-user用户下执行
#按照提示输入两次密码即可
su root#输入密码即可切换到root用户
su ec2-user#切换到普通用户

大功告成

浏览器输入nextsticker.cn或者https://nextsticker.cn,成功访问!

成功访问

附录

将本地项目上传至github

  1. 删除本地仓库rm -rf .git
  2. 在本地项目根目录下git init
  3. git add .
  4. git status
  5. git commit,若出现了很多红色文件,那么就需再次进git add .
  6. git remote add origin+这个项目的github地址 ,当出现fatal: remote origin already exists.时,使用此命令git remote rm origin即可
  7. git push -u origin master

搞定收工!

为mongodb增加安全措施

部署于AWS EC2的mongodb中的数据“离奇失踪”了,但是多了一份Readme数据表,打开一看:

勒索文件

结合搜索引擎的结果来看,我的部署在公网的裸奔数据库怕是受到攻击了,于是亡羊补牢:为mongodb添加用户权限。

  1. 修改ip地址
    默认值(0.0.0.0)是所有的IP地址都能访问,该参数指定MongoDB对外提供服务的绑定IP地址,用于监听客户端 Application的连接,客户端只能使用绑定的IP地址才能访问mongod,其他IP地址是无法访问的。
    当在config.conf中修改bind_ip=127.0.0.1时,数据库仅本机访问,这里将此句注释。
  2. 修改默认mongodb TCP端口
    登录时需要./bin/mongo -port ****
  3. 创建管理员用户
#登录数据库
./mongo 
use admin
db.createUser({user:"devildi", pwd:"**********",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

其中,userAdminAnyDatabase为授予在所有数据库上管理User的权限,然后在admin库下进行授权:db.auth('devildi','******'),当返回值为1时,就可以对其他业务数据库授权了。

  1. 创建单个数据库管理员
use nt
db.createUser({user:"woody", pwd:"******",roles:[{role:"readWrite",db:"nt"}]})
show users
#即用户woody对nt数据库有读写权限
  1. 开启权限认证
    config.conf中添加auth=true
  2. 重启mongod服务
pkill mongod
./bin/mongod -f config.conf
  1. 登录nt数据库
./mongo 127.0.0.1:27017/nt -u woody -p ******

通过PM2脚本启动node服务

//在production.yaml中编辑:
apps:
  - script: ./SSR/server.js
    name: woody 
    env_production:
      NODE_ENV: production
      HOST: localhost

之后可以通过pm2 start production.yaml命令启动脚本。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容