AWS Lightsail CentOS6 使用记录
2018年9月份开始使用美区AWS的免费一年EC2服务器,眼看就要到期,最近正在找性价比高的替代品,先试试AWS推出的 Lightsail VPS。
免费的EC2用了一年,都挺满意,稳定性很好,唯一非常不爽的一点是ssh远程连接敲命令非常卡,敲完后一个字母一个字母的往外蹦,试了试 Lightsail,也是一个德行。不过部署在EC2上的网站和服务接口都很快。反正第一个月免费,先搞一套环境试试。
用了几天意外发现从我本地连lightsail的网络状况竟然比ec2要好,scp上传一个部署jar包时,lightsail秒传,ec2反而慢。敲命令lightsail也更快些,有的时候lightsail能流畅敲命令,ec2竟然卡的不行。
花了一周多的时间,把原来的ec2上的数据库、服务都迁到了lightsail上,现在 http://devgou.com/ 域名访问博客已经完全在lightsail了,免费的先用一个月,感觉还行就续费一直用了,可以考虑升级到5美元每月的1G实例,不过貌似无法平滑升级,估计到时又是一次折腾,不过每次在一个裸Linux上安装环境都是一次学习的过程,每次都会遇到各种新问题,学到新东西,越来越熟练。
用了20天lightsail后,发现shell命令的流畅度比EC2要好太多,决定一直用下去了。
Lightsail和EC2的区别
EC2 是 AWS 的明星产品,独立服务器,完全可做企业级生产服务器,我们公司就用的这个,个人搭自己的博客感觉有点儿浪费。
Lightsail 是 AWS 推出的和其他 VPS 厂商竞争的廉价虚拟服务器,适合个人自己玩。
Lightsail 和 EC2 完全是两套东西,管理控制台也是各自独立的,EC2比较高级复杂,Lightsail就很简陋,没有安全组、入站出站端口限制啥的,用起来很简单。
Linux版本我都选的 Amazon Linux AMI, 我18年的EC2上就是7.x版本的linux了,19年的Lightsail上竟然还是6.x的。
防火墙配置
在 ec2 中叫安全组,在Lightsail中位于 “联网-防火墙” 配置项下,都是用于控制哪些IP和端口可以访问服务器的,EC2可以控制到IP,lightsail只能控制端口。
Lightsail防火墙默认阻断了除ssh 22和http 80端口外的所有流量
我目前配置如下:
Lightsail防火墙
域名解析配置
我的 devgou.com 域名解析配置如下
devgou域名解析
A记录表示解析到一个ipv4
主机记录www表示解析 www.example.com 的访问
主机记录@表示解析 example.com 的访问
主机记录www和@,解析到服务器ip,用于博客web页面访问
主机记录api,即新定义了一个子域名 api.devgou.com,解析到服务器ip,用于java spring后台接口
主机记录mysql,即新定义了一个子域名 mysql.devgou.com,解析到服务器ip,用于mysql
主机记录mail解析到ip,配合MX类型主机记录@解析到 mail.devgou.com,用于邮件服务器
主机记录webhooks,即新定义了一个子域名 webhooks.devgou.com,解析到服务器ip,用于git钩子
设置或更改root密码
使用AWS默认的EC2账户登录服务器后,用户权限受到很大的限制,有些目录无法访问,需要切换到root账户下工作
初次登录aws后并没有默认的root用户密码,需要在ec2用户下创建root密码,可以使用命令sudo passwd root
在出现提示后创建新密码
如果出现root密码丢失的情况,也可以使用上边的命令重新生成新的root密码
密码更改完成,后续的切换用户操作相信所有人都应该没有问题的su 操作即可
Linux版本
Amazon Linux AMI ,从/etc/os-release
可以看到是类 RHEL/CentOS 发行版,Lightsail的这个2018.3版本对应的是 RHEL/CentOS 6.x(没有systemd),EC2中默认的 Amazon Linux 2 是 RHEL/CentOS 7.x
$ cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
uname 信息
$ uname -a
Linux ip-xx-xx-xx-xx 4.14.128-87.105.amzn1.x86_64 #1 SMP Thu Jun 20 00:43:44 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
时区设置为东八区
默认情况下,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
不想重启系统的话,可以分别重启mysql和spring,以便读取新时区。
在 Amazon Linux 上更改时区
https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/set-time.html
ssh登录
创建实例后会分配一个公网IP,要ssh链接的话可以在 Lishtsail 的 账户 页面下看到有生成好的ssh私钥
私钥权限过大无法登陆
确保 ssh私钥 文件具有权限 0400 而不是 0777。
否则登录时提示:
错误:未保护的私钥文件
在mac使用时,刚下载下来的私钥pem文件是0644权限,都不行:
~/.ssh ssh -i lightsail.pem xxx@xx.xx.xx.xx
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'lightsail.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 "lightsail.pem": bad permissions
xx@xx.xx.xx.xx: Permission denied (publickey).
必须保护您的私钥文件,防止其他任何用户对其进行读写操作。如果除您外其他任何人都能够读取或写入您的私钥,则 SSH 会忽略您的密钥
获取您在启动实例时指定的密钥对的 .pem 文件在您电脑上位置的完全限定路径。确保 .pem 文件具有权限 0400 而不是 0777。chmod 0400 .ssh/lightsail.pem
改小私钥文件的权限即可
yum安装git
$ yum list git
已加载插件:priorities, update-motd, upgrade-helper
可安装的软件包
git.x86_64 2.14.5-1.60.amzn1
直接yum安装即可sudo yum install git
git 需要依赖 perl 等库,会自动安装这些依赖。
ssh连接Coding和github
ssh-keygen -P ''
生成密钥对, 使用默认加密算法rsa,默认文件名,得到私钥文件 id_rsa,公钥文件 id_rsa.pub
登陆Coding页面,添加公钥到codingssh -T git@git.dev.tencent.com
测试连接是否成功
ssh-keygen -P '' -f github
生成密钥对, 使用默认加密算法,文件名指定github,得到私钥文件 github,公钥文件 github.pub
登录github页面,添加公钥到githubssh -T git@github.com
测试连接是否成功
配置 ~/.ssh/config 文件(没有的话自己重建一个),指定不同域名使用不同key
Host git.dev.tencent.com git@git.dev.tencent.net
IdentityFile ~/.ssh/id_rsa
Host github.com *.github.com
IdentityFile ~/.ssh/github
注意:
1、执行 ssh-keygen
命令时,不要加 sudo
,否则生产的文件拥有者是root,当前账户无法读取密钥文件,会导致 Permission denied (publickey)
2、执行 ssh -T git@github.com
测试连接是否成功时,也不能加 sudo
,否则账户不对,读取不到密钥。
git clone Permission denied (publickey)
clone 代码仓库时有个问题,如果不加 sudo
没权限自动创建目录,如果加了 sudo
又读取不到密钥,因为账户不对。
最后只能先创建目录,并把文件拥有者改为当前用户 ec2-user ,然后再指定目录 clone,真麻烦,这问题卡了我2天时间。
私钥文件所有者非当前用户导致Permission denied (publickey)
生产密钥并添加到 GitHub 后还是提示
Permission denied (publickey)
ssh -vT git@github.com
显示 ssh 找不到 私钥文件
最后发现是使用 ssh-keygen
命令生成密钥对时加了 sudo
导致文件拥有者是 root ,当前用户无权限读取密钥文件
修改密钥拥有者为当前用户即可
sudo chown -R ec2-user github github.pub
sudo chgrp -R ec2-user github github.pub
Error: Permission denied (publickey)
https://help.github.com/en/articles/error-permission-denied-publickey
yum安装 gcc/gcc-c++
如果需要手动编译安装软件,基本都会用到 gcc,如果没有的话执行 ./configure
配置源码时提示找不到gcc:
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: no acceptable C compiler found in $PATH
使用yum安装gcc和g++:
sudo yum install gcc gcc-c++
注意:不需要单独安装make命令,make工具是系统默认包,是包含在Linux源代码里的,即使最小安装的linux发行版也有make工具。
yum安装java8
安装之前先看下是否自带了java,我装之前没看,没想到系统自带了java 7,导致后来启动spring服务失败,因为我打包是用java 8打的。
如果已安装了java 7,先卸载再安装java 8,当然安装之后再卸载也可以。
检索包含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命令的目录:
$ which java
/usr/bin/java
$ ll -h /usr/bin/java
lrwxrwxrwx 1 root root 22 Sep 16 06:13 /usr/bin/java -> /etc/alternatives/java
可知安装到了 /etc/alternatives/ 中
yum安装telnet
telnet
服务并不像其他服务(如HTTP和FTP等)一样作为独立的守护进程运行,它使用xinetd
管理,这样不但能提高安全性,而且还能使用xinetd对telnet服务器进行配置管理
yum安装xinetd
telnet 是挂在 xinetd 底下的,并且telnet要依靠xinetd服务启动, 所以要先安装xinetd
查看是否安装了xinetd服务rpm -qa | grep xinetd
没有的话先安装 xinetdsudo yum install xinetd
安装telnet客户端和服务端
telnet需要安装客户端(telnet)和服务端(telnet-server)sudo yum install telnet telnet-server
修改xinetd配置启用telnet
telnet服务安装后默认并不会被xinetd启用,还要修改文件/etc/xinetd.d/telnet
将其启用。其实/etc/xinetd.d/telnet
文件是xinetd程序配置文件的一部分,可以通过它来配置telnet服务器的运行参数。
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no
}
把最后一行的 disable=yes
改为 no
启动xinetd
配置开机启动
$ chkconfig --list|grep xinetd
xinetd 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
基于 xinetd 的服务:
$ sudo chkconfig xinetd on
$ chkconfig --list|grep xinetd
xinetd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
基于 xinetd 的服务:
yum安装nginx
RHEL/CentOS 7.x版本中,添加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
rpm -ql nginx
查到 nginx 安装路径 /etc/nginx/
安装后配置文件位置 /etc/nginx/nginx.conf
, sudo find / -name 'nginx.conf'
搜出来的,和ec2中不一样
安装后nginx可执行文件位置 /usr/sbin/nginx
, 和ec2中不一样
日志文件位置,看 nginx.conf 配置即可
启动nginx服务及开机启动配置
yum 安装的 nginx,会自动注册为系统服务
RHEL/CentOS 6.x及之前版本中,我们可以通过系统服务命令 service
来启动或停止
service nginx start #启动 nginx 服务
service nginx stop #停止 nginx 服务
service nginx restart #重启 nginx 服务
service nginx status #查看 nginx 服务运行状态
如果是在 RHEL/CentOS 7.x及以上的话,用 systemctl
命令来启动和停止
systemctl start nginx.service # 启动nginx服务
systemctl stop nginx.service # 停止nginx服务
systemctl restart nginx.service # 重启nginx服务
systemctl status nginx.service # 查看nginx服务状态
service 启动的nginx 服务,一般来说都是读取的默认配置文件
启动之后,通过给的公网IP直接在浏览器访问,就能看到nginx的默认欢迎页。
设置开机启动nginx服务
RHEL/CentOS 6.x及之前版本中
$ sudo chkconfig |grep nginx
nginx 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
$ sudo chkconfig nginx on
$ sudo chkconfig |grep nginx
nginx 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
修改配置后重新加载
在不停止服务的情况下重新加载配置项并生效sudo /usr/sbin/nginx -s reload
nginx中部署hexo静态博客
将博客html文件放到 /home/ec2-user/git/madaimeng
目录中
在nginx配置文件 /etc/nginx/nginx.conf
中增加如下server配置块,监听devgou.com域名,把所有请求映射到博客目录:
http {
# 二级域名访问,直接读取madaimeng目录中的静态html
server {
listen 80;
server_name devgou.com www.devgou.com;
location / {
root /home/ec2-user/git/madaimeng;
index index.html;
}
}
}
我的nginx配置
配置文件位置:
/etc/nginx/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
# 工作进程的用户和用户组,必须配置否则默认的nobody用户无目录读取权限
user ec2-user ec2-user;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/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;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
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;
index index.html index.htm;
# 用于多域名CORS跨域访问的域名映射
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;
}
# api.开头的3个三级域名访问,添加CORS跨域头,转发到后台java接口
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;
}
}
# webhooks.开头的三级域名访问, git的webhooks, 转发到后台node.js web服务
server {
listen 80;
server_name webhooks.devgou.com;
location / {
proxy_pass http://localhost:1121;
}
}
# 二级域名访问,直接读取madaimeng目录中的静态html
server {
listen 80;
server_name devgou.com www.devgou.com;
location / {
root /home/ec2-user/git/madaimeng;
index index.html;
}
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
# redirect server error pages to the static page /40x.html
#
error_page 404 /404.html;
location = /40x.html {
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
安装mysql及远程访问
安装mysql
和普通linux下安装mysql大致相同,看mysql官网的文档即可。
或参考笔记 MySQL-Linux安装
root/123456
需要注意的是 linux 版本是 RHEL/CentOS 6.x ,mysql源要安装6.x的,否则安装报错。
Getting Started with MySQL - Installing and Starting MySQL
https://dev.mysql.com/doc/mysql-getting-started/en/#mysql-getting-started-installing
内存太小无法启动mysql
只有 512M 内存,安装完mysql后,每次启动都报错
InnoDB: Cannot allocate memory for the buffer pool
修改 /etc/my.cnf 配置文件,将 innodb_buffer_pool_size
改小为 32M 后来又改为 16M,重启mysql,还是报同样的错误。
后来考虑了下,应该是500M内存怎么都不够,即使改小 innodb缓存还有其他地方需要的内存总量大于500M,默认这个VPS是没有swap虚拟内存的,只能给linux加个swap空间,即添加虚拟内存。
给linux添加swap交换文件(即虚拟内存)
1、创建大小为 1G 的交换文件:
sudo dd if=/dev/zero of=/swapfile1 bs=1M count=1024
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,14.7397 秒,72.8 MB/秒
2、修改文件的权限,避免其他用户对这个文件进行误操作:sudo chmod 600 /swapfile1
3、使用mkswap命令来设置交换文件:
sudo mkswap /swapfile1
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=b30e9371-0e0b-40b4-bd85-624aeb173aa1
4、启用交换文件:sudo swapon /swapfile1
5、写入/etc/fstab,以便在系统启动时自动加载交换文件:/swapfile1 none swap defaults 0 0
$ cat /etc/fstab
#
LABEL=/ / ext4 defaults,noatime 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/swapfile1 none swap defaults 0 0
新添了交换分区并启用它之后,请查看 cat /proc/swaps
或 free
或 swapon -s
命令的输出来确保交换分区已被启用了。
$ free -m
total used free shared buffers cached
Mem: 481 469 12 0 44 353
-/+ buffers/cache: 71 410
Swap: 1023 0 1023
$ swapon -s
文件名 类型 大小 已用 权限
/swapfile1 file 1048572 0 -2
创建可远程访问的mysql账号
创建一个账号,Host为%
,即允许所有主机连接,并给账号授权。
然后在命令行中验证可以本地登录mysql
配置mysql绑定ip
查看mysql server绑定ipshow variables like 'bind_address';
默认是*
,表示接收所有的IPv4 或 IPv6 连接请求,如没有更改过就不用配置。
配置防火墙放开3306端口
mysql安装并配置可远程连接的账号后还是会连接失败,报错:
$ mysql -u username -h xx.xx.xx.xx -ppassword;
ERROR 2002 (HY000): Can't connect to MySQL server on 'xx.xx.xx.xx' (36)
因为Lightsail防火墙默认阻断了除ssh 22和http 80端口外的所有流量,
编辑防火墙配置,添加允许所有来源的3306端口入站流量,配置完如下:
远程连接mysql数据库
之后便可利用aws提供的 公网IP 远程连接mysql访问
可以在Windows或Mac命令行中登录,也可以使用Navicat或DataGrip等图形界面登录
C:\Users\xxx> mysql -u username -h xx.xx.xx.xx -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数据库
到这里已经可以通过给定的公网IP远程连接mysql,但还是不方便,因为IP记不住,如果自己有域名,可以配个域名解析,更方便。
在自己的DNS提供商处配置自定义域名解析到这个公网IP,这样就可以使用域名远程连接了。
比如在阿里云上,我有个域名 devgou.com, 新加个二级域名: mysql.devgou.com 解析到aws提供的公网IP,然后就可以使用域名访问了。mysql -u usrname -h mysql.devgou.com -ppasword
注意解析到 IPv4 地址要选择A记录,解析到域名要选CNAME记录。
迁移数据库
把 ec2 mysql 上的数据迁移到 Lightsail mysql中
1、从 ec2 数据库中导出 blog 库到本地文件中,本地执行:
mysqldump -h mysql.devgou.com -u username -ppassword --databases blog > ~/blog.bak;
2、在 Lightsail的mysql中创建 blog库,登录lightsail mysql执行
create database blog;
3、导入本地文件到Lightsail mysql中,本地执行:
mysql -h xx.xx.xx.xx -u username -ppassword blog < ~/blog.bak;
注意:
1、导入前必须先创建对应的数据库,否则报错。
2、导入和导出使用的mysql账号必须有对应库的权限以及可远程连接。
部署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给分配的公网IP访问。
当然Spring boot中先要有处理/
请求的Controller代码,可以先简单的返回个hello world
如果以8080端口启动:
curl localhost:8080/
curl xx-xx-xx-xx:8080/
如果以80端口启动:
curl localhost/
curl xx-xx-xx-xx/
springboot 后台运行
https://www.cnblogs.com/bigben0123/p/7910036.html
Unsupported major.minor version 52.0
Exception in thread “main” java.lang.UnsupportedClassVersionError: org/springframework/boot/loader/JarLauncher : Unsupported major.minor version 52.0
错误原因
Java版本不兼容,具体为Java 8打包的jar包,在java 7 环境中运行
安装java的时候没注意,竟然装成了 java 7
卸载java7安装java8
查看java 版本
$ java -version
java version "1.7.0_211"
OpenJDK Runtime Environment (amzn-2.6.17.1.79.amzn1-x86_64 u211-b02)
OpenJDK 64-Bit Server VM (build 24.211-b02, mixed mode)
卸载java 7,先用rpm查下已安装的java
$ rpm -qa |grep java
javapackages-tools-0.9.1-1.5.amzn1.noarch
java-1.8.0-openjdk-headless-1.8.0.201.b09-0.43.amzn1.x86_64
java-1.8.0-openjdk-src-1.8.0.201.b09-0.43.amzn1.x86_64
java-1.7.0-openjdk-1.7.0.211-2.6.17.1.79.amzn1.x86_64
java-1.8.0-openjdk-1.8.0.201.b09-0.43.amzn1.x86_64
java-1.8.0-openjdk-devel-1.8.0.201.b09-0.43.amzn1.x86_64
java-1.8.0-openjdk-javadoc-1.8.0.201.b09-0.43.amzn1.noarch
tzdata-java-2018c-1.70.amzn1.noarch
java-1.8.0-openjdk-demo-1.8.0.201.b09-0.43.amzn1.x86_64
java-1.8.0-openjdk-javadoc-zip-1.8.0.201.b09-0.43.amzn1.noarch
可以看到有一个 java 7,也有java 8,看来我安装java 8是成功的,但系统中自带了java 7
卸载java 7
$ sudo rpm -e java-1.7.0-openjdk-1.7.0.211-2.6.17.1.79.amzn1.x86_64
再次查看java 版本
$ java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
配置nginx请求转发
监听我三个域名各自的api子域名,转发到localhost:8001,也就是springboot监听的端口:
# api.开头的3个三级域名访问,添加CORS跨域头,转发到后台java接口
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;
}
}
lightsail防火墙开放80端口
编辑lightsail防火墙,放开nginx监听的80端口的入栈流量,一般默认已经打开了。
因为我这里配置了nginx作为反向代理,也就是网关,可以实现80端口转发到后台8001端口,所以开放80端口即可。
如果没有配置nginx网关,以8001端口向外暴露服务的话,就需要再放开8001端口才行。
自定义域名解析到aws
目前我的域名都放在阿里云,这里以阿里云中的域名 devgou.com 解析为例。
域名解析到Lightsai公网IP
A记录表示解析到一个ipv4
主机记录www表示解析 www.example.com 的访问
主机记录@表示解析 example.com 的访问
主机记录api,也就是我们新定义了一个子域名 api.devgou.com,用于后台接口
主机记录mysql,也就是我们新定义了一个子域名 mysql.devgou.com,用于mysql
另外,在另外两个域名上也都加上 api子域名到aws的解析。
以后,我用自己3个域名的api子域名都可以访问springboot接口了:
http://api.devgou.com/
http://api.masikkk.com/
http://api.madaimeng.com/
同时,也不影响原本博客的访问。
blog后台部署流程
1、ssh登录,grep kill停止spring,删除jar包
ps -ef|grep java 查看pid
sudo kill -9 pid 杀掉服务
sudo rm -rf blog-0.0.1-SNAPSHOT.jar 删除jar包
2、scp拷贝新打包好的jar包到awsscp -i ~/.ssh/lightsail.pem blog-0.0.1-SNAPSHOT.jar user@xx.xx.xx.xx:~
3、指定端口8001后台启动spring
sudo nohup java -jar blog-0.0.1-SNAPSHOT.jar –server.port=8001 &
搭建邮件服务器
安装客户端mailx/发送代理sendmail/接收代理dovecot
着实费劲,搞了一个多星期,详见笔记 Linux上搭建邮件服务器
发送代理我用的 sendmail, 其实 postfix 据说更简便,但我先安装了 mysql 5.6,再安装 postfix 时有个mysql依赖冲突了,无法安装。
配置防火墙开放25/110/143端口
SMTP(Simple Mail Transfer Protocol) 发送邮件所使用的标准协议, SSL协议(SMTPS)使用465/994
端口, 非SSL协议使用25
端口;
IMAP(Internet Message Access Protocol) 接收邮件使用的标准协议之一, SSL协议(IMAPS)使用993
端口, 非SSL协议使用143
端口;
POP3(Post Office Protocol 3) 接收邮件使用的标准协议之一, SSL协议(POP3S)使用995
端口, 非SSL协议使用110
端口。
邮件服务器的DNS域名解析
一开始我想直接创建MX记录指向我的VPS 公网IP,发现阿里云上没法这么设置,提示MX记录的记录值必须是域名形式。
所以只能是先创建一个子域名A记录,比如 mail.devgou.com 指向 公网IP,然后再创建MX记录指向 mail.devgou.com
邮件服务器DNS配置
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 -
安装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
nodejs启动web服务做webhooks实现自动部署
参考笔记 Git-WebHooks钩子
python2升级python3
上一篇 Linux-Swap交换空间
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: