华为欧拉系统(EulerOS)是一款针对企业级场景优化的 Linux 发行版,适合作为服务器和云环境的基础操作系统。当前刚好华为云新用户可免费领取一个月使用,可用于熟悉 Linux 系统相关指令,以及环境部署和项目部署
本文将详细讲解 Java 开发环境的部署,包括 JDK21、MySQL8 和 Nginx 的安装与配置
环境准备
- 操作系统:华为EulerOS 2.0(基于CentOS兼容架构)
- 用户权限:
root
或具有sudo
权限的账户 - 网络:确保系统可访问互联网
一、安装 JDK-21
步骤1:二进制发布包下载
-
通过分享的链接下载,并使用工具将文件上传到服务器上
「jdk-21_linux-x64_bin.tar.gz」
链接:https://pan.quark.cn/s/fee0443bbe42
提取码:GhJJ -
解压安装包
执行如下指令,将上传上来的压缩包进行解压,并通过 -C 参数指定解压文件存放目录为 /usr/local。
tar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local/
步骤2:配置环境变量
# 编辑配置文件
vim /etc/profile
# 在文件末尾加入如下配置
export JAVA_HOME=/usr/local/jdk-21.0.1
export PATH=$JAVA_HOME/bin:$PATH
# 使配置生效
source /etc/profile
# 验证安装
java -version
二、安装MySQL8
在安装MySQL数据库之前,需要先检查一下当前 Linux 系统中,是否安装的有MySQL的相关服务(很多linux安装完毕之后,自带了低版本的 mysql 的依赖包),如果有,先需要卸载掉,然后再进行安装
通过 rpm 相关指令,来查询当前系统中是否存在已安装的 mysql 软件包,执行指令如下:
rpm -qa
查询当前系统中安装的所有软件rpm -qa | grep mysql
查询当前系统中安装的名称带mysql的软件rpm -qa | grep mariadb
查询当前系统中安装的名称带mariadb的软件
如果有,可通过 rpm 相关指令,来卸载对应的组件,执行指令如下:
在rpm中,卸载软件的语法为:
rpm -e --nodeps 软件名称
步骤1: 二进制发布包下载
-
通过分享的链接下载,并使用工具将文件上传到服务器上
「mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz」
链接:https://pan.quark.cn/s/e7c3a34a660a
提取码:tLzZ
步骤2:解压安装包
tar -xvf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
# 将解压后的文件夹移动到 /usr/local 目录下, 并改名为 mysql
mv mysql-8.0.30-linux-glibc2.12-x86_64 /usr/local/mysql
cd /usr/local/mysql
步骤 3: 创建 MySQL 用户和组
创建一个用于运行 MySQL 服务的系统用户:
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
步骤 4: 配置 MySQL 数据目录
创建 MySQL 数据目录并设置适当的权限:
mkdir /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql/data
步骤 5: 初始化数据库
使用 mysqld
初始化数据库:
cd /usr/local/mysql
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
此命令会初始化 MySQL 数据库并在日志中输出一个临时的 root 密码,记得复制出来备用
步骤 6: 配置 MySQL 服务
创建一个 MySQL 启动脚本以便系统可以启动和停止 MySQL 服务
- 创建一个名为
mysql
的服务脚本文件:
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
- 设置脚本可执行权限:
chmod +x /etc/init.d/mysql
- 配置系统服务(可选):
chkconfig --add mysql
chkconfig mysql on
步骤 7: 启动 MySQL
使用以下命令启动 MySQL:
/etc/init.d/mysql start
或者直接使用 mysqld
启动:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
步骤 8: 配置 MySQL 环境变量
为了方便使用,可以将 MySQL 的二进制文件路径加入到 PATH
环境变量中。编辑 ~/.bash_profile
文件,加入以下内容:
export PATH=$PATH:/usr/local/mysql/bin
然后执行:
source ~/.bash_profile
步骤 9: 设置 root 密码
根据初始化数据库时输出的临时密码,登录 MySQL:
mysql -u root -p
在这一步时,欧拉系统报错缺少 libtinfo.so.5
库
这个库通常由 ncurses
或 ncurses-libs
包提供。可以通过以下步骤来解决这个问题:
sudo yum install ncurses-libs
安装完库之后,使用以下命令确认库文件是否存在:
ldconfig -p | grep libtinfo
发现系统安装的是 libtinfo.so.6
,此时依然存在该问题
为了解决该问题,可以尝试创建一个符号链接,将 libtinfo.so.6
映射到 libtinfo.so.5
,这样 MySQL 依然能找到它依赖的库。
sudo ln -s /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5
然后,尝试再次运行 MySQL,输入此前复制的临时密码:
mysql -u root -p
登录后,修改 root 密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
步骤 10: 配置 MySQL 开机自启
如果想让 MySQL 在系统启动时自动启动,可以使用以下命令:
chkconfig mysql on
或者,使用 systemd
来管理 MySQL 服务
步骤11:window 连接服务器(可选)
创建账号, 并授权远程访问
CREATE USER 'root'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
注意:要想在windows上能够访问MySQL,需要开放防火墙的3306端口 或者 直接关闭防火墙 ,执行如下指令:
# 关闭防火墙
systemctl stop firewalld
# 开放防火墙的3306端口号
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重新加载
firewall-cmd --reload
# 查看开放的端口号
firewall-cmd --zone=public --list-ports
三、防火墙
1、防火墙的基本概念
防火墙是服务器安全体系中的核心组件,用于监控和控制进出服务器的网络流量。在Linux系统中,防火墙通过定义规则(Rules)来决定允许或拒绝特定的数据包。
常见的防火墙实现工具有 iptables(传统工具)、nftables(新一代替代工具)以及基于它们的用户友好工具如 UFW(Uncomplicated Firewall)和 firewalld(CentOS/RHEL默认工具)
核心功能:
- 流量过滤:根据IP地址、端口、协议等条件允许或拒绝流量
- 网络地址转换(NAT):实现端口转发、IP伪装等功能
- 状态化监控:跟踪连接状态(如已建立的TCP连接),动态调整规则
2、常用防火墙工具对比
工具名称 | 特点 |
---|---|
iptables | 传统工具,直接操作内核Netfilter模块,功能强大但配置复杂 |
nftables | iptables的替代品,语法更简洁,支持统一规则管理 |
UFW | 基于iptables的简化工具,适合新手快速配置(Ubuntu默认) |
firewalld | 动态管理工具,支持“区域”概念,适合复杂网络环境(CentOS/RHEL默认) |
3、常用操作指南
1. iptables/nftables基础操作
-
查看当前规则:
iptables -L -n -v # 查看iptables规则 nft list ruleset # 查看nftables规则
-
允许特定端口(如SSH的22端口):
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-
拒绝某个IP地址:
iptables -A INPUT -s 192.168.1.100 -j DROP
-
保存规则(避免重启后丢失):
iptables-save > /etc/iptables/rules.v4 # Debian/Ubuntu service iptables save # CentOS/RHEL
2. UFW简化操作
-
启用防火墙:
ufw enable
-
允许HTTP/HTTPS流量:
ufw allow 80/tcp ufw allow 443/tcp
-
拒绝某个IP:
ufw deny from 10.0.0.5
-
查看状态:
ufw status numbered
3. firewalld动态管理(最常用)
操作 | 命令 | 说明 |
---|---|---|
查看防火墙状态 | sudo systemctl status firewalld | 查看防火墙服务状态 |
查看防火墙运行状态 | sudo firewall-cmd --state | 查看防火墙是否启动 |
查看当前活动区域和规则 | sudo firewall-cmd --get-active-zones | 查看当前活动的区域及其规则 |
查看某个区域的详细配置 | sudo firewall-cmd --zone=public --list-all | 查看 public 区域的详细规则 |
启动防火墙服务 | sudo systemctl start firewalld | 启动 firewalld 服务 |
停止防火墙服务 | sudo systemctl stop firewalld | 停止 firewalld 服务 |
设置防火墙开机自启动 | sudo systemctl enable firewalld | 设置 firewalld 开机自启动 |
禁用防火墙开机自启动 | sudo systemctl disable firewalld | 禁用 firewalld 开机自启动 |
临时添加服务 | sudo firewall-cmd --zone=public --add-service=ssh | 允许 public 区域使用 ssh 服务 |
永久添加服务 | sudo firewall-cmd --zone=public --add-service=ssh --permanent | 永久添加 ssh 服务到 public 区域 |
临时删除服务 | sudo firewall-cmd --zone=public --remove-service=ssh | 从 public 区域删除 ssh 服务 |
永久删除服务 | sudo firewall-cmd --zone=public --remove-service=ssh --permanent | 永久删除 ssh 服务 |
临时开放端口 | sudo firewall-cmd --zone=public --add-port=8080/tcp | 允许 public 区域开放 8080/tcp 端口 |
永久开放端口 | sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent | 永久开放 8080/tcp 端口 |
临时关闭端口 | sudo firewall-cmd --zone=public --remove-port=8080/tcp | 从 public 区域关闭 8080/tcp 端口 |
永久关闭端口 | sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent | 永久关闭 8080/tcp 端口 |
重新加载防火墙配置 | sudo firewall-cmd --reload | 重新加载防火墙配置 |
列出所有已添加服务 | sudo firewall-cmd --list-services | 列出所有已添加的服务 |
列出所有已开放的端口 | sudo firewall-cmd --list-ports | 列出所有已开放的端口 |
临时添加 IP 地址 | sudo firewall-cmd --zone=public --add-source=192.168.1.10 | 允许 public 区域的 192.168.1.10 地址 |
永久添加 IP 地址 | sudo firewall-cmd --zone=public --add-source=192.168.1.10 --permanent | 永久允许 192.168.1.10 地址 |
临时移除 IP 地址 | sudo firewall-cmd --zone=public --remove-source=192.168.1.10 | 从 public 区域移除 192.168.1.10 地址 |
永久移除 IP 地址 | sudo firewall-cmd --zone=public --remove-source=192.168.1.10 --permanent | 永久移除 192.168.1.10 地址 |
禁用 ICMP(Ping)请求 | sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" reject' | 禁止所有 ICMP 请求(禁用 Ping) |
允许 ICMP(Ping)请求 | sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="0.0.0.0/0" reject' | 允许 ICMP 请求(启用 Ping) |
查看 firewalld 配置文件 | sudo cat /etc/firewalld/firewalld.conf | 查看 firewalld 配置文件内容 |
补充说明:
- 区域(Zone):
firewalld
使用区域来管理不同的网络接口。常见的区域有public
、dmz
、trusted
等。 - 临时规则:临时规则在
firewalld
重启或系统重启后会丢失。使用--permanent
标志来设置永久规则。 - 重新加载配置:修改防火墙规则后,使用
reload
命令让新配置生效。
4、注意事项
-
默认策略:建议先设置默认规则为:DROP 或 REJECT,再逐步开放必要服务
iptables -P INPUT DROP # 默认拒绝所有入站流量
-
避免锁定自己:配置SSH规则前,确保当前连接不会被中断
-
日志记录:可通过规则记录被拒绝的流量,便于排查问题。
iptables -A INPUT -j LOG --log-prefix "DROPPED: "
-
定期备份规则:防止误操作或系统更新导致配置丢失
5、工具选择建议
- 新手推荐:使用
UFW
或firewalld
简化配置 - 高级需求:直接使用
nftables
或iptables
实现精细控制 - 生产环境:结合脚本和版本管理工具(如Git)保存防火墙规则
通过合理配置防火墙,可以有效提升服务器的安全性。建议在修改规则前充分测试,并利用工具如telnet
或nmap
验证端口状态,确保配置符合预期
四、安装Nginx
-
通过分享的链接下载,并使用工具将文件上传到服务器上
「nginx-1.20.2.tar.gz」
链接:https://pan.quark.cn/s/001fc7dd9f34
提取码:X65y
1.安装依赖
Nginx的安装包,从官方下载下来的是 c 语言的源码包,需要自己编译安装。具体操作步骤如下:
1). 安装Nginx运行时需要的依赖
yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel
安装C语言的编译环境.
yum install gcc-c++
2. 解压安装 Nginx
# 解压源码包到当前目录
tar -zxvf nginx-1.20.2.tar.gz
#进入解压目录
cd nginx-1.20.2
#执行命令配置, 生成Makefile文件
./configure --prefix=/usr/local/nginx
#编译
make
#编译安装
make install
# 开放HTTP/HTTPS端口
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
3. 启动验证Nginx
进入到nginx安装目录/usr/local/nginx
,启动nginx服务
cd /usr/local/nginx/
sbin/nginx
# 查看系统中 nginx 进程
ps -ef | grep nginx
浏览器访问 http://服务器IP
,若显示欢迎页面则安装成功
遇到的问题:
查看错误日志:
cat /usr/local/nginx/logs/error.log
有以下三种可能导致,可根据实际情况进行排查:
-
查看 nginx 的启动用户,发现是nobody,而非是用 root 启动的
-
ps aux | grep "nginx: worker process" | awk '{print $1}' # 修改配置文件中 user 指定用户为 root vi /usr/local/nginx/conf/nginx.conf # 重新加载 nginx 配置 sudo /usr/local/nginx/sbin/nginx -s reload
-
-
检查文件权限
- 检查目录权限: 确保
/usr/local/nginx/html
目录和其中的文件对 Nginx 进程可读 - Nginx 默认是以
nobody
用户运行,因此需要确保该用户可以访问这些文件
-
检查并修改权限:
sudo chmod -R 755 /usr/local/nginx/html sudo chown -R nobody:nobody /usr/local/nginx/html
- 检查目录权限: 确保
-
检查 SELinux 设置
- 检查 SELinux 状态:
sudo getenforce
如果输出是
Enforcing
,则说明 SELinux 仍然启用,可能需要进一步设置 SELinux 来允许 Nginx 访问文件。可以尝试将其设置为Permissive
或临时禁用 SELinux:sudo setenforce 0 # 临时禁用 SELinux
关闭 SELinux(如果需要): 如果 SELinux 是启用状态且影响 Nginx 的访问,可以编辑 SELinux 配置文件
/etc/selinux/config
:sudo vi /etc/selinux/config
将
SELINUX
的值修改为disabled
,然后重启系统:SELINUX=disabled
可根据实际情况进行排查,最终实现效果
四、验证环境集成
1. 部署测试Java应用
创建一个简单的Spring Boot应用(假设打包为 app.jar
),测试数据库连接和HTTP访问:
# 启动应用(示例)
java -jar app.jar --spring.datasource.url=jdbc:mysql://localhost:3306/app_db
2. 配置Nginx反向代理
编辑Nginx配置文件:
sudo vim /etc/nginx/conf.d/app.conf
# 添加以下内容
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://localhost:8080; # 转发到Java应用
proxy_set_header Host $host;
}
}
# 重启Nginx
sudo systemctl restart nginx
五、常见问题解决
MySQL连接失败
- 确认防火墙开放3306端口:
firewall-cmd --add-port=3306/tcp
- 检查用户权限:
GRANT
语句需包含远程访问IP(如'app_user'@'%'
)
Nginx无法启动
- 检查端口冲突:
netstat -tuln | grep 80
- 查看日志:
tail -f /var/log/nginx/error.log