nginx+php部署walle,发布php站点
环境说明
-
服务器:Linux node-10-0-0-13
-
系统版本:Ubuntu 24.04 LTS(6.14.0-27-generic)
-
架构:x86_64
-
目标:部署Walle 2.0(开源代码发布系统),并通过Walle发布PHP站点
前置准备
1. 服务器基础环境检查与更新
bash
# 更新系统包索引(apt的软件源缓存),确保能获取最新的软件包版本
sudo apt update
# 升级已安装的软件包到最新版本,-y表示自动确认所有提示(无需手动输入y)
sudo apt upgrade -y
# 安装基础依赖工具:
# wget/curl:下载文件;git:克隆代码仓库;zip/unzip:解压/压缩文件;
# vim:文本编辑器;net-tools:网络工具(如ifconfig);
# software-properties-common:管理软件源(添加PPA源必需)
sudo apt install -y wget curl git zip unzip vim net-tools software-properties-common
为什么要做:新服务器默认包索引可能过时,升级包可修复安全漏洞;基础工具是后续部署的必备前提,比如git用于拉取Walle源码,curl用于下载Composer。
2. 关闭防火墙/放行端口(可选)
bash
# Ubuntu 24.04 默认使用ufw防火墙,放行22端口(SSH远程登录)
sudo ufw allow 22/tcp
# 放行80端口(HTTP访问Walle和PHP站点)
sudo ufw allow 80/tcp
# 放行443端口(HTTPS,后续可选配置)
sudo ufw allow 443/tcp
# 重新加载ufw规则,使放行配置生效
sudo ufw reload
# 临时关闭selinux(如果开启),setenforce 0表示临时禁用(重启失效)
sudo setenforce 0
# 永久关闭selinux:修改配置文件,将SELINUX值改为disabled,重启后生效
# SELINUX是Linux安全模块,可能限制Nginx/PHP访问文件,部署初期关闭避免权限问题
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
为什么要做:防火墙默认会拦截80/443端口,导致外部无法访问Walle和PHP站点;SELINUX的强制访问控制可能干扰服务运行,部署阶段临时关闭简化问题排查。
第一步:安装并配置PHP环境
Walle 2.0 要求PHP >= 7.4(推荐8.1),PHP 8.1中JSON扩展已整合到核心,无需单独安装。
1. 添加PHP源
bash
# 添加Ondrej PHP源(Ubuntu官方维护的PHP源,提供最新的PHP版本)
# Ubuntu默认源的PHP版本较旧,PPA源能获取8.1版本且更新及时
sudo add-apt-repository ppa:ondrej/php -y
# 刷新包索引,使新增的PPA源生效
sudo apt update
为什么要做:Ubuntu 24.04默认源的PHP版本可能不满足Walle要求,Ondrej PPA是最稳定的第三方PHP源,确保安装到兼容的PHP 8.1。
2. 安装PHP及扩展(修正版)
bash
# 安装PHP 8.1核心及扩展,逐个解释:
# php8.1:PHP核心程序;php8.1-fpm:PHP FastCGI进程管理器(Nginx解析PHP必需);
# php8.1-mysql:MySQL数据库扩展(Walle连接MariaDB必需);
# php8.1-curl:curl扩展(Walle调用HTTP接口、拉取Git仓库可能用到);
# php8.1-gd:GD库(处理图片,Walle后台上传图片/验证码必需);
# php8.1-mbstring:多字节字符串扩展(处理中文等多字符集,Walle界面显示必需);
# php8.1-xml:XML扩展(解析XML配置,Composer依赖);
# php8.1-zip:ZIP扩展(解压Composer下载的依赖包);
# php8.1-bcmath:高精度数学扩展(Walle计算、加密等场景用到);
# php8.1-redis:Redis扩展(Walle缓存、队列功能可选依赖);
# 注:php8.1-json已整合到PHP 8.1核心,无需单独安装
sudo apt install -y php8.1 php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip php8.1-bcmath php8.1-redis
# 验证PHP版本,确认安装的是8.1.x版本(确保版本符合Walle要求)
php -v
# 验证JSON扩展是否内置启用(PHP 8.1默认开启,输出json表示正常)
php -m | grep json
# 验证PHP-FPM状态,确保服务已启动(active (running)表示正常)
sudo systemctl status php8.1-fpm
为什么要做:Walle是PHP开发的Web系统,必须安装对应版本的PHP及扩展,缺少任一扩展都会导致Walle功能异常(比如mbstring缺失会导致中文乱码,mysql缺失无法连接数据库)。
3. 配置PHP-FPM(优化)
bash
# 编辑PHP-FPM的主配置文件(php.ini),调整运行参数
sudo vim /etc/php/8.1/fpm/php.ini
# 需要修改的参数及含义:
# memory_limit = 512M:PHP进程最大内存限制,Walle处理大文件/多任务需提高(默认128M可能不足)
# upload_max_filesize = 100M:允许上传的单个文件最大大小(Walle上传部署包/配置文件需放宽)
# post_max_size = 100M:POST请求最大数据量,需与upload_max_filesize一致(否则上传会失败)
# max_execution_time = 300:PHP脚本最大执行时间(秒),Walle部署脚本可能需要较长时间运行(默认30秒不足)
# date.timezone = Asia/Shanghai:设置PHP时区为上海(避免Walle日志/时间显示错误)
# 重启PHP-FPM,使配置修改生效
sudo systemctl restart php8.1-fpm
# 设置PHP-FPM开机自启,确保服务器重启后自动运行
sudo systemctl enable php8.1-fpm
为什么要做:PHP默认配置偏保守,针对Walle的使用场景优化参数,避免因内存不足、执行时间过短导致部署失败;时区错误会导致Walle的发布记录、日志时间混乱。
第二步:安装并配置MySQL(MariaDB)
Walle需要数据库存储用户、项目、发布记录等数据,MariaDB是MySQL的开源分支,兼容性更好。
1. 安装MariaDB
bash
# 安装MariaDB服务器和客户端(服务器端提供数据库服务,客户端用于命令行操作)
sudo apt install -y mariadb-server mariadb-client
# 启动MariaDB服务
sudo systemctl start mariadb
# 设置MariaDB开机自启
sudo systemctl enable mariadb
# 验证MariaDB状态,确保服务正常运行
sudo systemctl status mariadb
# 安全初始化MariaDB,执行以下操作加固安全:
# 1. 设置root密码;2. 删除匿名用户(避免未授权访问);3. 禁止root远程登录(可选);
# 4. 删除测试数据库;5. 刷新权限表
sudo mysql_secure_installation
初始化交互步骤及含义:
- Enter current password for root (enter for none):直接回车(默认无密码)
- Set root password? [Y/n]:Y → 设置root密码(核心!防止数据库被未授权访问)
- Remove anonymous users? [Y/n]:Y → 删除匿名用户(匿名用户可能被恶意利用)
- Disallow root login remotely? [Y/n]:N(如果需要远程管理数据库则选N,否则选Y)
- Remove test database and access to it? [Y/n]:Y → 删除测试库(测试库无实际用途,减少攻击面)
- Reload privilege tables now? [Y/n]:Y → 立即刷新权限(使配置生效)
为什么要做:数据库是Walle的核心数据存储,必须安装并加固安全,默认配置存在安全隐患(如空密码、匿名用户),容易被攻击。
2. 创建Walle数据库
bash
# 登录MySQL,-u指定用户(root),-p表示需要输入密码(刚设置的root密码)
mysql -uroot -p
# 创建Walle数据库,字符集设为utf8mb4(兼容emoji等特殊字符,避免中文乱码)
# COLLATE utf8mb4_unicode_ci:排序规则,确保中文排序正确
CREATE DATABASE walle CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 创建walle数据库用户,密码替换为实际值(避免使用root用户直接连接,降低权限风险)
CREATE USER 'walle'@'localhost' IDENTIFIED BY 'your_password';
# 授予walle用户对walle数据库的所有权限(仅授权必要数据库,最小权限原则)
GRANT ALL PRIVILEGES ON walle.* TO 'walle'@'localhost';
# 刷新权限表,使授权生效
FLUSH PRIVILEGES;
# 退出MySQL命令行
exit;
为什么要做:使用专用用户(而非root)连接数据库,符合最小权限原则,即使Walle程序被入侵,也不会泄露root密码;utf8mb4字符集是目前最兼容的字符集,避免Walle存储中文/特殊字符时乱码。
第三步:安装并配置Nginx
Nginx是高性能的Web服务器,负责接收HTTP请求并转发给PHP-FPM解析PHP脚本。
1. 安装Nginx
bash
# 安装Nginx Web服务器
sudo apt install -y nginx
# 启动Nginx服务
sudo systemctl start nginx
# 设置Nginx开机自启
sudo systemctl enable nginx
# 验证Nginx状态,确保服务正常运行
sudo systemctl status nginx
为什么要做:Walle是Web应用,需要Web服务器对外提供访问;Nginx比Apache更轻量、性能更好,适合作为PHP-FPM的前端服务器。
2. 配置Nginx虚拟主机(Walle)
bash
# 创建Walle站点配置文件(sites-available存放配置模板,sites-enabled存放启用的配置)
sudo vim /etc/nginx/sites-available/walle.conf
# 配置文件内容及逐行解释:
server {
listen 80; # 监听80端口(HTTP默认端口)
server_name node-10-0-0-13; # 替换为服务器IP/域名,用于匹配请求
root /var/www/walle/web; # Walle代码的Web根目录(必须指向web目录,否则访问404)
index index.php index.html index.htm; # 默认访问的首页文件,优先解析index.php
# 日志配置:记录访问日志和错误日志,便于排查问题
access_log /var/log/nginx/walle_access.log;
error_log /var/log/nginx/walle_error.log;
# 伪静态配置(Walle基于Laravel开发,必需):
# 尝试访问请求的文件/目录,若不存在则转发到index.php处理(实现URL美化)
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# PHP-FPM配置:解析.php文件
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # PHP-FPM的UNIX套接字路径(Ubuntu 24.04默认路径)
fastcgi_index index.php; # 默认的PHP入口文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 告诉PHP-FPM要执行的脚本路径
include fastcgi_params; # 加载Nginx的FastCGI默认参数(如请求头、环境变量)
}
# 禁止访问.htaccess文件(Apache的配置文件,Nginx不识别,且避免泄露敏感信息)
location ~ /\.ht {
deny all;
}
# 静态资源缓存:JS/CSS/图片等静态文件设置30天缓存,减轻服务器压力
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 30d; # 缓存有效期30天
add_header Cache-Control "public, max-age=2592000"; # 客户端缓存控制
}
}
# 启用Walle站点配置:创建软链接到sites-enabled目录(Nginx仅加载该目录下的配置)
sudo ln -s /etc/nginx/sites-available/walle.conf /etc/nginx/sites-enabled/
# 检查Nginx配置语法(关键!避免配置错误导致Nginx无法启动)
sudo nginx -t
# 重启Nginx,使配置生效
sudo systemctl restart nginx
为什么要做:Nginx默认配置无法适配Walle的目录结构和URL规则,必须自定义虚拟主机配置;伪静态、PHP-FPM转发、静态资源缓存都是Walle正常运行的关键。
第四步:安装并配置Walle 2.0
1. 安装Composer(PHP包管理工具)
bash
#该命令会从 Composer 官方获取实时的最新哈希值,避免手动复制过期值的问题。
#如果输出Installer verified,说明验证通过;若仍失败,先检查网络(是否能访问https://getcomposer.org)。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === file_get_contents('https://composer.github.io/installer.sig')) { echo 'Installer verified'.PHP_EOL; } else { echo 'Installer corrupt'.PHP_EOL; unlink('composer-setup.php'); }"
#验证通过后,执行安装(全局安装到/usr/local/bin,方便全局调用)
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
# 验证Composer安装成功(输出版本号表示正常)
composer -V
为什么要做:Walle的源码只包含核心代码,依赖的第三方库(如Laravel框架)需要通过Composer下载;国内切换阿里云源可大幅提升下载速度。
2. 下载Walle源码
bash
# 创建Walle代码目录(统一存放Web项目,符合Linux目录规范)
sudo mkdir -p /var/www/walle
# 修改目录所有者为当前用户(避免后续克隆/安装依赖时权限不足)
sudo chown -R $USER:$USER /var/www/walle
# 克隆Walle官方源码到指定目录(Git是分布式版本控制系统,拉取最新稳定版)
git clone https://github.com/meolu/walle-web.git /var/www/walle
# 进入Walle目录(后续操作需在源码根目录执行)
cd /var/www/walle
为什么要做:/var/www是Linux默认的Web项目存放目录,便于管理;克隆源码是获取Walle程序的唯一方式。
3. 安装Walle依赖
bash
# 安装Walle的PHP依赖:
# --no-dev:不安装开发环境依赖(如测试工具),生产环境无需;
# -o:优化自动加载文件(提升PHP执行效率)
composer install --no-dev -o
为什么要做:Walle基于Laravel框架开发,依赖大量第三方库,必须通过Composer安装后才能运行。
4. 配置Walle
bash
# 复制示例配置文件为实际配置文件(.env是Laravel框架的环境配置文件,Walle读取该文件的配置)
cp .env.example .env
# 编辑.env配置文件(核心配置项)
vim .env
# 关键配置项解释:
# APP_ENV=production:运行环境为生产环境(禁用调试模式,更安全)
# APP_DEBUG=false:关闭调试模式(避免泄露敏感信息)
# APP_KEY=base64:xxx:应用密钥(用于加密会话、Cookie等,必须生成)
# APP_URL=http://node-10-0-0-13:Walle的访问地址(服务器IP/域名)
#
# 数据库配置(对应之前创建的数据库):
# DB_CONNECTION=mysql:数据库类型(MySQL/MariaDB)
# DB_HOST=127.0.0.1:数据库地址(本地)
# DB_PORT=3306:数据库端口(默认)
# DB_DATABASE=walle:数据库名
# DB_USERNAME=walle:数据库用户
# DB_PASSWORD=your_password:数据库密码
#
# Redis配置(可选,用于缓存/队列):
# REDIS_HOST=127.0.0.1
# REDIS_PASSWORD=null
# REDIS_PORT=6379
# 生成APP_KEY(Laravel必需,无此密钥无法运行,自动生成并写入.env)
php artisan key:generate
# 数据库迁移(执行SQL脚本,创建Walle所需的表结构,--force强制在生产环境执行)
php artisan migrate --force
# 初始化管理员账户(默认账号:admin,密码:walle.wang,必须执行才能登录后台)
php artisan walle:install
为什么要做:.env文件包含Walle的核心配置(数据库、密钥等),必须正确配置;数据库迁移创建表结构,初始化账户是登录后台的前提。
5. 设置Walle目录权限
bash
# 修改Walle目录所有者为www-data(Nginx/PHP-FPM的运行用户,确保能读写文件)
sudo chown -R www-data:www-data /var/www/walle
# 设置目录基本权限(755:所有者可读可写可执行,其他用户可读可执行)
sudo chmod -R 755 /var/www/walle
# 设置storage目录权限为777(Walle存储日志、缓存、上传文件,需要可写)
sudo chmod -R 777 /var/www/walle/storage
# 设置bootstrap/cache目录权限为777(Laravel缓存目录,需要可写)
sudo chmod -R 777 /var/www/walle/bootstrap/cache
为什么要做:Linux权限严格,若目录所有者/权限错误,PHP-FPM无法读写文件,会导致Walle日志写入失败、缓存生成失败、上传文件失败等问题。
6. 验证Walle访问
打开浏览器,访问 http://node-10-0-0-13(替换为服务器IP/域名),使用默认账号 admin/walle.wang 登录,登录后立即修改密码 。
为什么要做:验证Walle是否正常运行;默认密码是公开的,必须修改防止被入侵。
第五步:配置Walle发布PHP站点
1. 前置条件(发布目标服务器准备)
Walle发布需要目标服务器(部署PHP站点的服务器)满足:安装Git、SSH服务;配置Walle服务器到目标服务器的免密SSH登录;安装Nginx+PHP。
步骤1:Walle服务器生成SSH密钥
bash
# 切换到www-data用户(Walle运行用户,发布时以该用户执行SSH命令)
# -s /bin/bash:指定使用bash Shell(默认www-data无登录Shell)
sudo su - www-data -s /bin/bash
# 生成SSH密钥(RSA算法,4096位(更安全),备注信息便于识别)
# 一路回车(不设置密码,否则免密登录会失效)
ssh-keygen -t rsa -b 4096 -C "walle@node-10-0-0-13"
# 复制公钥到目标服务器(替换target_ip为目标服务器IP)
# 执行后输入目标服务器root密码,公钥会被添加到~/.ssh/authorized_keys
ssh-copy-id root@target_ip
# 验证免密登录(无需密码即可登录目标服务器,表示配置成功)
ssh root@target_ip
# 退出www-data用户,回到原用户
exit
为什么要做:Walle发布代码时需要通过SSH登录目标服务器,免密登录避免每次发布都输入密码,是自动化发布的核心前提。
2. Walle后台配置
步骤1:添加环境(如测试环境、生产环境)
- 登录Walle后台 → 环境管理 → 新增环境
- 填写信息及含义:
- 环境名称:生产环境(标识环境用途)
- 部署用户:root(目标服务器的用户,需有目录读写权限)
- 主机地址:目标服务器IP(SSH连接的地址)
- 端口:22(SSH默认端口)
- 备注:可选(便于区分环境)
为什么要做:环境是Walle发布的核心维度,不同环境(测试/生产)对应不同的目标服务器。
步骤2:添加项目
- 登录Walle后台 → 项目管理 → 新增项目
- 填写核心信息及含义:
- 项目名称:test-php-site(标识项目)
- 项目标识:test-php-site(唯一标识,用于内部识别)
- 代码仓库:git@github.com:xxx/test-php-site.git(Git仓库地址,Walle拉取代码的来源)
- 分支/标签:master(要发布的代码分支)
- 部署路径:/var/www/test-php-site(目标服务器的站点根目录)
- 环境选择:生产环境(关联已添加的环境)
- 发布用户:root(目标服务器的部署用户)
为什么要做:项目是Walle发布的基本单元,配置项目信息后才能拉取代码并发布。
步骤3:配置构建/部署脚本
Walle支持自定义构建和部署脚本,针对PHP站点示例:
-
构建脚本(Walle服务器执行):
bash# 安装PHP依赖(如果项目用Composer管理依赖) composer install --no-dev -o为什么:项目代码可能只包含业务代码,依赖库需要在构建阶段安装。
-
部署脚本(目标服务器执行):
bash# 重启PHP-FPM(使新代码生效,PHP-FPM缓存旧代码可能导致修改不生效) systemctl restart php8.1-fpm # 刷新Nginx配置(可选,若Nginx配置有修改则需执行) nginx -t && systemctl reload nginx为什么:PHP-FPM是常驻进程,重启才能加载新代码;Nginx reload是平滑重启,不中断服务。
步骤4:发布代码
- 进入项目详情 → 点击"发布"
- 选择分支/提交记录 → 确认发布
- 查看发布日志,确认发布成功
为什么要做:发布是最终目标,日志可排查发布失败的原因(如SSH连接失败、脚本执行错误)。
3. 目标服务器配置Nginx(PHP站点)
bash
# 目标服务器创建PHP站点的Nginx配置文件
sudo vim /etc/nginx/sites-available/test-php-site.conf
# 配置文件内容及解释:
server {
listen 80; # 监听80端口
server_name test.example.com; # 站点域名/IP
root /var/www/test-php-site; # Walle部署的代码目录
index index.php index.html; # 默认首页
# 日志配置(便于排查站点访问问题)
access_log /var/log/nginx/test-php-site_access.log;
error_log /var/log/nginx/test-php-site_error.log;
# 伪静态配置(适配PHP站点的URL规则)
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# PHP-FPM配置(解析PHP文件)
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # PHP-FPM套接字路径
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 启用配置(创建软链接到sites-enabled)
sudo ln -s /etc/nginx/sites-available/test-php-site.conf /etc/nginx/sites-enabled/
# 检查配置语法(避免错误)
sudo nginx -t
# 重启Nginx(使配置生效)
sudo systemctl restart nginx
为什么要做:目标服务器需要Nginx配置才能对外提供PHP站点的访问,配置规则需匹配站点的目录结构和PHP解析需求。
第六步:常见问题排查
1. Walle访问404
- 检查Nginx配置中的root路径是否指向/var/www/walle/web(Walle的Web根目录)
- 检查伪静态配置(try_files规则)是否正确
- 查看Nginx错误日志:
tail -f /var/log/nginx/walle_error.log(定位具体错误)
原因:路径错误或伪静态配置缺失,导致Nginx无法找到index.php文件。
2. Walle发布失败
- 检查www-data用户能否免密登录目标服务器:
sudo su - www-data -s /bin/bash && ssh root@target_ip - 检查目标服务器部署路径权限:
ssh root@target_ip "ls -ld /var/www/test-php-site"(确保部署用户有读写权限) - 查看Walle发布日志(后台→发布记录→日志)
原因:SSH免密配置失败、目标服务器权限不足、部署脚本错误。
3. PHP站点访问500
- 检查目标服务器PHP-FPM状态:
systemctl status php8.1-fpm(确保服务运行) - 查看PHP错误日志:
tail -f /var/log/php8.1-fpm.log(定位PHP脚本错误) - 检查站点目录权限:
chown -R www-data:www-data /var/www/test-php-site
原因:PHP-FPM未运行、脚本语法错误、目录权限不足。
4. Composer下载依赖慢/失败
- 确认已切换阿里云Composer源:
composer config -g repo.packagist - 清除Composer缓存:
composer clear-cache
原因:官方源访问慢,缓存损坏导致依赖下载失败。
总结
- 完成Ubuntu 24.04下Nginx+PHP8.1+MariaDB的基础环境部署(修正JSON扩展安装问题);
- 安装并配置Walle 2.0,解决权限、配置等核心问题;
- 配置免密SSH登录,实现Walle自动化发布PHP站点;
- 目标服务器配置Nginx,对外提供PHP站点访问。