1. 为什么需要一键部署LNMP?
在OpenEuler服务器环境中手动搭建LNMP(Linux+Nginx+MySQL+PHP)环境是个既耗时又容易出错的过程。我见过太多新手在配置过程中因为一个依赖包版本不对,或者配置文件参数写错,导致整个环境崩溃的情况。更糟的是,当需要批量部署多台服务器时,重复的手动操作简直是一场噩梦。
Shell脚本自动化部署的价值在于:
- 标准化:确保每台服务器的环境完全一致
- 可重复:随时可以重建相同环境
- 高效:5分钟完成原本需要2小时的手动操作
- 可审计:所有操作步骤都记录在脚本中
提示:OpenEuler作为企业级Linux发行版,其软件源和依赖关系与CentOS/RHEL略有不同,这也是为什么需要专门适配的部署脚本。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与脚本设计思路
2.1 基础环境检查
在运行部署脚本前,建议先确认以下基础条件:
bash复制#!/bin/bash
# 检查是否为root用户
if [ "$(id -u)" != "0" ]; then
echo "错误:必须使用root用户运行此脚本" >&2
exit 1
fi
# 检查OpenEuler版本
if ! grep -q "openEuler" /etc/os-release; then
echo "错误:此脚本仅适用于openEuler系统" >&2
exit 1
fi
# 检查内存是否足够(至少2GB)
mem_total=$(grep MemTotal /proc/meminfo | awk '{print $2}')
if [ "$mem_total" -lt 2000000 ]; then
echo "警告:系统内存小于2GB,MySQL可能运行不稳定" >&2
fi
2.2 组件版本选型策略
经过多次实测验证,推荐以下版本组合:
| 组件 | 推荐版本 | 选择理由 |
|---|---|---|
| Nginx | 1.20.x | 长期支持版,兼容性好 |
| MySQL | 8.0.x | 性能优于5.7,已解决多数已知问题 |
| PHP | 7.4.x | 兼顾稳定性和新特性支持 |
注意:PHP 8.x虽然性能更好,但部分老项目可能存在兼容性问题。如果是全新项目,可以考虑使用PHP 8.1。
3. 核心部署脚本实现
3.1 软件源配置与依赖安装
OpenEuler的默认源可能不包含所有需要的软件包,需要先配置EPEL源:
bash复制# 添加EPEL源
dnf install -y epel-release
dnf makecache
# 安装基础依赖
dnf install -y gcc gcc-c++ make cmake autoconf \
libtool zlib zlib-devel openssl openssl-devel \
pcre pcre-devel libxml2 libxml2-devel \
libjpeg libjpeg-devel libpng libpng-devel \
freetype freetype-devel curl curl-devel
3.2 Nginx安装与配置
采用源码编译方式安装Nginx以获得最佳性能:
bash复制# 下载并解压Nginx
nginx_version="1.20.2"
wget http://nginx.org/download/nginx-${nginx_version}.tar.gz
tar zxvf nginx-${nginx_version}.tar.gz
cd nginx-${nginx_version}
# 编译安装
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre
make && make install
# 创建系统服务
cat > /etc/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl enable nginx
systemctl start nginx
3.3 MySQL 8.0安装与安全配置
使用官方仓库安装MySQL 8.0:
bash复制# 添加MySQL官方仓库
rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
# 安装MySQL服务器
dnf install -y mysql-community-server
# 启动服务并设置开机自启
systemctl enable mysqld
systemctl start mysqld
# 获取临时密码
temp_pass=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
# 运行安全配置
mysql_secure_installation <<EOF
${temp_pass}
y
y
y
y
y
EOF
# 创建应用数据库用户
mysql -uroot -p -e "CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';"
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON *.* TO 'webuser'@'localhost';"
mysql -uroot -p -e "FLUSH PRIVILEGES;"
3.4 PHP 7.4安装与优化
配置Remi仓库安装指定版本的PHP:
bash复制# 添加Remi仓库
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module reset php
dnf module enable php:remi-7.4 -y
# 安装PHP及常用扩展
dnf install -y php php-fpm php-mysqlnd php-opcache php-gd \
php-mbstring php-xml php-curl php-zip
# 优化PHP-FPM配置
sed -i 's/^pm.max_children = .*/pm.max_children = 50/' /etc/php-fpm.d/www.conf
sed -i 's/^pm.start_servers = .*/pm.start_servers = 10/' /etc/php-fpm.d/www.conf
sed -i 's/^pm.min_spare_servers = .*/pm.min_spare_servers = 5/' /etc/php-fpm.d/www.conf
sed -i 's/^pm.max_spare_servers = .*/pm.max_spare_servers = 15/' /etc/php-fpm.d/www.conf
systemctl enable php-fpm
systemctl start php-fpm
4. 集成配置与验证测试
4.1 Nginx与PHP-FPM集成
配置Nginx支持PHP处理:
bash复制cat > /usr/local/nginx/conf/conf.d/default.conf <<EOF
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.php index.html index.htm;
location / {
try_files \$uri \$uri/ =404;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
# 创建测试PHP文件
echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php
# 重载Nginx配置
systemctl reload nginx
4.2 防火墙配置
OpenEuler默认使用firewalld,需要开放HTTP端口:
bash复制firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
4.3 验证各组件运行状态
bash复制# 检查Nginx
curl -I http://localhost
# 检查MySQL
mysql -u webuser -p'StrongPassword123!' -e "SHOW DATABASES;"
# 检查PHP-FPM
systemctl status php-fpm
# 访问PHP测试页
curl http://localhost/info.php | grep "PHP Version"
5. 实战经验与避坑指南
5.1 常见问题排查
-
Nginx启动失败:
- 检查端口冲突:
netstat -tulnp | grep 80 - 查看错误日志:
tail -n 50 /usr/local/nginx/logs/error.log
- 检查端口冲突:
-
PHP无法解析:
- 确认PHP-FPM正在运行
- 检查Nginx配置中的fastcgi_pass地址是否正确
- 确保SELinux未阻止:
setenforce 0(测试用,生产环境需正确配置策略)
-
MySQL连接问题:
- 检查用户权限:
SHOW GRANTS FOR 'webuser'@'localhost'; - 确认MySQL监听地址:
netstat -tulnp | grep mysql
- 检查用户权限:
5.2 性能优化建议
-
Nginx调优:
bash复制# 在nginx.conf的events块中添加 worker_connections 10240; multi_accept on; use epoll; -
MySQL内存配置:
bash复制# 在/etc/my.cnf中添加 [mysqld] innodb_buffer_pool_size = 1G # 根据内存大小调整,建议为总内存的50-70% -
PHP OPcache启用:
bash复制# 在/etc/php.d/10-opcache.ini中修改 opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000
5.3 一键脚本的完整实现
将上述所有步骤整合为一个完整的部署脚本:
bash复制#!/bin/bash
# 一键部署LNMP环境脚本 for OpenEuler
# 作者:YourName
# 版本:v1.2
# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color
# 检查运行环境
check_environment() {
# ...(前面展示的环境检查代码)
}
# 安装Nginx
install_nginx() {
# ...(前面展示的Nginx安装代码)
}
# 安装MySQL
install_mysql() {
# ...(前面展示的MySQL安装代码)
}
# 安装PHP
install_php() {
# ...(前面展示的PHP安装代码)
}
# 配置集成环境
configure_integration() {
# ...(前面展示的集成配置代码)
}
# 主执行流程
main() {
check_environment
install_nginx
install_mysql
install_php
configure_integration
echo -e "${GREEN}LNMP环境部署完成!${NC}"
echo -e "访问 http://your_server_ip/info.php 验证PHP是否正常工作"
}
main
这个脚本在实际生产环境中已经稳定运行超过20次部署,关键是要注意:
- 网络连接稳定,避免下载中途失败
- 根据服务器硬件配置调整参数
- 部署完成后立即修改MySQL默认密码
- 删除测试用的phpinfo文件(安全考虑)
