1. 项目概述:Jenkins+Ansible实现LNMP环境自动化部署Discuz论坛
最近在帮一个社区项目做自动化部署改造,核心需求是通过Jenkins调用Ansible剧本,实现LNMP(Linux+Nginx+MySQL+PHP)环境的一键部署,并完成Discuz论坛的安装配置。这种组合方案特别适合需要频繁更新代码的中小型论坛项目,实测从裸机到论坛上线最快只需8分钟。
传统LNMP环境部署需要手动执行几十条命令,而Discuz的安装又要处理各种目录权限和配置文件。采用Jenkins+Ansible方案后,所有操作变成可重复执行的标准化流程。具体实现时,Jenkins负责构建触发和任务调度,Ansible完成实际的配置管理,两者通过SSH协议无缝衔接。下面分享我在实施过程中总结的完整方案和避坑指南。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具链配置
2.1 基础环境要求
推荐使用CentOS 7.9或Ubuntu 20.04 LTS作为基础系统,配置要求:
- 最小2核CPU/4GB内存(Discuz后台操作需要至少1GB空闲内存)
- 50GB磁盘空间(论坛附件会占用大量空间)
- 开启SSH服务(端口建议修改为非22)
注意:生产环境务必禁用root直接登录,建议创建专用部署账户并配置sudo权限
2.2 Jenkins主控节点安装
使用官方仓库安装最新LTS版本:
bash复制# CentOS
sudo wget -O /etc/yum.repos.d/jenkins.repo \
https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install epel-release -y
sudo yum install jenkins java-11-openjdk -y
# Ubuntu
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
/etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins openjdk-11-jdk -y
关键配置项:
- 修改JENKINS_PORT=8085(避免与常见服务冲突)
- 设置JENKINS_USER=deploy(专用部署账户)
- 内存参数:JAVA_ARGS="-Xms512m -Xmx1024m"
启动后通过ip:8085访问,初始密码位于:
bash复制sudo cat /var/lib/jenkins/secrets/initialAdminPassword
2.3 Ansible控制节点配置
在Jenkins服务器上安装Ansible:
bash复制# CentOS
sudo yum install ansible -y
# Ubuntu
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible -y
配置SSH免密登录到目标服务器:
bash复制ssh-keygen -t rsa -b 4096 -C "jenkins_ansible_key"
ssh-copy-id deploy@target_server_ip
验证连通性:
bash复制ansible all -m ping -i inventory.ini
3. Ansible剧本设计与实现
3.1 目录结构规划
采用role方式组织playbook:
code复制discuz-deploy/
├── inventory.ini # 主机清单
├── site.yml # 主剧本
├── roles/
│ ├── nginx/ # Nginx角色
│ ├── mysql/ # MySQL角色
│ ├── php/ # PHP角色
│ └── discuz/ # Discuz角色
└── vars/
└── main.yml # 全局变量
3.2 LNMP核心角色实现
以Nginx角色为例(roles/nginx/tasks/main.yml):
yaml复制- name: 安装Nginx
yum:
name: nginx
state: present
when: ansible_os_family == "RedHat"
- name: 配置虚拟主机
template:
src: templates/discuz.conf.j2
dest: /etc/nginx/conf.d/discuz.conf
notify: restart nginx
- name: 启动Nginx服务
service:
name: nginx
state: started
enabled: yes
PHP角色需要特别注意版本兼容性:
yaml复制- name: 添加EPEL和Remi仓库
yum:
name:
- epel-release
- https://rpms.remirepo.net/enterprise/remi-release-7.rpm
state: present
- name: 安装PHP7.4及扩展
yum:
name:
- php74-php-fpm
- php74-php-mysqlnd
- php74-php-gd
- php74-php-mbstring
state: present
3.3 Discuz部署关键步骤
论坛部署角色主要任务:
- 下载Discuz安装包(建议国内镜像源)
yaml复制- name: 下载Discuz安装包
get_url:
url: "https://mirrors.aliyun.com/discuzx/{{ discuz_version }}.zip"
dest: "/tmp/{{ discuz_version }}.zip"
- 解压并设置权限
yaml复制- name: 创建网站目录
file:
path: "{{ web_root }}"
state: directory
mode: 0755
- name: 解压安装包
unarchive:
src: "/tmp/{{ discuz_version }}.zip"
dest: "{{ web_root }}"
remote_src: yes
- 配置文件自动生成
yaml复制- name: 生成config_global.php
template:
src: templates/config_global.php.j2
dest: "{{ web_root }}/config/config_global.php"
4. Jenkins流水线集成
4.1 创建Pipeline项目
Jenkinsfile关键阶段定义:
groovy复制pipeline {
agent any
stages {
stage('检出代码') {
steps {
git branch: 'main',
url: 'https://github.com/your/ansible-playbook.git'
}
}
stage('执行Ansible') {
steps {
ansiblePlaybook(
playbook: 'site.yml',
inventory: 'inventory.ini',
credentialsId: 'ssh-key',
extras: '--vault-password-file ~/.ansible/vault_pass.txt'
)
}
}
stage('健康检查') {
steps {
sh 'curl -s http://target_server/install | grep "Discuz"'
}
}
}
}
4.2 安全加固措施
-
凭据管理:
- 使用Jenkins的Credentials Binding插件管理SSH密钥
- MySQL密码等敏感信息存储在Ansible Vault中
-
访问控制:
- 限制Jenkins管理后台访问IP
- 为Ansible设置专用sudo权限:
bash复制deploy ALL=(ALL) NOPASSWD: /usr/bin/apt-get, /usr/bin/yum
5. 常见问题与解决方案
5.1 部署失败排查流程
-
检查Jenkins控制台输出
- 查看Ansible执行的详细输出(添加-vvv参数)
- 确认playbook语法正确(ansible-playbook --syntax-check)
-
验证目标服务器状态
- SSH连接是否正常
- 磁盘空间是否充足(df -h)
- 关键端口是否监听(netstat -tulnp)
5.2 Discuz安装典型错误
- 目录不可写错误
bash复制chown -R nginx:nginx /var/www/discuz
chmod -R 755 /var/www/discuz/uc_server/data
- MySQL连接失败
- 检查bind-address配置(应为0.0.0.0)
- 确认用户远程登录权限:
sql复制GRANT ALL ON discuz.* TO 'discuz'@'%' IDENTIFIED BY 'password';
- PHP扩展缺失
- 确认安装gd、mbstring、pdo_mysql扩展
- 修改php.ini内存限制(memory_limit ≥ 128M)
6. 性能优化实践
6.1 LNMP参数调优
Nginx配置优化(/etc/nginx/nginx.conf):
nginx复制worker_processes auto;
worker_connections 4096;
keepalive_timeout 65;
gzip on;
PHP-FPM优化(/etc/php-fpm.d/www.conf):
ini复制pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 10
6.2 Discuz缓存配置
- 启用Redis缓存:
- 安装php-redis扩展
- 修改config_global.php:
php复制$_config['memory']['prefix'] = 'discuz_';
$_config['memory']['redis']['server'] = '127.0.0.1';
- 开启OPcache加速:
ini复制zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
这套方案在多个社区项目实际运行中表现稳定,日均处理10万+PV的论坛服务器资源占用保持在30%以下。最关键的是,当需要扩展服务器时,新的节点部署时间从原来的2小时缩短到10分钟。
