云服务器部署-JavaWeb-环境
0、前言
2020-03-15 修改,补充增加了内容。
1、环境、工具及版本
- CentOS Linux 7.4.1708 (Core)
- Amazon Corretto 11
- MySQL 5.7.28 或 MySQL 8.0.18
- Nginx 1.16.1
2、安装 JDK/JRE 参考步骤
2.1、yum 安装
1)添加 yum 存储库
在该页面:https://docs.aws.amazon.com/zh_cn/corretto/latest/corretto-11-ug/downloads-list.html 选择适用的发行包,拷贝链接后,使用以下命令安装:
1 | rpm -Uvh https://d3pxv6yz143wms.cloudfront.net/11.0.3.7.1/java-11-amazon-corretto-devel-11.0.3.7-1.x86_64.rpm |
也可以下载到本地执行安装:
1 | rpm -Uvh java-11-amazon-corretto-devel-11.0.3.7-1.x86_64.rpm |
2)开始安装
1 | [root@iZ9vbe1cif1bx32Z ~]## yum install java |
3)输入命令:java -version
,查看 JDK 是否安装成功,如果安装成功则显示版本号信息:
1 | [root@iZ9vbe1cif1bx32Z ~]## java -version |
2.2、手动安装
1)在 etc 下建立存放目录,可以用图形化工具建立,或者命令行:mkdir /etc/java
2)在 etc 下使用命令:wget https://d3pxv6yz143wms.cloudfront.net/11.0.3.7.1/amazon-corretto-11.0.3.7.1-linux-x64.tar.gz
,或将本地文件上传。
3)在 etc 下执行命令:tar zxvf jdk-8u171-linux-x64.tar.gz -C /etc/java/
4)解压完成后,修改 /etc/profile
文件,在末尾添加内容后保存:
1 | ##set java environment |
附加内容:若安装 JDK 8,环境变量设置可改为:
1 | ##set java environment |
5)使用命令:source /etc/profile
,让环境变量生效
6)输入命令:java -version
,查看 JDK 是否安装成功。
3、安装 MySQL 参考步骤
采用官网介绍的安装方法,步骤如下。原文详见:A Quick Guide to Using the MySQL Yum Repository
1)查询并移除 CentOS 7 默认安装的 mariaDB,执行该步骤需要获得 root 权限:
1 | [root@iZ9vbe1cif1bx32Z ~]## rpm -qa | grep mariadb |
2)添加 yum 存储库
在该页面:https://dev.mysql.com/downloads/repo/yum/ 选择适用的发行包,拷贝链接后,使用以下命令安装:
1 | rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm |
也可以下载到本地执行安装:
1 | rpm -Uvh mysql80-community-release-el7-3.noarch.rpm |
3)选择版本
在 yum 存储库中,不同版本的 MySQL Community Server 托管在不同的子存储库中。默认情况下启用最新版本(当前为 MySQL 8.0)的子存储库,而所有其他系列(例如,MySQL 5.7 系列)的子存储库均被禁用。使用以下命令可查看 yum 存储库中的所有子存储库,并查看已启用或禁用的子存储库:
1 | [root@iZ9vbe1cif1bx32Z ~]## yum repolist all | grep mysql |
若安装最新版本则无需进行配置。要安装旧版本,例如 MySQL 5.7 系列,需禁用最新版本的子存储库并启用旧版本子存储库。以下命令禁用 8.0 系列的子存储库并启用 5.7 系列的子存储库:
1 | [root@iZ9vbe1cif1bx32Z ~]## yum-config-manager --disable mysql80-community |
注意:
- 若提示找不到
yum-config-manager
命令,安装即可:yum -y install yum-utils
- 应该随时只为一个系列启用子存储库。如果启用了多个系列的子存储库,那么 yum 将使用最新的系列
通过以下命令,验证是否已启用正确的子存储库:
1 | [root@iZ9vbe1cif1bx32Z ~]## yum repolist enabled | grep mysql |
4)开始安装
通过以下命令安装 MySQL 服务器的软件包以及其他必需的软件包:
1 | [root@iZ9vbe1cif1bx32Z ~]## yum install mysql-community-server |
5)启动 MySQL 服务
1 | [root@iZ9vbe1cif1bx32Z ~]## service mysqld start |
6)检查状态
使用命令 service mysqld status
,出现以下提示说明服务正常运行(MySQL 5.7 和 8.0 的显示结果基本相同)。
1 | [root@iZ9vbe1cif1bx32Z ~]## service mysqld status |
7)查看初始临时密码
1 | [root@iZ9vbe1cif1bx32Z ~]## grep 'temporary password' /var/log/mysqld.log |
8)使用生成的临时密码登录
1 | [root@iZ9vbe1cif1bx32Z ~]## mysql -uroot -p |
9)尽快为超级用户帐户设置自定义密码
1 | mysql> alter user 'root'@'localhost' identified by 'MyNewPass4!'; |
注意:MySQL 的 validate_password 插件默认安装。要求密码至少包含一个大写字母,一个小写字母,一位数字和一个特殊字符,并且密码总长度至少为 8 个字符。
4、MySQL 通用及专有设置
4.1、用户控制及授权
1)创建用户 test 并设置密码
1 | mysql> create user test identified by '123aI~A!'; |
注:可不进入 user 表执行该语句
2)查看用户 test 的权限(没有分配前,无权限):
1 | mysql> show grants for 'test'@'%'; |
3)给用户 test 在 database 数据库中对的所有表授权,如:EXECUTE(执行存储过程),INSERT,SELECT,UPDATE 权限,’%’ 表示来自任意 IP 的访问:
1 | grant execute,insert,select,update on database.* to 'test'@'%'; |
常用权限有以下几种:
- all privileges,所有权限
- select,读取权限
- delete,删除权限
- update,更新权限
- create,创建权限
- drop,删除数据库、数据表权限
4)取消来自远程服务器的 AA 用户对数据库 db 里的表 tb 的所有权限
1 | revoke all on db.tb from AA@"%"; |
5)刷新权限
1 | flush privileges; |
6)删除用户
1 | drop user test@'%'; |
注:可不进入 user 表执行该语句
7)查看所有用户信息(8.0 版本显示结果稍有不同)
1 | mysql> select user, host, authentication_string from mysql.user; |
4.2、重置密码
1)定位 /etc/my.cnf,在 my.cnf 文件 [mysqld]
下添加 skip-grant-tables
字符串,开启免密码登陆
2)执行 service mysqld restart
,重启服务,使配置生效
3)执行 mysql -u root -p
,无需键入内容,直接回车即可登录
4)清空密码
1 | update mysql.user set authentication_string='' where user='root'; |
5)将 skip-grant-tables
字符串删除,执行 service mysqld restart
,重启服务,使配置生效
6)执行 mysql -u root -p
,无需键入内容,直接回车即可登录
7)执行 alter user 'root'@'localhost' identified by 'MyNewPass4!';
重新设置密码
4.3、移除 MySQL
1)停止服务:service mysqld stop
2)执行 rpm -qa | grep -i mysql
查看 MySQL 组件:
1 | [root@iZ9vbe1cif1bx32Z ~]## rpm -qa | grep -i mysql |
3)组件彼此之间有依赖关系,按顺序逐项执行移除
1 | rpm -ev mysql-community-server-5.7.28-1.el7.x86_64 |
4)删除相关目录。执行 find / -name mysql
(查找) 和 rm -rf xxx
(删除) 逐项执行移除完全为止。可能包含的目录如下:
1 | [root@iZ9vbe1cif1bx32Z ~]## find / -name mysql |
4.4、MySQL 8 使用简单密码
MySQL 8 默认不能输入全数字的简单密码,需要进行如下设置:
1 | mysql> set global validate_password.policy=0; |
4.5、MySQL 8 开启外部第三方客户端连接权限
MySQL 8.0 采用了 caching_sha2_password 加密,是 sha256 的改进版加密方式,多数第三方客户端都不支持这种加密方式,自带的命令行可支持。具体可参看 官方文档 有关该内容说明。要解决该问题,需要修改加密方式。以 root 用户为例,如果要配置其他用户或授权 IP,对应修改名称和地址即可。
1 | ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'MyNewPass4!'; |
5、安装 nginx 参考步骤
5.1、yum 安装(配置文件,稳定版)
采用官网介绍的安装方法,步骤如下。原文详见:Installation instructions
1)新建配置文件 /etc/yum.repos.d/nginx.repo
,内容如下:
1 | [nginx-stable] |
2)配置中 enabled=1
,因此默认安装稳定版,直接执行 yum install nginx
即可
3)启动服务:systemctl start nginx.service
4)查看运行状态:ps -ef | grep nginx
,若有 master process 和 worker process 两个进程说明正常启动。
其他常用命令行:
- 查看版本:nginx -v
- 停止服务:
systemctl stop nginx.service
- 重启服务:
systemctl restart nginx.service
- 开机启动服务:
systemctl enable nginx.service
- 全局配置文件路径:
/etc/nginx/nginx.conf
- 网站文件存放路径:
/usr/share/nginx/html
- 网站默认站点配置文件路径:
/etc/nginx/conf.d/default.conf
- 自定义 Nginx 站点配置文件存放路径:
/etc/nginx/conf.d/
- 查看服务器私有 IP:
ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
- 卸载:
yum remove nginx
,之后可用which nginx
确认是否卸载情况
5.2、yum 安装(手动,稳定版)
1)在该页面:http://nginx.org/packages/centos/7/x86_64/RPMS/ 选择适用的发行包,拷贝链接后,使用以下命令安装:
1 | rpm -Uvh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.16.1-1.el7.ngx.x86_64.rpm |
也可以下载到本地执行安装:
1 | rpm -Uvh nginx-1.16.1-1.el7.ngx.x86_64.rpm |
2)执行 yum install nginx
即可
3)启动服务:systemctl start nginx.service
5.3、编译安装
nginx 中 gzip 模块需要 zlib 库,rewrite 模块需要 pcre 库,ssl 功能需要 openssl 库。以 /usr/mix
安装目录为例:
- 建立 mix 目录
1 | $ mkdir mix |
- 安装 GCC 和 GCC-C++
1 | $ yum install gcc |
注意:
若未安装 GCC,安装 Nginx 会报如下错误:
1 | ./configure: error: C compiler cc is not found |
若未安装 GCC-C++,安装 PCRE 库时报如下错误:
1 | configure: error: You need a C++ compiler for C++ support. |
- 编译安装 PCRE 库
1 | $ cd /usr/ |
注意:这里使用 pcre 而不用 pcre2
- 编译安装 zlib 库
1 | $ cd /usr/ |
- 编译安装 openssl
1 | $ cd /usr/ |
- 编译安装 nginx,并添加 PCRE、zlib 、openssl 的源码路径
1 | $ cd /usr/ |
- 启动 Nginx,默认端口为 80
1 | $ ./usr/mix/nginx/sbin/nginx |
- 查看工作情况
1 | $ ps -ef | grep nginx |
- 其他命令
1 | ./sbin/nginx -s reload ## 重新载入配置文件 |
5.4、问题及解决方案
5.4.1、nginx 设置反向代理后,页面上的 js css 文件无法加载
可添加如下配置:
1 | location ~ .*\.(js|css)$ { |
完整示例:
1 | listen 80; |
5.4.2、输入域名或 IP,访问不到主页
1)查看云服务器商防火墙是否放行 80 端口;
2)系统防火墙是否放行 80 端口,相关命令如下:
systemctl status firewalld.service
,查看系统防火墙状态(running/dead)firewall-cmd --permanent --add-port=80/tcp
,开启 80 端口(重启系统启防火墙后生效)firewall-cmd --reload
,重启系统防火墙firewall-cmd --list-ports
,查看系统防火墙已开启端口
附加内容:防火墙的开启和关闭
- 临时关闭防火墙:
systemctl stop firewalld
- 临时开启防火墙:
systemctl start firewalld
- 永久关闭防火墙:
systemctl disable firewalld
- 永久开启防火墙:
systemctl enable firewalld
注意事项:临时关闭或开启防火墙,当重启时会回复之前的状态;永久开启或关闭防火墙,重启后生效。
附加内容:自启动服务命令
- 查看服务是否开机启动:systemctl is-enabled firewalld.service
- 查看已启动的服务列表:systemctl list-unit-files|grep enabled
- 查看启动失败的服务列表:systemctl –failed
附加内容:添加/删除开放端口
- 默认作用域下,每次修改端口和服务相当于修改
/etc/firewalld/zones/public.xml
文件,也可以直接操作文件 - 添加 http 服务:
firewall-cmd --zone=public --add-service=http --permanent
- 查看端口是否开放,开启显示 yes:
firewall-cmd --query-port=80/tcp
- 查看服务是否开放,开启显示 yes:
firewall-cmd --query-service=ssh
- 删除开放的端口:
firewall-cmd --remove-port=80/tcp --permanent
- 删除开放的服务:
firewall-cmd --zone=public --remove-service=http --permanent
- 查看所有开启的服务:
firewall-cmd --list-services
- 列出指定作用域的所有设置:
firewall-cmd --zone=public --list-all
- 查看所有可用区域:
firewall-cmd --get-zones
- 列出所有预设服务:
firewall-cmd --get-services
,将列出/usr/lib/firewalld/services/
中的服务器名称。配置文件是以服务本身命名的 service-name.xml - 列出所有区域的设置:
firewall-cmd --list-all-zones
注 1:缺省时的作用域为 public,即默认带参数
--zone=public
,可通过firewall-cmd --get-default-zone
命令查看,可通过firewall-cmd --set-default-zone=dmz
命令更改
注 2:
--permanent
参数为永久生效
注 3:
/etc/firewalld/zones/
目录下保存作用域配置文件。如public.xml
是当前生效配置;public.xml.old
是上一次生效配置。
附加内容:防火墙作用域
- public :仅允许访问本机的 ssh,ping,dhcp 服务(默认)
- trusted:允许任何访问
- block:阻塞任何来访请求,明确拒绝
- drop:丢弃任何来访的数据包,直接丢弃
附加内容:其他防火墙操作
定义规则
- 设置某个 ip 访问某个服务:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.4/24" service name="http" accept'
- 删除配置:
firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.0.4/24" service name="http" accept'
// - 设置某个 ip 访问某个端口:
firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.0.1/2 port port=80 protocol=tcp accept'
- 删除配置:
firewall-cmd --permanent --remove-rich-rule 'rule family=ipv4 source address=192.168.0.1/2 port port=80 protocol=tcp accept'
- 将 1.2.3.4 这个源地址的连接全部给 drop 掉:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'
伪装 IP
- 检查是否允许伪装 IP:
firewall-cmd --query-masquerade
- 允许防火墙伪装 IP:
firewall-cmd --add-masquerade
- 禁止防火墙伪装 IP:
firewall-cmd --remove-masquerade
请求转发
- 将 80 端口的请求转发至 8080:
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
- 将 80 端口的请求转发至 1 92.168.0.1:
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.0.1
- 将 80 端口的请求转发至 192.168.0.1 的 8080 端口:
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080
6、部署过程中的其他问题
6.1、解压 filename.tar.xz 文件
使用命令:tar -xvf filename.tar.xz
6.2、在 linux 服务器运行 jar 文件
通常的方法是:
1 | $ java -jar test.jar |
但是这种方式在 SSH 窗口关闭时程序将中止运行,或者是运行时没法切出去执行其他任务,有没有办法让 jar 在后台运行。要解决这个问题,可以使用:
1 | $ nohup java -jar test.jar & |
即不挂断运行命令,账户退出或终端关闭时,程序仍然运行。当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到 nohup.out 的文件中,除非另外指定了输出文件。例如:
1 | $ nohup java -jar test.jar >temp.txt & |
此时把日志文件输入到指定的文件中,没有则会自动创建。
附加内容:两种报错的解决
▲ 提示 nohup: failed to run command
java’: No such file or directory`
▲ 或者使用 ./startup.sh 开启 tomcat 服务报错:
1 | Neither the JAVA_HOME nor the JRE_HOME environment variable is defined |
以上情况,执行一次 source /etc/profile 即可。
6.3、linux kill 命令
格式:kill [参数][进程号]
6.4、linux 查询端口情况
netstat 命令各个参数说明如下:
1 | -t : 指明显示TCP端口 |
要显示当前服务器上所有端口及进程服务,与 grep 结合可查看某个具体端口及服务情况:
1 | netstat -ntlp //查看当前所有tcp端口 |
查询出来的结果,根据 ID 号可以用 kill 命令终止后台运行的任务。
附加内容:使用 netstate 报 -bash: netstate: command not found
网络工具没有安装,执行 yum install net-tools
,安装即可
6.5、jobs 命令:
查看当前终端后台运行的任务。jobs 的状态可以是 running,stopped,Terminated。+
号表示当前任务,-
号表示后一个任务。
注:该命令可在使用 nohup 后紧接使用。
6.7、scp 上传或下载文件
- 可执行
yum install openssh-clients
命令进行安装 - 上传文件到服务器:
scp /Users/spirit/Documents/WechatIMG135.jpeg root@192.168.1.1:/usr/local
- 上传文件夹到服务器:
scp -r /Users/spirit/Documents/fileFolder root@192.168.1.1:/usr/local
- 从服务器下载文件:
scp root@192.168.1.1:/usr/local/WechatIMG135.jpeg /Users/spirit/Documents
- 从服务器下载文件夹:
scp -r root@192.168.1.1:/usr/local/fileFolder /Users/spirit/Documents
参数说明:
-1
:强制 scp 命令使用协议 ssh1-2
:强制 scp 命令使用协议 ssh2-4
:强制 scp 命令只使用 IPv4 寻址-6
:强制 scp 命令只使用 IPv6 寻址-B
:使用批处理模式(传输过程中不询问传输口令或短语)-C
:允许压缩。(将-C 标志传递给 ssh,从而打开压缩功能)-p
:保留原文件的修改时间,访问时间和访问权限。-q
:不显示传输进度条。-r
:递归复制整个目录。-v
:详细方式显示输出。scp 和 ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。-c
:cipher,以 cipher 将数据传输进行加密,这个选项将直接传递给 ssh。-F
:ssh_config,指定一个替代的 ssh 配置文件,此参数直接传递给 ssh。-i
:identity_file,从指定文件中读取传输时使用的密钥文件,此参数直接传递给 ssh。-l
:limit,限定用户所能使用的带宽,以 Kbit/s 为单位。-o
:ssh_option,如果习惯于使用 ssh_config(5)中的参数传递方式,-P
:port,注意是大写的 P, port 是指定数据传输用到的端口号-S
:program,指定加密传输时所使用的程序。此程序必须能够理解 ssh(1)的选项。