Skip to content

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 需要重新加载

shell
$ sudo systemctl daemon-reload

可配置服务开机自启 systemctl enable

shell
$ sudo systemctl enable ufw

配置防火墙 (UFW)

Ubuntu 使用 UFW (Uncomplicated Firewall) 作为默认防火墙管理工具

shell
$ 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 配置

shell
$ sudo systemctl status apparmor # 查看状态
$ sudo systemctl stop apparmor # 临时停止
$ sudo systemctl disable apparmor # 禁止开机启动(不推荐)

WARNING

通常不需要完全禁用 AppArmor,建议根据需求调整具体配置文件

JDK

我们开发过程中使用 Eclipse Temurin 的发行版本

卸载可能预装的 JDK

在安装之前需检查是否已有 JDK,可通过执行命令查看

shell
$ 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 相关包

shell
$ 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

执行命令卸载

shell
$ 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目录下,然后解压文件

shell
$ cd /opt/
$ sudo tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.24_8.tar.gz

可创建软链接,方便访问及后续的升级切换

shell
$ sudo ln -s jdk-11.0.24+8 jdk

配置环境变量

shell
$ sudo vim /etc/profile.d/java.sh

创建新文件并添加以下内容

shell
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME/bin

vim基本命令:i插入模式,esc键退出插入模式,:wq保存退出。

利用下面命令使配置生效,并且查看 JDK 版本

shell
$ 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

shell
$ 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 不易查找,使用以下通用且安全的方式定位:

shell
# 方式一:通过 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 环境变量(最安全通用写法,写死实际路径):

shell
$ 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.sh

Tomcat

安装 Tomcat

进入Tomcat 下载页下载安装包

下载后的文件名为 apache-tomcat-9.0.91.tar.gz,将文件上传至服务器/opt目录下,然后解压

shell
$ cd /opt/
$ sudo tar zxf apache-tomcat-9.0.91.tar.gz

可创建软链接,方便访问及后续的升级切换

shell
$ 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

重载所有修改过的配置文件:

shell
$ sudo systemctl daemon-reload
shell
$ 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

卸载旧版本

shell
$ sudo apt remove --purge mariadb-* mysql-* -y 2>/dev/null || true
$ sudo apt autoremove -y

添加 MySQL 官方 APT 仓库

shell
$ 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

安装

shell
$ 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 / 老系统迁数据、或已有脚本里大小写混用 → 执行本节

注:

  1. 下面有 rm -rf /var/lib/mysql 会清空所有库表,只适合刚安装完、还没导入任何数据的全新机器;有数据的机器请用 mysqldump 导出 → 清库重建 → 重新导入
  2. MySQL 8.x 规定 lower_case_table_names 必须在数据目录首次初始化前写入,之后再改会导致 MySQL 无法启动,所以只能在安装完这个时机设置
shell
$ 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(否则就是旧数据没清干净,重来一遍):

shell
$ sudo mysql -e "SHOW VARIABLES LIKE 'lower_case_table_names';"
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 1     |
+------------------------+-------+

验证安装结果(MySQL 可正常使用)

shell
$ mysql --version
mysql  Ver 8.0.39 for Linux on x86_64 (MySQL Community Server - GPL)

$ sudo systemctl status mysql
# 必须是 active (running),否则按下面排错速查处理

时区设置

shell
# 强制设置系统时区为中国(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 推荐参数

shell
$ 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 能进),改成密码登录:

shell
$ sudo mysql
sql
mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass4!';
mysql > FLUSH PRIVILEGES;
mysql > EXIT;

之后即可用密码登录:

shell
$ mysql -u root -p

开放外部连接(可选执行)

MySQL 8 默认只允许本机(127.0.0.1)登录,需要改监听地址、加外部用户、放行防火墙。

第 1 步:修改监听地址为 0.0.0.0

shell
# 看一下当前 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 用户对 % 开放,风险太高,新建一个专用账号:

shell
$ sudo mysql -u root -p
sql
mysql> 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 端口 + 验证

shell
# 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 安装。

shell
$ sudo apt update
$ sudo apt install nginx -y

安装完毕后直接验证即可:

shell
# 检查服务状态(正常应该是 active (running) + enabled)
$ sudo systemctl status nginx

# 检查版本和编译参数
$ nginx -v
$ nginx -V

# 检查配置语法
$ sudo nginx -t

浏览器访问 http://<服务器IP> 看到 Welcome to nginx! 即安装成功。

常用命令:

shell
$ sudo systemctl start nginx       # 启动
$ sudo systemctl stop nginx        # 停止
$ sudo systemctl restart nginx     # 重启(断开连接)
$ sudo systemctl reload nginx      # 重载配置(不中断,修改配置后用这个!)
$ sudo systemctl status nginx      # 查看状态
$ sudo nginx -t                    # 检查配置文件语法错误 ★ 每次改完配置必执行

