AWS-EC2使用记录
aws ec2免费版使用笔记
AWS EC2设置时区
默认情况下,Amazon Linux 实例设置为 UTC (协调世界时) 时区,但是您可能想将实例上的时间更改为本地时间或网络中的其他时区。
重要:这些过程适用于 Amazon Linux。有关其他发布版本的更多信息,请参阅其具体文档。
更改实例上的时区
1、确定将在实例上使用的时区。/usr/share/zoneinfo 目录包含时区数据文件的层次结构。浏览该位置的目录结构,查找针对您的时区的文件。
[ec2-user ~]$ ls /usr/share/zoneinfo
Africa Chile GB Indian Mideast posixrules US
America CST6CDT GB-Eire Iran MST PRC UTC
Antarctica Cuba GMT iso3166.tab MST7MDT PST8PDT WET
Arctic EET GMT0 Israel Navajo right W-SU
...
该位置的部分条目是目录 (如 America),这些目录包含针对特定城市的时区文件。查找要用于实例的城市 (或时区中的一个城市)。
在此示例中,您可以使用上海的时区文件 /usr/share/zoneinfo/Asia/Shanghai
2、使用新时区更新 /etc/sysconfig/clock
文件。
(1)使用您常用的文本编辑器(如 vim 或 nano)打开 /etc/sysconfig/clock
文件。您需要在编辑器命令中使用 sudo,因为 /etc/sysconfig/clock 归 root 所有。
(2)查找 ZONE 条目,将其更改为时区文件 (忽略路径的 /usr/share/zoneinfo 部分)。例如,要更改为上海时区,请将 ZONE 条目更改为以下内容:
ZONE="Asia/Shanghai"
注意: 请勿将 UTC=true 条目更改为其他值。此条目用于硬件时钟;如果您在实例上设置了其他时区,则无需调整此条目。
(3)保存文件,退出文本编辑器。
3、在 /etc/localtime
与时区文件之间创建一个符号链接,以便实例在引用本地时间信息时找到此时区文件。
[ec2-user ~]$ sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
4、重启系统,以便所有服务和应用程序接受新时区信息。
[ec2-user ~]$ sudo reboot
在 Amazon Linux 上更改时区
https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/set-time.html
AWS EC2 型号及价格
型号 | vCPU | ECU | 内存 (GiB) | 实例存储 (GB) | Linux/UNIX 使用量 |
---|---|---|---|---|---|
c4.xlarge | 4 | 16 | 7.5 GiB | 仅限 EBS | 每小时 0.199 USD |
c4.2xlarge | 8 | 31 | 15 GiB | 仅限 EBS | 每小时 0.398 USD |
m4.xlarge | 4 | 13 | 16 GiB | 仅限 EBS | 每小时 0.20 USD |
m4.2xlarge | 8 | 26 | 32 GiB | 仅限 EBS | 每小时 0.40 USD |
底层微服务 prod 生产环境一般用 c4.2xlarge ,有些并发量小的用 c4.xlarge
部分后台服务 prod 生产环境使用 m4.xlarge
staging预生产环境一般使用 c4.xlarge ,部分底层服务例如user用户服务staging环境也用的 c4.2xlarge
Amazon EC2 定价
https://aws.amazon.com/cn/ec2/pricing/on-demand/
Amazon EC2 实例类型
https://aws.amazon.com/cn/ec2/instance-types/
实例配置
启动实例
启动免费ec2实例,我选择的是第一个 Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-6cd6f714
启动后记下 实例 ID,公有 DNS (IPv4),IPv4 公有 IP,以后连接时用。
Linux版本
Amazon Linux 2 AMI ,从/etc/os-release
可以看到是类 RHEL/CentOS 发行版,Amazon Linux 2 是 CentOS 7.x
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
uname 信息如下:
uname -a
Linux ip-xx-xx-xx-xx.us-west-2.compute.internal 4.14.62-70.117.amzn2.x86_64 #1 SMP Fri Aug 10 20:14:53 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
密钥对
启动实例时,会让添加一个密钥对,可以直接让系统新生成,然后提示下载一个.pem文件,这个就是自己的私钥。
把私钥放到一个安全的目录,一般是 ~/.ssh/
,然后将私钥的权限改小才能使用,
管理多个密钥对
如果想从多台机器登陆ec2,比如Windows和mac,需要生成多个密钥对。
在ec2控制台左侧选择“密钥对”->“创建密钥对”,输入名称就会创建一个密钥对,同时会下载.pem私钥文件。
但我使用新创建的密钥对在另外一台电脑上登录时,提示:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
后来又试了 在本地 ssh-keygen生成密钥对,把公钥上传到 aws页面上,登录时还是提示这个错误。
最后只能把第一次生成的 .pem 私钥拷贝到另一台电脑上,登录成功了。
懂ssh原理的话就知道,其实只要把新电脑的公钥贴到~/.ssh/authorized_keys
中即可
.pem私钥权限过大无法登陆
确保 .pem 文件具有权限 0400 而不是 0777。
否则登录时提示:
错误:未保护的私钥文件
在mac使用时,0644的权限都不行:
xxxxx ~/.ssh ssh aws
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/xxx/.ssh/xxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/xxxx/.ssh/xxxx.pem": bad permissions
ec2-user@ec2-xxxxxx.us-west-2.compute.amazonaws.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
必须保护您的私钥文件,防止其他任何用户对其进行读写操作。如果除您外其他任何人都能够读取或写入您的私钥,则 SSH 会忽略您的密钥
获取您在启动实例时指定的密钥对的 .pem 文件在您电脑上位置的完全限定路径。确保 .pem 文件具有权限 0400 而不是 0777。chmod 0400 .ssh/my_private_key.pem
改小私钥文件的权限
用户名
对于 Amazon Linux 2 或 Amazon Linux AMI,用户名称是 ec2-user
ssh密钥登录
ssh -i myprivate.pem ec2-user@ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
或者在~/.ssh/config
中增加配置如下,以后直接使用ssh aws
即可登录
Host aws
HostName ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
IdentityFile ~/.ssh/myprivate.pem
User ec2-user
使用 SSH 连接到 Linux 实例
https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html
scp上传文件到服务器
scp -i ~/.ssh/myprivate.pem filename ec2-user@ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com:~
ec2安全组(访问控制)
EC2防火墙默认阻断了除ssh 22端口外的所有入站流量
安全组主要是做访问控制的,比如ip白名单、黑名单、开发哪些端口等等。
可以编辑EC2的Scurity Groups安全组配置,根据自己需要开放入站端口
编辑aws ec2的安全组,开放tcp的80端口给nginx用,3306给mysql用,8080端口给Tomcat用,8001-8008端口预留给其他服务用。
一般来说,web服务都可以通过nginx进行转发,可以只暴露80端口,不过为了方便测试,也暴露了一些其他端口。
端口使用情况汇总:
80: nginx监听端口
3306: mysql连接端口
8001: springboot测试服务
ec2安全组配置
注意:
1、描述必须全部是英文字符,否则无法保存。
2、类型中已经预定义了好多常用协议,直接选择即可,如果没有合适的,选择 自定义TCP规则 可满足大多数情况。
软件安装
yum安装lrzsz
$ yum list lrzsz
已加载插件:extras_suggestions, langpacks, priorities, update-motd
24 packages excluded due to repository priority protections
可安装的软件包
lrzsz.x86_64 0.12.20-36.amzn2.0.2 amzn2-core
使用yum安装lrzsz:sudo yum -y install lrzsz
yum安装java8
检索包含java的列表yum list java*
可以看到在 aws的默认库 amzn2-core 中已有java
检索1.8的列表yum list java-1.8*
安装1.8.0的所有文件(必须使用root用户)sudo yum -y install java-1.8.0-openjdk*
测试java运行环境java -version
查看安装目录,先看看java命令的目录:
[ec2-user@ip- usr]$ which java
/usr/bin/java
[ec2-user@ip- usr]$ ll -h /usr/bin/java
lrwxrwxrwx 1 root root 22 Sep 16 06:13 /usr/bin/java -> /etc/alternatives/java
可知安装到了 /etc/alternatives/ 中
yum安装git
sudo yum install git
git 需要依赖 curl,zlib,openssl,expat,libiconv 等库,会自动安装这些依赖。
yum安装nginx
添加nginx yum源:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装nginx:
sudo yum install nginx
安装后配置文件位置 /usr/local/nginx/conf/nginx.conf
查看nginx安装路径:
$ rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.14.2
/usr/share/doc/nginx-1.14.2/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx
nginx配置文件 nginx.conf
# work进程的用户
user ec2-user ec2-user;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
map $http_origin $corsHost {
default 0;
"~http://madaimeng.com" http://madaimeng.com;
"~http://devgou.com" http://devgou.com;
"~http://masikkk.com" http://masikkk.com;
"~http://localhost:4000" http://localhost:4000;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
server {
listen 80;
server_name api.masikkk.com api.madaimeng.com api.devgou.com;
location / {
proxy_pass http://localhost:8001;
add_header 'Access-Control-Allow-Origin' $corsHost;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name devgou.com www.devgou.com;
location / {
root /home/ec2-user/git/madaimeng;
index index.html;
}
}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
yum安装nodejs和npm
Installing Node.js via package manager
https://nodejs.org/en/download/package-manager/
NodeSource Node.js Binary Distributions
https://github.com/nodesource/distributions/blob/master/README.md
使用官方脚本添加NodeSource源
nodejs官方制作了添加node源的在线脚本,直接下载执行就行,不需要再手动添加 epel 和 remi 源了
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
安装过程的输出信息如下:
sudo curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
## Installing the NodeSource Node.js 8.x LTS Carbon repo...
## Inspecting system...
+ rpm -q --whatprovides redhat-release || rpm -q --whatprovides centos-release || rpm -q --whatprovides cloudlinux-release || rpm -q --whatprovides sl-release
+ uname -m
## Confirming "el7-x86_64" is supported...
+ curl -sLf -o /dev/null 'https://rpm.nodesource.com/pub_8.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm'
## Downloading release setup RPM...
+ mktemp
+ curl -sL -o '/tmp/tmp.frFXm7r4k8' 'https://rpm.nodesource.com/pub_8.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm'
## Installing release setup RPM...
+ rpm -i --nosignature --force '/tmp/tmp.frFXm7r4k8'
## Cleaning up...
+ rm -f '/tmp/tmp.frFXm7r4k8'
## Checking for existing installations...
+ rpm -qa 'node|npm' | grep -v nodesource
## Run `sudo yum install -y nodejs` to install Node.js 8.x LTS Carbon and npm.
## You may also need development tools to build native addons:
sudo yum install gcc-c++ make
## To install the Yarn package manager, run:
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum install yarn
安装nodejs
按照安装NodeSource源时输出信息的提示,使用yum来安装nodejs
sudo yum install -y nodejs
安装nodejs时自动会安装npm工具,完成后查看版本验证安装成功:
node -v
v8.15.0
npm -v
6.4.1
yum安装nodejs
https://www.jianshu.com/p/695d9cafcd4e
AWS EC2 自己安装mysql及远程访问
安装mysql
和普通linux下安装mysql大致相同,看mysql官网的文档即可。
或参考笔记 MySQL-Linux安装
root/123456
Getting Started with MySQL - Installing and Starting MySQL
https://dev.mysql.com/doc/mysql-getting-started/en/#mysql-getting-started-installing
创建可远程访问的mysql账号
创建一个账号,Host为%
,即允许所有主机连接,并给账号授权。
然后在ec2命令行中验证可以本地登录mysql
配置mysql绑定ip
查看mysql server绑定ipshow variables like 'bind_address';
默认是*
,表示接收所有的IPv4 或 IPv6 连接请求,如没有更改过就不用配置。
编辑EC2安全组配置,放开3306端口入站流量
mysql安装后还不能远程连接,因为EC2防火墙默认阻断了除ssh 22端口外的所有入站流量,
编辑EC2的Scurity Groups安全组配置,添加允许所有来源的3306端口入站流量
EC2开启MySql远程访问
https://blog.csdn.net/timberwolf_2012/article/details/47350215
远程连接mysql数据库
之后便可利用aws提供的域名远程连接mysql访问
可以在Windows或Mac命令行中登录,也可以使用Navicat或DataGrip等图形界面登录
C:\Users\xxx> mysql -u username -h ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com -p
Enter password: *******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 39
Server version: 5.6.41 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
通过自定义域名远程连接MySQL数据库
EC2 给我们提供了公网IP和域名,可以在自己的DNS提供商处配置自定义域名解析到这个公网IP,这样就可以使用域名远程连接了。
比如在阿里云上,我有个域名 devgou.com, 新加个二级域名: mysql.devgou.com 解析到EC2提供的域名,然后就可以使用域名访问了。mysql -u usrname -h mysql.devgou.com -ppasword
注意解析到 IPv4 地址要选择A记录,解析到域名要选CNAME记录。
AWS EC2部署Spring Boot应用及自定义域名访问
后台启动spring boot应用及本地访问
启动应用的脚本:start.sh
#!/bin/bash
nohup java -jar yourapp.jar --server.port=8001 &
或者直接在命令启动:
sudo nohup java -jar blog-0.0.1-SNAPSHOT.jar --server.port=8001 &
注意必须sudo以root权限,否则报错无法启动:
默认以8080端口启动,可以自己指定端口,我这里用的8001。
用80启动后,就可以直接用域名,不用加端口访问了,因为http默认使用80端口
启动后可以在aws本地尝试用localhost访问,以及用aws给分配的公有DNS访问。
当然Spring boot中先要有处理/
请求的Controller代码,可以先简单的返回个hello world
如果以8080端口启动:
curl localhost:8080/
curl ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com:8080/
如果以80端口启动:
curl localhost/
curl ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com/
springboot 后台运行
https://www.cnblogs.com/bigben0123/p/7910036.html
配置nginx请求转发
监听我三个域名各自的api子域名,转发到localhost:8001,也就是springboot监听的端口:
server {
listen 80;
server_name api.masikkk.com api.madaimeng.com api.devgou.com;
location / {
proxy_pass http://localhost:8001;
}
}
ec2安全组放开80端口入站流量
编辑ec2安全组,放开nginx监听的80端口的入栈流量。
自定义域名解析到aws
目前我的域名都放在阿里云,这里以阿里云中的域名 devgou.com 解析为例。
域名解析到EC2
CNAME表示解析到一个域名,而不是一个ipv4地址
www表示解析 www.example.com 的访问
@表示解析 example.com 的访问
主机记录api,也就是我们新定义了一个子域名 api.devgou.com
另外,在另外两个域名上也都加上 api子域名到aws的解析。
以后,我用自己3个域名的api子域名都可以访问springboot接口了:
http://api.devgou.com/
http://api.masikkk.com/
http://api.madaimeng.com/
同时,也不影响原本博客的访问。
上一篇 博客项目方案
下一篇 VSCode使用笔记
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: