Ubuntu 中间件安装
IMPORTANT
- 以下操作基于
Ubuntu 24.04 LTS,其他发行版本的命令可能有所不同 - 下方的链接具有时效性,失效后需到对应中间件的官网查找最新的地址
- 在下面的示例中,
$符号表示命令提示符,之后的文本是用户在命令行中输入的命令。 - Ubuntu 使用
apt包管理器替代 CentOS 的yum,使用ufw防火墙替代firewalld,使用AppArmor替代SELinux
了解 systemd 服务
systemd 是一个用于初始化系统和管理系统服务的系统和服务管理器,主要用于 Linux 操作系统。
以 /lib/systemd/system/ufw.service 这个防火墙服务做简单介绍
[Unit] # 描述服务的元数据和依赖关系。
Description=Uncomplicated firewall
Before=network-pre.target
Wants=network-pre.target
After=systemd-sysusers.service
Documentation=man:ufw(8)
ConditionPathExists=/etc/ufw/ufw.conf
[Service] # 定义服务的行为,例如启动命令、重启策略等。
Type=oneshot
RemainAfterExit=yes
ExecStart=/lib/ufw/ufw-init start quiet
ExecStop=/lib/ufw/ufw-init stop
[Install] # 定义安装相关的信息,例如目标。
WantedBy=multi-user.target后续安装的中间件会使用 systemd 服务,方便中间件的启停、开机自启
每添加一个 systemd 的 service 需要重新加载
$ sudo systemctl daemon-reload可配置服务开机自启 systemctl enable
$ sudo systemctl enable ufw配置防火墙 (UFW)
Ubuntu 使用 UFW (Uncomplicated Firewall) 作为默认防火墙管理工具
$ sudo ufw status # 查看防火墙状态
$ sudo ufw disable # 禁用防火墙(开发环境可选)
$ sudo ufw enable # 启用防火墙
$ sudo ufw allow 8080/tcp # 允许特定端口
$ sudo ufw allow ssh # 允许 SSH 连接NOTE
生产环境建议启用防火墙并仅开放必要端口
禁用 AppArmor
Ubuntu 使用 AppArmor 替代 CentOS 的 SELinux,某些情况下可能需要调整 AppArmor 配置
$ sudo systemctl status apparmor # 查看状态
$ sudo systemctl stop apparmor # 临时停止
$ sudo systemctl disable apparmor # 禁止开机启动(不推荐)WARNING
通常不需要完全禁用 AppArmor,建议根据需求调整具体配置文件
JDK
我们开发过程中使用 Eclipse Temurin 的发行版本
卸载可能预装的 JDK
在安装之前需检查是否已有 JDK,可通过执行命令查看
$ java -version
openjdk version "17.0.10" 2024-01-16
OpenJDK Runtime Environment (build 17.0.10+7-Ubuntu-1ubuntu124.04)
OpenJDK 64-Bit Server VM (build 17.0.10+7-Ubuntu-1ubuntu124.04, mixed mode, sharing)执行命令后能正常返回则说明存在了其他 JDK,如该版本的 JDK 不是必须的可卸载避免后面使用中引起一些不可预知的错误
查看已安装的 Java 相关包
$ dpkg -l | grep -E 'openjdk|jdk'
ii openjdk-17-jdk:amd64 17.0.10+7-1ubuntu1 amd64 OpenJDK Development Kit (JDK)
ii openjdk-17-jre:amd64 17.0.10+7-1ubuntu1 amd64 OpenJDK Java runtime执行命令卸载
$ sudo apt remove --purge openjdk-17-jdk openjdk-17-jre -y
$ sudo apt autoremove -y安装 JDK
进入Eclipse Temurin JDK 下载页 根据操作系统和系统架构下载对应的 JDK
下载后的文件名为 OpenJDK11U-jdk_x64_linux_hotspot_11.0.24_8.tar.gz,将文件上传至服务器/opt目录下,然后解压文件
$ cd /opt/
$ sudo tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.24_8.tar.gz可创建软链接,方便访问及后续的升级切换
$ sudo ln -s jdk-11.0.24+8 jdk配置环境变量
$ sudo vim /etc/profile.d/java.sh创建新文件并添加以下内容
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME/binvim基本命令:i插入模式,esc键退出插入模式,:wq保存退出。
利用下面命令使配置生效,并且查看 JDK 版本
$ source /etc/profile.d/java.sh
$ java -version
openjdk version "11.0.24" 2024-07-16
OpenJDK Runtime Environment Temurin-11.0.24+8 (build 11.0.24+8)
OpenJDK 64-Bit Server VM Temurin-11.0.24+8 (build 11.0.24+8, mixed mode)TIP
也可以使用 apt 直接安装 Eclipse Temurin,详细步骤参考官方文档:https://adoptium.net/zh-CN/installation/linux#_centosrhelfedora_instructions
$ sudo apt install -y wget apt-transport-https gpg
$ wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/adoptium.gpg > /dev/null
$ echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list
$ sudo apt update
$ sudo apt install temurin-11-jdk⚠️ apt 安装后 JAVA_HOME 不易查找,使用以下通用且安全的方式定位:
# 方式一:通过 JVM 运行时参数精准获取(最通用,不依赖任何外部工具或链接)
$ java -XshowSettings:properties -version 2>&1 | grep 'java.home'
# 方式二:查看默认安装目录(apt 安装的标准位置)
$ ls -l /usr/lib/jvm/apt 安装的 Temurin 默认路径通常为:/usr/lib/jvm/temurin-11-jdk-amd64
如需配置 JAVA_HOME 环境变量(最安全通用写法,写死实际路径):
$ echo 'export JAVA_HOME=/usr/lib/jvm/temurin-11-jdk-amd64' | sudo tee /etc/profile.d/java.sh
$ echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /etc/profile.d/java.sh
$ source /etc/profile.d/java.shTomcat
安装 Tomcat
进入Tomcat 下载页下载安装包
下载后的文件名为 apache-tomcat-9.0.91.tar.gz,将文件上传至服务器/opt目录下,然后解压
$ cd /opt/
$ sudo tar zxf apache-tomcat-9.0.91.tar.gz可创建软链接,方便访问及后续的升级切换
$ sudo ln -s apache-tomcat-9.0.91 tomcat9配置服务自动启动
修改 setclasspath.sh
修改 tomcat9/bin/setclasspath.sh,开头增加:
CATALINA_PID=/opt/tomcat9/temp/tomcat.pid
JAVA_HOME=/opt/jdk
CATALINA_HOME=/opt/tomcat9
CATALINA_OPTS="-server -Xms1024M -Xmx2048M"注册 systemd service
在/lib/systemd/system目录下增加tomcat9.service(Ubuntu 使用 /lib/systemd/system 而非 /usr/lib/systemd/system)
[Unit]
Description=Tomcat9
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/opt/tomcat9/temp/tomcat.pid
ExecStart=/opt/tomcat9/bin/startup.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target重载所有修改过的配置文件:
$ sudo systemctl daemon-reload$ sudo systemctl enable tomcat9.service # 配置开机启动
$ sudo systemctl start tomcat9.service # 启动 tomcat
$ sudo systemctl stop tomcat9.service # 停止 tomcat
$ sudo systemctl restart tomcat9.service # 重启 tomcat
$ sudo systemctl status tomcat9.service # 查看状态关系型数据库安装
MySQL
APT 官方源安装 MySQL 8.x
卸载旧版本
$ sudo apt remove --purge mariadb-* mysql-* -y 2>/dev/null || true
$ sudo apt autoremove -y添加 MySQL 官方 APT 仓库
$ sudo apt update
$ sudo apt install -y lsb-release
# 添加 MySQL 8.0 官方 APT 仓库($(lsb_release -cs) 自动取 Ubuntu 版本代号,24.04=noble)
$ echo "deb [trusted=yes] http://repo.mysql.com/apt/ubuntu/ $(lsb_release -cs) mysql-8.0" | sudo tee /etc/apt/sources.list.d/mysql.list
# 优先级锁定(1001 > 系统默认 500),确保安装官方 MySQL 8.x 而不是 Ubuntu 自带版本
$ echo "Package: *
Pin: origin repo.mysql.com
Pin-Priority: 1001" | sudo tee /etc/apt/preferences.d/mysql.pref
$ sudo apt update安装
$ sudo DEBIAN_FRONTEND=noninteractive apt install mysql-server -y(可选,可直接跳过)表名大小写不敏感(lower_case_table_names=1)
TIP
可以直接跳过本节,MySQL 完全能正常使用!只有 1 点影响: 跳过则 Linux 默认 lower_case_table_names=0(大小写敏感),SQL 里表名大小写不一致会报错 Table 'xxx.User' doesn't exist。
- 团队 SQL 规范统一写小写 → 直接跳过 ✅
- 从 Windows / 老系统迁数据、或已有脚本里大小写混用 → 执行本节
注:
- 下面有
rm -rf /var/lib/mysql会清空所有库表,只适合刚安装完、还没导入任何数据的全新机器;有数据的机器请用mysqldump导出 → 清库重建 → 重新导入 - MySQL 8.x 规定
lower_case_table_names必须在数据目录首次初始化前写入,之后再改会导致 MySQL 无法启动,所以只能在安装完这个时机设置
$ sudo systemctl stop mysql
$ sudo rm -rf /var/lib/mysql
$ sudo mkdir -p /var/lib/mysql
$ sudo chown -R mysql:mysql /var/lib/mysql
$ sudo chmod 750 /var/lib/mysql
$ sudo tee -a /etc/mysql/mysql.conf.d/mysqld.cnf > /dev/null << 'EOF'
# 表名/库名存储为小写,SQL 比较忽略大小写(Windows 风格)
lower_case_table_names = 1
EOF
# 修正目录权限
$ sudo chown -R mysql:mysql /var/lib/mysql
$ sudo chmod 750 /var/lib/mysql
# 重新初始化 + 启动
$ sudo mysqld --initialize-insecure --user=mysql --lower-case-table-names=1
$ sudo systemctl daemon-reload
$ sudo systemctl start mysql
$ sudo systemctl enable mysql验证 lower_case_table_names 必须等于 1(否则就是旧数据没清干净,重来一遍):
$ sudo mysql -e "SHOW VARIABLES LIKE 'lower_case_table_names';"
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 1 |
+------------------------+-------+验证安装结果(MySQL 可正常使用)
$ mysql --version
mysql Ver 8.0.39 for Linux on x86_64 (MySQL Community Server - GPL)
$ sudo systemctl status mysql
# 必须是 active (running),否则按下面排错速查处理时区设置
# 强制设置系统时区为中国(Asia/Shanghai = UTC+8 / CST)
$ sudo timedatectl set-timezone Asia/Shanghai
# 验证(必须出现 CST 和 +0800)
$ timedatectl | grep "Time zone"
# 期望输出:Time zone: Asia/Shanghai (CST, +0800)设置 y9-cloud 推荐参数
$ sudo tee -a /etc/mysql/mysql.conf.d/mysqld.cnf > /dev/null << 'EOF'
# -------- y9-cloud 推荐参数 --------
disable_log_bin
log_bin=mysql_bin
binlog-format=Row
server-id=1
# 会话时区 = Asia/Shanghai 中国时间(UTC+8),NOW()/CURDATE() 等函数返回北京时间
default-time-zone = "+8:00"
symbolic-links=0
wait_timeout=1814400
skip-name-resolve
#innodb_force_recovery = 1
default_authentication_plugin=mysql_native_password
max_allowed_packet=1024M
max_connections=3000
character_set_server=utf8mb4
# 需设置,不然事项查询可能会出问题
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1
innodb_buffer_pool_size=2147483648
innodb_lock_wait_timeout=100
sync_binlog=1000
innodb_flush_log_at_trx_commit=2
EOF
# 重启生效
$ sudo systemctl restart mysql
$ sudo systemctl status mysql设置 root 密码
apt 安装后 root 默认通过 auth_socket 免密登录(只有本机 sudo mysql 能进),改成密码登录:
$ sudo mysqlmysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass4!';
mysql > FLUSH PRIVILEGES;
mysql > EXIT;之后即可用密码登录:
$ mysql -u root -p开放外部连接(可选执行)
MySQL 8 默认只允许本机(127.0.0.1)登录,需要改监听地址、加外部用户、放行防火墙。
第 1 步:修改监听地址为 0.0.0.0
# 看一下当前 bind-address 的位置和值
$ grep -n "bind-address\|mysqlx-bind-address" /etc/mysql/mysql.conf.d/mysqld.cnf
# 改成 0.0.0.0(允许所有网卡连接,内网/云服务器有安全组限制即可)
$ sudo sed -i 's/^bind-address\s*=.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
$ sudo sed -i 's/^mysqlx-bind-address\s*=.*/mysqlx-bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
# 确认修改结果
$ grep "bind-address" /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
# 重启 MySQL
$ sudo systemctl restart mysql
$ sudo systemctl status mysql第 2 步:创建允许外部连接的数据库用户
⚠️ 不要把 root 用户对 % 开放,风险太高,新建一个专用账号:
$ sudo mysql -u root -pmysql> CREATE USER IF NOT EXISTS 'y9user'@'%' IDENTIFIED WITH mysql_native_password BY 'Y9Admin@2024!';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'y9user'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
mysql> SELECT User, Host FROM mysql.user WHERE User IN ('root', 'y9user');
mysql> EXIT;第 3 步:UFW 放行 3306 端口 + 验证
# UFW 放行 3306(没开防火墙也不会报错)
$ sudo ufw allow 3306/tcp && sudo ufw reload 2>/dev/null
$ sudo ss -tlnp | grep :3306
LISTEN 0 151 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=xxx,fd=xxx))
# ② 本机先验证外部账号能连上(不要 -h 127.0.0.1,用服务器实际 IP 测)
$ mysql -h 服务器内网IP -u y9user -p'Y9Admin@2024!' -e "SELECT VERSION();"NGINX
APT 源安装
Ubuntu 官方仓库和 nginx.org 仓库中通常包含较新的 NGINX 稳定版,推荐使用 apt 安装。
$ sudo apt update
$ sudo apt install nginx -y安装完毕后直接验证即可:
# 检查服务状态(正常应该是 active (running) + enabled)
$ sudo systemctl status nginx
# 检查版本和编译参数
$ nginx -v
$ nginx -V
# 检查配置语法
$ sudo nginx -t浏览器访问 http://<服务器IP> 看到 Welcome to nginx! 即安装成功。
常用命令:
$ sudo systemctl start nginx # 启动
$ sudo systemctl stop nginx # 停止
$ sudo systemctl restart nginx # 重启(断开连接)
$ sudo systemctl reload nginx # 重载配置(不中断,修改配置后用这个!)
$ sudo systemctl status nginx # 查看状态
$ sudo nginx -t # 检查配置文件语法错误 ★ 每次改完配置必执行源码编译安装
如需最新版或自定义编译模块(如 ngx_brotli、ngx_cache_purge 等),使用源码编译方式。 这种方式不会自动注册 systemd service,也不包含任何默认配置,需要完全手动处理。
安装编译依赖:
$ sudo apt install build-essential libpcre2-dev libpcre2-8-0 zlib1g-dev libssl-dev -y下载依赖源码:
- PCRE2 – 点击下载
$ cd /opt/
$ sudo tar -zxf pcre2-10.42.tar.gz
$ cd pcre2-10.42
$ ./configure
$ make && sudo make install- zlib – 点击下载
$ cd /opt/
$ sudo tar -zxf zlib-1.2.13.tar.gz
$ cd zlib-1.2.13
$ ./configure
$ make && sudo make install- OpenSSL – Ubuntu 24.04 已内置 OpenSSL 3.x,通常无需单独安装
下载并编译安装 NGINX:
进入 NGINX 下载页 下载源码
$ cd /opt/
$ sudo tar -zxvf nginx-1.26.1.tar.gz
$ cd nginx-1.26.1
$ ./configure --prefix=/usr/local/nginx \
--with-pcre=../pcre2-10.42 \
--with-zlib=../zlib-1.2.13 \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module
$ make && sudo make install方便使用,给 nginx 加软链接到 PATH:
$ sudo ln -sf /usr/local/nginx/sbin/nginx /usr/sbin/nginx
$ nginx -vAPT vs 源码编译 目录结构对比表(对照着看,避免路径混用):
| 项目 | APT 安装(推荐,分散在系统目录) | 源码编译(集中在 prefix /usr/local/nginx) |
|---|---|---|
| 安装目录(prefix) | 无独立 prefix,分散在 /etc /var /usr/sbin 等标准 FHS 目录 | /usr/local/nginx |
| 主配置文件 | /etc/nginx/nginx.conf | /usr/local/nginx/conf/nginx.conf |
| 站点配置目录 | /etc/nginx/conf.d/*.conf(apt 版本默认已 include) | /usr/local/nginx/conf/conf.d/*.conf(需在 nginx.conf 自行 include) |
| 日志目录 | /var/log/nginx/(access.log / error.log) | /usr/local/nginx/logs/ |
| 站点根目录 | /var/www/html/ | /usr/local/nginx/html/ |
| 可执行文件 | /usr/sbin/nginx(已在系统 PATH 中,任意目录可直接 nginx) | /usr/local/nginx/sbin/nginx(上方已加软链到 /usr/sbin) |
| PID 文件 | /run/nginx.pid | /usr/local/nginx/logs/nginx.pid |
| systemd service | ✅ 已自动注册,直接使用:systemctl start/stop/restart/status/reload nginx | ❌ 未注册 |
(仅源码编译版需要)注册 systemd service
在 /lib/systemd/system目录下增加 nginx.service:
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /usr/local/nginx/logs/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /usr/local/nginx/logs/nginx.pid)"
PrivateTmp=true
[Install]
WantedBy=multi-user.target加载并启用:
$ sudo systemctl daemon-reload
$ sudo systemctl enable nginx # 开机自启
$ sudo systemctl start nginx # 启动
$ sudo systemctl status nginx # 验证vsftpd
apt安装 vsftpd
安装软件包
$ sudo apt update && sudo apt install vsftpd -y创建 FTP 用户
$ sudo useradd -m y9admin设置 FTP 登录密码(需要手动输入两次):
$ sudo passwd y9admin修改配置文件
备份原配置:
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak删除可能旧/重复的参数(避免参数重复导致 vsftpd 起不来):
$ for k in write_enable local_umask file_open_mode seccomp_sandbox \
chroot_local_user allow_writeable_chroot \
userlist_enable userlist_deny userlist_file \
pasv_enable pasv_min_port pasv_max_port pasv_promiscuous \
dual_log_enable vsftpd_log_file pam_service_name \
local_enable anonymous_enable; do
sudo sed -i "/^${k}=/d" /etc/vsftpd.conf
done一次性追加最小可用配置:
$ sudo tee -a /etc/vsftpd.conf > /dev/null << 'EOF'
# ============ y9-cloud Ubuntu 最小可用配置 ============
# 基础
local_enable=YES
anonymous_enable=NO
write_enable=YES
local_umask=022
file_open_mode=0644
# 上传 0 Bytes 元凶:关闭 Ubuntu seccomp 沙箱
seccomp_sandbox=NO
# chroot 隔离用户到家目录,不能看系统目录
chroot_local_user=YES
allow_writeable_chroot=YES
# 白名单(只有写在 vsftpd.user_list 里的用户能登录)
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.user_list
# 被动模式端口(和 UFW 放行段一致)
pasv_enable=YES
pasv_min_port=30011
pasv_max_port=30030
pasv_promiscuous=YES
# 云服务器/有公网 IP 时,请取消下面这行注释并改成你的「公网 IP」
# pasv_address=1.2.3.4
# 日志 + PAM
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
pam_service_name=vsftpd
EOF执行后快速自检参数不重复(无任何输出 = OK):
$ for k in write_enable local_umask seccomp_sandbox chroot_local_user allow_writeable_chroot; do
n=$(grep -cE "^${k}=" /etc/vsftpd.conf)
[ "$n" -ne 1 ] && echo "⚠️ ${k} 出现 ${n} 次,请清理"
done启动验证
白名单:允许 y9admin 登录(/etc/vsftpd.user_list 一行一个用户名):
$ echo "y9admin" | sudo tee /etc/vsftpd.user_list黑名单校验:y9admin 绝对不能出现在 /etc/ftpusers 里(出现了就会被拒登):
$ grep -q y9admin /etc/ftpusers && echo "❌ /etc/ftpusers 黑名单里有 y9admin,手动删掉" \
|| echo "✅ 黑名单 OK"启动服务并设置开机自启:
$ sudo systemctl restart vsftpd
$ sudo systemctl enable vsftpdUFW 放行 20/21 端口 + 被动模式端口段(没开防火墙也不会报错):
$ sudo ufw allow 20:21/tcp && sudo ufw allow 30011:30030/tcp && sudo ufw reload 2>/dev/nullKafka (Zookeeper)
压缩包安装
下载 kafka 3.6.2 tgz压缩包并上传至服务器 kafka 官方下载地址,或直接使用 wget 下载
$ cd /opt/
$ wget https://archive.apache.org/dist/kafka/3.6.2/kafka_2.13-3.6.2.tgz
# 解压
$ tar -xvf kafka_2.13-3.6.2.tgz
# 创建软链接,方便后续的访问及升级
$ sudo ln -s kafka_2.13-3.6.2 kafka修改 config/server.properties
broker.id=0
listeners=PLAINTEXT://IP(需要根据实际情况填写):9092
advertised.listeners=PLAINTEXT://IP:9092
log.dirs=/opt/kafka/data //根据实际情况填写
zookeeper.connect=localhost:2181修改 config/zookeeper.properties
dataDir=/opt/kafka/zookeeper-data //根据实际情况填写后台启动 zookeeper
$ /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties后台启动 kafka
$ /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties注册 systemd service
注册为 systemd 服务后可实现开机自启、异常重启、统一状态管理。在 /lib/systemd/system下分别创建 zookeeper.service 和 kafka.service。
zookeeper.service:
[Unit]
Description=Zookeeper Service for Kafka
After=network.target syslog.target
[Service]
Type=forking
User=root
Group=root
WorkingDirectory=/opt/kafka
Environment="JAVA_HOME=/opt/jdk"
ExecStartPre=/bin/mkdir -p /opt/kafka/zookeeper-data
ExecStart=/opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
ExecStop=/opt/kafka/bin/zookeeper-server-stop.sh
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.targetkafka.service:
[Unit]
Description=Kafka Broker Service
Requires=zookeeper.service
After=network.target syslog.target zookeeper.service
[Service]
Type=forking
User=root
Group=root
WorkingDirectory=/opt/kafka
Environment="JAVA_HOME=/opt/jdk"
ExecStartPre=/bin/mkdir -p /opt/kafka/data
ExecStart=/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target创建完成后重载并启动(注意顺序:先 Zookeeper,再 Kafka):
$ sudo systemctl daemon-reload
# Zookeeper
$ sudo systemctl enable zookeeper
$ sudo systemctl start zookeeper
$ sudo systemctl status zookeeper
# Kafka
$ sudo systemctl enable kafka
$ sudo systemctl start kafka
$ sudo systemctl status kafka验证端口监听:
$ sudo ss -tlnp | grep -E ':(2181|9092)'
LISTEN 0 50 192.168.x.x:9092 0.0.0.0:* users:(("java",pid=xxx,fd=xxx))
LISTEN 0 50 0.0.0.0:2181 0.0.0.0:* users:(("java",pid=yyy,fd=yyy))Redis
apt 源安装(推荐)
Ubuntu 仓库中包含较新的 Redis 版本
$ sudo apt install redis-server -y修改配置文件 /etc/redis/redis.conf
# 根据自己需求设置密码 生产环境建议设置
requirepass foobared
# 绑定本机的 IP 地址,根据自己网络情况调整
bind 0.0.0.0重启服务
$ sudo systemctl restart redis-server
$ sudo systemctl enable redis-server源码安装
如需最新版可源码编译安装
安装编译依赖
$ sudo apt install build-essential pkg-config libssl-dev -y下载源码
$ cd /opt/
$ wget https://download.redis.io/redis-stable.tar.gz
$ tar -xzvf redis-stable.tar.gz
$ cd redis-stable
$ make
$ sudo make install创建单独 /usr/local/redis 目录,将相关安装的二进制文件链接到此,配置文件复制到此
$ sudo mkdir -p /usr/local/redis
$ sudo ln -s /usr/local/bin/redis-* /usr/local/redis
$ sudo cp redis.conf /usr/local/redis/修改配置文件 /usr/local/redis/redis.conf
# 是否以后台守护进程的方式启动
daemonize yes
# pid 所在位置,后面注册 system service 需要
pidfile /var/run/redis_6379.pid
# 根据自己需求设置密码 生产环境建议设置
requirepass foobared
# 绑定本机的 IP 地址,根据自己网络情况调整
bind 0.0.0.0注册 systemd service
在/lib/systemd/system目录下增加redis.service
[Unit]
Description=Redis
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/redis-server /usr/local/redis/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
[Install]
WantedBy=multi-user.target启动 Redis
$ sudo systemctl daemon-reload
$ sudo systemctl enable redis
$ sudo systemctl start redisElasticSearch
安装前准备的系统设置
文件句柄 / 进程数上限 , 把 JVM 堆锁定在物理内存,避免被 swap 出去导致 GC 卡秒级
$ sudo tee -a /etc/security/limits.conf << 'EOF'
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
* soft memlock unlimited
* hard memlock unlimited
EOF内核参数:mmap 计数上限 + 降低 swap 积极性
TIP
- 用独立文件 /etc/sysctl.d/99-elasticsearch.conf 写 ES 专用参数(Ubuntu 官方推荐方式):
一眼就能看出是 ES 加的,以后要还原直接 rm 这个文件就行; 99- 前缀最后加载,会覆盖 Ubuntu 默认的 /usr/lib/sysctl.d/10-*-swappiness.conf(默认值 60)
- vm.max_map_count 按常见文档写 655300(ES 要求 ≥ 262144,越大越稳)
- vm.swappiness=1:平时不换页,只有内存真的快 OOM 才用 swap
$ sudo tee /etc/sysctl.d/99-elasticsearch.conf << 'EOF'
vm.max_map_count = 655300
vm.swappiness = 1
EOF载入刚才的 drop-in 文件,立即生效
#载入sysctl配置文件
$ sudo sysctl --system
#查看y9-elasticsearch的设置
$ sudo sysctl -p /etc/sysctl.d/99-elasticsearch.conf
# 结果显示
# vm.max_map_count = 655300
# vm.swappiness = 1APT 源安装
使用 Elastic 官方 APT 仓库安装
安装依赖并添加 GPG 密钥
$ sudo apt install -y apt-transport-https gnupg curl
$ curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/elasticsearch.gpg添加 Elastic 仓库
$ echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
$ sudo apt update安装 Elasticsearch
$ sudo apt install elasticsearch -y修改配置: /etc/elasticsearch/elasticsearch.yml
$ sudo vim /etc/elasticsearch/elasticsearch.yml添加或修改以下配置:
# 集群名称(所有要加入同一集群的节点必须完全一致)
cluster.name: y9elasticsearch
# 存放数据的路径 如没有设置移除取消注释
# path.data: /var/lib/elasticsearch
# 存放日志的路径 如没有设置移除取消注释
# path.logs: /var/log/elasticsearch
# 节点名称(集群内每个节点必须唯一,建议跟主机名对应)
node.name: y9Node
# 监听地址
# · 对外访问 / 生产 / 准备扩集群:写 0.0.0.0 或者本机实际网卡 IP(例 192.168.3.116)
# 绑定非回环 IP 会进入生产模式,所有 bootstrap 检查强制开启(discovery / max_map_count / fd...)
# · 仅本机访问(y9 应用和 ES 完全同机):写 127.0.0.1,进入开发模式跳过检查
network.host: 127.0.0.1
# 设置对外服务的 http 端口,默认为 9200
http.port: 9200
# 默认情况下端口是9300,这里添加修改,指定为其他端口
# transport.tcp.port: 9300
# 集群种子节点列表:写所有 master 资格节点的 IP:transport端口
# 单节点起步:先只写当前节点自己,后面加节点时在所有节点同步追加新节点地址
# 建议至少写 3 个(3 节点集群容错最好),格式:["192.168.3.116:9300", "192.168.3.117:9300", "192.168.3.118:9300"]
# discovery.seed_hosts: ["192.168.3.116:9300"]
# ② 初始 master 节点列表:仅用于「全新集群第一次启动」做 master 选举引导
# 写所有初次参与选举的节点的 node.name,初次启动成功、集群形成后必须删掉或注释掉
# 后续节点重启 / 扩容节点都不要再带,保留会有选举异常风险
cluster.initial_master_nodes: ['y9Node']
# 浏览器插件访问配置(ElasticSearch-Head 等前端工具连)
http.cors.enabled: true
http.cors.allow-origin: '*'
http.cors.allow-headers: Authorization查看修改结果:
$ grep -n '^[a-z]' /etc/elasticsearch/elasticsearch.yml启动Elasticsearch
启动前准备工作
JVM 堆内存调优(推荐 4G;物理内存不够就设 2G / 1G,记住两条原则: ① -Xms 和 -Xmx 必须相等,避免运行时 GC 前扩容缩容抖动; ② 总堆大小 不超过物理内存的 50%,且一定不要超过 32G)
# ES 7.x 推荐在 jvm.options.d/ 下放独立文件,升级时不会被覆盖
# · 4G 内存机器(推荐):-Xms4g / -Xmx4g
# · 2G 内存机器(内存紧张的开发机):把下面的 4g 都改成 2g
$ echo '-Xms4g
-Xmx4g' | sudo tee /etc/elasticsearch/jvm.options.d/custom.options
# 验证(必须同时出现两个相同值的行)
$ cat /etc/elasticsearch/jvm.options.d/custom.options启动
$ sudo systemctl enable elasticsearch
$ sudo systemctl start elasticsearch
$ sudo systemctl status elasticsearch开启 X-Pack 用户名密码认证
停 ES,生成自签 TLS 证书(ca + 节点证书合成一个 p12 文件,所有节点共用最简单)
$ sudo systemctl stop elasticsearch
# 1) 用 ES 自带 certutil 生成 CA(**一路回车就行**)
$ sudo /usr/share/elasticsearch/bin/elasticsearch-certutil ca --pem --force --out /home/y9admin/elastic-stack-ca.zip
$ cd /home/y9admin && sudo unzip -o elastic-stack-ca.zip -d /home/y9admin/elastic-ca
$ sudo /usr/share/elasticsearch/bin/elasticsearch-certutil cert \
--ca-cert /home/y9admin/elastic-ca/ca/ca.crt \
--ca-key /home/y9admin/elastic-ca/ca/ca.key \
--out /home/y9admin/elastic-certificates.p12
# 交互提示密码时直接两次回车(空密码);生产环境可设密码,yml 里再配 keystore 密码
# 3) 证书放到 ES 配置目录,改属主(APT 安装的 ES 进程运行用户是 elasticsearch)
$ sudo mkdir -p /etc/elasticsearch/certs
$ sudo cp /home/y9admin/elastic-certificates.p12 /etc/elasticsearch/certs/
$ sudo chown -R elasticsearch:elasticsearch /etc/elasticsearch/certselasticsearch.yml 追加安全相关配置
$ sudo tee -a /etc/elasticsearch/elasticsearch.yml << 'EOF'
# ------------------------------
# X-Pack 安全认证(生产必开)
# ------------------------------
# 开启用户名密码认证 + RBAC
xpack.security.enabled: true
# 集群节点间通信必须走 TLS(discovery 集群模式下开 security 强制要求)
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
# 如果证书/p12 设置了密码,把下面两行的注释打开,并把 YOUR_P12_PASSWORD 换掉
# xpack.security.transport.ssl.keystore.secure_password: YOUR_P12_PASSWORD
# xpack.security.transport.ssl.truststore.secure_password: YOUR_P12_PASSWORD
# HTTP 层是否启用 HTTPS(可选;生产推荐启用,局域网内部对 y9 应用也可以不启用走 HTTP)
# xpack.security.http.ssl.enabled: true
# xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
# xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12
EOF启动 ES,等状态 green 再设密码
$ sudo systemctl daemon-reload
$ sudo systemctl start elasticsearch
# 等启动完成(返回 "status" : "green" 或 "yellow",timeout 90 秒)
$ curl -s -XGET 'http://127.0.0.1:9200/_cluster/health?wait_for_status=yellow&timeout=90s&pretty'
# 单节点起步必然是 yellow(没有副本分片),正常;3 节点集群应该是 green设置内置用户密码(elastic / kibana / logstash_system 等)
$ sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactivesetup-passwords 成功会输出:Changed password for user elastic / kibana / logstash_system / beats_system / apm_system / remote_monitoring_user。
验证认证生效
$ curl -u 'elastic:YOUR_ELASTIC_PASSWORD' http://127.0.0.1:9200?pretty通过压缩包安装
安装
下载地址
Elasticsearch 包下载页下载 压缩包安装
联网的服务器可以直接下载
$ cd /opt/
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.22-linux-x86_64.tar.gz
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.22-linux-x86_64.tar.gz.sha512解压文件
$ shasum -a 512 -c elasticsearch-7.17.22-linux-x86_64.tar.gz.sha512
elasticsearch-7.17.22-linux-x86_64.tar.gz: OK
$ tar -xzf elasticsearch-7.17.22-linux-x86_64.tar.gz
$ cd elasticsearch-7.17.22/创建用户以及相关的文件夹
创建用户:
$ sudo groupadd elastic
$ sudo useradd elastic -g elastic -s /bin/bash创建elasticsearch数据及日志目录并设置权限
$ sudo mkdir -p /software/elasticsearch-7.17.22/{data,logs}
$ sudo chown elastic:elastic -R /software/elasticsearch-7.17.22
$ ls -l /software/elasticsearch-7.17.22
total 668
-rw-r--r-- 1 elastic elastic 3860 Jun 6 15:34 LICENSE.txt
-rw-r--r-- 1 elastic elastic 640930 Jun 6 15:36 NOTICE.txt
-rw-r--r-- 1 elastic elastic 2710 Jun 6 15:34 README.asciidoc
drwxr-xr-x 2 elastic elastic 4096 Aug 23 15:56 bin
drwxr-xr-x 3 elastic elastic 4096 Aug 23 15:59 config
drwxr-xr-x 3 elastic elastic 4096 Aug 23 15:49 data
drwxr-xr-x 8 elastic elastic 4096 Jun 6 15:39 jdk
drwxr-xr-x 3 elastic elastic 4096 Jun 6 15:39 lib
drwxr-xr-x 2 elastic elastic 4096 Aug 26 01:03 logs
drwxr-xr-x 61 elastic elastic 4096 Jun 6 15:39 modules
drwxr-xr-x 2 elastic elastic 4096 Jun 6 15:36 plugins- 修改Elasticsearch配置文件
修改 ./config/elasticsearch.yml 的文件配置,与 APT 安装中的配置类似
启动Elasticsearch
$ su elastic
$ cd /software/elasticsearch-7.17.22
$ nohup ./elasticsearch > ./elastic.log 2>&1 &
#查看日志
$ tail -f elastic.log -n 500
#查询进程
$ ps -ef | grep elastic测试Elasticsearch状态
$ curl 192.168.3.31:9200
{
"name" : "elasticsearch-node1",
"cluster_name" : "y9elasticsearch",
"cluster_uuid" : "4gAWR1QIRSudSMc18YHZ2g",
"version" : {
"number" : "7.17.16",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "2b23fa076334f8d4651aeebe458a955a2ae23218",
"build_date" : "2023-12-08T10:06:54.672540567Z",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}开启 X-Pack 用户名密码认证
第一步 切换到elasticsearch的目录下,使用下列命令生成证书
$ cd /software/elasticsearch-7.17.22/
$ bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""注意,要让新生成的证书文件能够被普通用户读取到,即,需要重新更改一次权限。
$ sudo chown elastic:elastic -R /software/elasticsearch-7.17.22第二步 打开 config/elasticsearch.yml ,在尾部添加下面的配置代码:
$ cat >> config/elasticsearch.yml << EOF
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
EOF启动 elasticsearch 服务,使用cd命令切换到 elasticsearch 目录。使用以下命令设置密码,然后一一输入账号的密码
$ ./elasticsearch-setup-passwords interactive重新登录就会发现需要进行验证了,输入密码,即可显示安装信息
$ curl 192.168.3.31:9200 -u elastic
Enter host password for user 'elastic':
{
"name" : "elasticsearch-node1",
"cluster_name" : "y9elasticsearch",
"cluster_uuid" : "4gAWR1QIRSudSMc18YHZ2g",
"version" : {
"number" : "7.17.16",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "2b23fa076334f8d4651aeebe458a955a2ae23218",
"build_date" : "2023-12-08T10:06:54.672540567Z",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}升级 (示例:7.9.3 升级至 7.17.22,有开启验证)
1、解压 elasticsearch-7.17.22.tar.gz
2、停止 elasticsearch 服务 ,拷贝7.9.3版本的配置到7.17.22版本。
拷贝 elasticsearch.yml,elasticsearch.keystore ,jvm.options ,elastic-certificates.p12 文件到 config 路径下
注:拷贝 jvm.options 文件(官方专门强调的)
3、拷贝 path.data(data数据目录)的内容至新版本
拷贝完,更新一下用户和用户组权限,例如:
$ sudo chown -R elastic:elastic elasticsearch-7.17.224、修改ES配置文件,设置密码
第一步、修改 elasticsearch.yml 配置,将身份验证相关配置屏蔽掉;
$ vim config/elasticsearch.yml
#将验证关闭
xpack.security.enabled: false第二步、切换 elastic 用户,启动 elasticsearch 服务
$ sudo systemctl restart elasticsearch
# 或者
$ nohup ./elasticsearch > ./elastic.log 2>&1 &删除多余的.security-7索引
$ curl -X DELETE "http://192.168.3.38:9206/.security-*"到此就回到 ES 没有设置密码的阶段了,重新将验证打开,重启服务,执行设置密码的操作
第三步、设置 elasticsearch 密码
先将验证开启
xpack.security.enabled: true重启服务后执行设置密码命令
$ ./elasticsearch-setup-passwords interactiveNacos
下载编译后压缩包方式
从 Nacos 最新稳定版本 下载 nacos-server-$version.tar.gz 包,上传至 /opt 目录下或直接使用 wget 下载:
$ cd /opt/
$ sudo wget https://github.com/alibaba/nacos/releases/download/2.2.1/nacos-server-2.2.1.tar.gz
$ sudo tar -xvf nacos-server-2.2.1.tar.gz
# 软链接方便后续升级切换版本
$ sudo ln -s nacos-server-2.2.1 nacos修改配置文件 /opt/nacos/conf/application.properties:
#*************** Config Module Related Configurations ***************#
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.0.1:3306/nacos?serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&useCompression=true&useSSL=false&allowPublicKeyRetrieval=true
db.user=root
db.password=111111
server.tomcat.basedir=/opt/nacos/tomcat
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789TIP
生产环境请务必替换上面的 db.password 和 nacos.core.auth.plugin.nacos.token.secret.key(长度必须 ≥ 32 字符),并确保 MySQL 中已创建 nacos 数据库,执行 /opt/nacos/conf/mysql-schema.sql 初始化表结构。
启动命令(standalone 代表单机模式运行,非集群模式。Ubuntu 默认 sh 是 dash,请务必用 bash 执行,避免 [[ 语法报错):
$ cd /opt/nacos/bin
$ sudo bash startup.sh -m standalone关闭命令:
$ cd /opt/nacos/bin
$ sudo bash shutdown.sh注册 systemd service
在 /lib/systemd/system/nacos.service(Ubuntu 使用 /lib/systemd/system 而非 /usr/lib/systemd/system)下创建服务文件:
[Unit]
Description=Nacos Service
After=network.target syslog.target mysql.service
[Service]
Type=forking
User=root
Group=root
WorkingDirectory=/opt/nacos
Environment="JAVA_HOME=/opt/jdk"
Environment="NACOS_HOME=/opt/nacos"
ExecStartPre=/bin/mkdir -p /opt/nacos/tomcat /opt/nacos/logs
ExecStart=/bin/bash /opt/nacos/bin/startup.sh -m standalone
ExecStop=/bin/bash /opt/nacos/bin/shutdown.sh
Restart=on-failure
RestartSec=10s
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target创建完成后重载、UFW 放行端口、启动并验证:
$ sudo systemctl daemon-reload
# Nacos 2.x 需要的端口:8848(HTTP) + 9848(gRPC 客户端通讯) + 9849(gRPC 服务端 Raft)
$ sudo ufw allow 8848/tcp && sudo ufw allow 9848:9849/tcp && sudo ufw reload 2>/dev/null
# 启动 + 开机自启
$ sudo systemctl enable nacos
$ sudo systemctl start nacos
$ sudo systemctl status nacos验证端口监听与健康检查(Nacos 完全启动约需 30~60 秒):
$ sudo ss -tlnp | grep -E ':(8848|9848|9849)'
LISTEN 0 50 0.0.0.0:8848 0.0.0.0:* users:(("java",pid=xxx,fd=xxx))
LISTEN 0 50 0.0.0.0:9848 0.0.0.0:* users:(("java",pid=xxx,fd=xxx))
LISTEN 0 50 0.0.0.0:9849 0.0.0.0:* users:(("java",pid=xxx,fd=xxx))
# HTTP 健康检查
$ curl -s http://127.0.0.1:8848/nacos/v1/console/health/liveness | head -5浏览器访问 http://服务器IP:8848/nacos,默认账号密码 nacos / nacos。