源码编译安装

如需最新版或自定义编译模块(如 ngx_brotlingx_cache_purge 等),使用源码编译方式。 这种方式不会自动注册 systemd service,也不包含任何默认配置,需要完全手动处理。

安装编译依赖:

shell
$ sudo apt install build-essential libpcre2-dev libpcre2-8-0 zlib1g-dev libssl-dev -y

下载依赖源码:

shell
$ cd /opt/
$ sudo tar -zxf pcre2-10.42.tar.gz
$ cd pcre2-10.42
$ ./configure
$ make && sudo make install
shell
$ 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 下载页 下载源码

shell
$ 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:

shell
$ sudo ln -sf /usr/local/nginx/sbin/nginx /usr/sbin/nginx
$ nginx -v

APT 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

ini
[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

加载并启用:

shell
$ sudo systemctl daemon-reload
$ sudo systemctl enable nginx      # 开机自启
$ sudo systemctl start nginx       # 启动
$ sudo systemctl status nginx      # 验证

vsftpd

apt安装 vsftpd

安装软件包

shell
$ sudo apt update && sudo apt install vsftpd -y

创建 FTP 用户

shell
$ sudo useradd -m y9admin

设置 FTP 登录密码(需要手动输入两次):

shell
$ sudo passwd y9admin

修改配置文件

备份原配置:

shell
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

删除可能旧/重复的参数(避免参数重复导致 vsftpd 起不来):

shell
$ 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

一次性追加最小可用配置:

shell
$ 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):

shell
$ 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 一行一个用户名):

shell
$ echo "y9admin" | sudo tee /etc/vsftpd.user_list

黑名单校验:y9admin 绝对不能出现在 /etc/ftpusers 里(出现了就会被拒登):

shell
$ grep -q y9admin /etc/ftpusers && echo "❌ /etc/ftpusers 黑名单里有 y9admin,手动删掉" \
                                    || echo "✅ 黑名单 OK"

启动服务并设置开机自启:

shell
$ sudo systemctl restart vsftpd
$ sudo systemctl enable vsftpd

UFW 放行 20/21 端口 + 被动模式端口段(没开防火墙也不会报错):

shell
$ sudo ufw allow 20:21/tcp && sudo ufw allow 30011:30030/tcp && sudo ufw reload 2>/dev/null

Kafka (Zookeeper)

压缩包安装

下载 kafka 3.6.2 tgz压缩包并上传至服务器 kafka 官方下载地址,或直接使用 wget 下载

shell
$ 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

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

properties
dataDir=/opt/kafka/zookeeper-data //根据实际情况填写

后台启动 zookeeper

shell
$ /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties

后台启动 kafka

shell
$ /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties

注册 systemd service

注册为 systemd 服务后可实现开机自启、异常重启、统一状态管理。在 /lib/systemd/system下分别创建 zookeeper.servicekafka.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.target

kafka.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):

shell
$ 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

验证端口监听:

shell
$ 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 版本

shell
$ sudo apt install redis-server -y

修改配置文件 /etc/redis/redis.conf

# 根据自己需求设置密码 生产环境建议设置
requirepass foobared
# 绑定本机的 IP 地址,根据自己网络情况调整
bind 0.0.0.0

重启服务

shell
$ sudo systemctl restart redis-server
$ sudo systemctl enable redis-server

源码安装

如需最新版可源码编译安装

安装编译依赖

shell
$ sudo apt install build-essential pkg-config libssl-dev -y

下载源码

shell
$ 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 目录,将相关安装的二进制文件链接到此,配置文件复制到此

shell
$ 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

shell
$ sudo systemctl daemon-reload
$ sudo systemctl enable redis
$ sudo systemctl start redis

ElasticSearch

安装前准备的系统设置

文件句柄 / 进程数上限 , 把 JVM 堆锁定在物理内存,避免被 swap 出去导致 GC 卡秒级

shell
$ 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
shell
$ sudo tee /etc/sysctl.d/99-elasticsearch.conf << 'EOF'
vm.max_map_count = 655300
vm.swappiness = 1
EOF

载入刚才的 drop-in 文件,立即生效

shell
#载入sysctl配置文件
$ sudo sysctl --system

#查看y9-elasticsearch的设置
$ sudo sysctl -p /etc/sysctl.d/99-elasticsearch.conf
# 结果显示
# vm.max_map_count = 655300
# vm.swappiness = 1

APT 源安装

使用 Elastic 官方 APT 仓库安装

安装依赖并添加 GPG 密钥

shell
$ 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 仓库

shell
$ 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

shell
$ sudo apt install elasticsearch -y

修改配置: /etc/elasticsearch/elasticsearch.yml

shell
$ sudo vim /etc/elasticsearch/elasticsearch.yml

添加或修改以下配置:

yaml
# 集群名称(所有要加入同一集群的节点必须完全一致)
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

查看修改结果:

shell
$ grep -n '^[a-z]' /etc/elasticsearch/elasticsearch.yml

启动Elasticsearch

启动前准备工作

JVM 堆内存调优(推荐 4G;物理内存不够就设 2G / 1G,记住两条原则: ① -Xms-Xmx 必须相等,避免运行时 GC 前扩容缩容抖动; ② 总堆大小 不超过物理内存的 50%,且一定不要超过 32G)

shell
# 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

启动

shell
$ sudo systemctl enable elasticsearch
$ sudo systemctl start elasticsearch
$ sudo systemctl status elasticsearch

开启 X-Pack 用户名密码认证

停 ES,生成自签 TLS 证书(ca + 节点证书合成一个 p12 文件,所有节点共用最简单)

shell
$ 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/certs

elasticsearch.yml 追加安全相关配置

shell
$ 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 再设密码

shell
$ 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 等)

shell
$ sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

setup-passwords 成功会输出:Changed password for user elastic / kibana / logstash_system / beats_system / apm_system / remote_monitoring_user

验证认证生效

shell
$ curl -u 'elastic:YOUR_ELASTIC_PASSWORD' http://127.0.0.1:9200?pretty

通过压缩包安装

安装

下载地址

Elasticsearch 包下载页下载 压缩包安装

联网的服务器可以直接下载

shell
$ 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

解压文件

shell
$ 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/

创建用户以及相关的文件夹

创建用户:

shell
$ sudo groupadd elastic
$ sudo useradd elastic -g elastic -s /bin/bash

创建elasticsearch数据及日志目录并设置权限

shell
$ 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

shell
$ 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状态

shell
$ 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的目录下,使用下列命令生成证书

shell
$ cd /software/elasticsearch-7.17.22/
$ bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""

注意,要让新生成的证书文件能够被普通用户读取到,即,需要重新更改一次权限。

shell
$ sudo chown elastic:elastic -R /software/elasticsearch-7.17.22

第二步 打开 config/elasticsearch.yml ,在尾部添加下面的配置代码:

shell
$ 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 目录。使用以下命令设置密码,然后一一输入账号的密码

shell
$ ./elasticsearch-setup-passwords interactive

重新登录就会发现需要进行验证了,输入密码,即可显示安装信息

shell
$ 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数据目录)的内容至新版本

拷贝完,更新一下用户和用户组权限,例如:

shell
$ sudo chown -R elastic:elastic elasticsearch-7.17.22

4、修改ES配置文件,设置密码

第一步、修改 elasticsearch.yml 配置,将身份验证相关配置屏蔽掉;

shell
$ vim config/elasticsearch.yml

#将验证关闭
xpack.security.enabled: false

第二步、切换 elastic 用户,启动 elasticsearch 服务

shell
$ sudo systemctl restart elasticsearch

# 或者
$ nohup ./elasticsearch > ./elastic.log 2>&1 &

删除多余的.security-7索引

shell
$ curl -X DELETE "http://192.168.3.38:9206/.security-*"

到此就回到 ES 没有设置密码的阶段了,重新将验证打开,重启服务,执行设置密码的操作

第三步、设置 elasticsearch 密码

先将验证开启

yaml
xpack.security.enabled: true

重启服务后执行设置密码命令

shell
$ ./elasticsearch-setup-passwords interactive

Nacos

下载编译后压缩包方式

Nacos 最新稳定版本 下载 nacos-server-$version.tar.gz 包,上传至 /opt 目录下或直接使用 wget 下载:

shell
$ 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=SecretKey012345678901234567890123456789012345678901234567890123456789

TIP

生产环境请务必替换上面的 db.passwordnacos.core.auth.plugin.nacos.token.secret.key(长度必须 ≥ 32 字符),并确保 MySQL 中已创建 nacos 数据库,执行 /opt/nacos/conf/mysql-schema.sql 初始化表结构。

启动命令(standalone 代表单机模式运行,非集群模式。Ubuntu 默认 sh 是 dash,请务必用 bash 执行,避免 [[ 语法报错):

shell
$ cd /opt/nacos/bin
$ sudo bash startup.sh -m standalone

关闭命令:

shell
$ 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 放行端口、启动并验证:

shell
$ 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 秒):

shell
$ 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

Released under the GPL-3.0 License.