当前位置 : 首页 » 文章分类 :  开发  »  AWS Lightsail CentOS6 使用记录

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页面,添加公钥到coding
ssh -T git@git.dev.tencent.com 测试连接是否成功

ssh-keygen -P '' -f github 生成密钥对, 使用默认加密算法,文件名指定github,得到私钥文件 github,公钥文件 github.pub
登录github页面,添加公钥到github
ssh -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
没有的话先安装 xinetd
sudo 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/swapsfreeswapon -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绑定ip
show 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包到aws
scp -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

参考笔记 Python/python2升级python3


上一篇 Linux-Swap交换空间

下一篇 Spring-Cloud-Config

阅读
评论
6,900
阅读预计30分钟
创建日期 2019-07-12
修改日期 2019-12-21
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论