Ubuntu 24.04.4 LTS 安装PHP、nginx、MySQL、libreoffice
安装php
sudo apt install php8.3-fpm php8.3-cli php8.3-common \
php8.3-zip php8.3-mbstring php8.3-pdo php8.3-imagick \
php8.3-gd php8.3-fileinfo php8.3-curl php8.3-bcmath \
php8.3-imap php8.3-intl php8.3-mysql php8.3-opcache \
php8.3-redis php8.3-soap php8.3-tidy php8.3-xml php8.3-xmlrpc查看php命令行版本:php -v
PHP 8.3.6 (cli) (built: Jan 7 2026 08:40:32) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies查看php-fpm状态:sudo systemctl status php8.3-fpm
重启php-fpm:sudo systemctl restart php8.3-fpm
禁止php-fpm自启动:sudo systemctl disable php8.3-fpm
开启php-fpm自启动:sudo systemctl enable php8.3-fpm
查询安装的扩展:php -m
[PHP Modules]
bcmath
calendar
Core
ctype
curl
date
dom
exif
FFI
fileinfo
filter
ftp
gd
gettext
hash
iconv
igbinary
imagick
imap
intl
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
Phar
posix
random
readline
redis
Reflection
session
shmop
SimpleXML
soap
sockets
sodium
SPL
standard
sysvmsg
sysvsem
sysvshm
tidy
tokenizer
xml
xmlreader
xmlrpc
xmlwriter
xsl
Zend OPcache
zip
zlib
[Zend Modules]
Zend OPcache
php配置文件夹:/etc/php/8.3
php.ini配置文件:/etc/php/8.3/fpm/php.ini
例如:修改错误显示
display_errors = On
网站fpm配置文件:/etc/php/8.3/fpm/pool.d/www.conf
例如:PHP运行用户组和用户
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
需要确保代码所在的用户组和用户与上面的一致,否则会出现文件权限问题。
PHP运行socket文件位置
listen = /run/php/php8.3-fpm.sock
配置nginx解析php会用到。
开启jit功能
找到/etc/php/8.3/fpm/conf.d/10-opcache.ini文件,修改如下:
; configuration for php opcache module
; priority=10
zend_extension=opcache.so
opcache.jit_buffer_size=256M
opcache.jit=1255
通过 php -i|grep ‘opcache.jit’ 命令确定是否开启jit成功。
opcache.jit => 1255 => 1255
opcache.jit_bisect_limit => 0 => 0
opcache.jit_blacklist_root_trace => 16 => 16
opcache.jit_blacklist_side_trace => 8 => 8
opcache.jit_buffer_size => 256M => 256M
opcache.jit_debug => 0 => 0
opcache.jit_hot_func => 127 => 127
opcache.jit_hot_loop => 64 => 64
opcache.jit_hot_return => 8 => 8
opcache.jit_hot_side_exit => 8 => 8
opcache.jit_max_exit_counters => 8192 => 8192
opcache.jit_max_loop_unrolls => 8 => 8
opcache.jit_max_polymorphic_calls => 2 => 2
opcache.jit_max_recursive_calls => 2 => 2
opcache.jit_max_recursive_returns => 2 => 2
opcache.jit_max_root_traces => 1024 => 1024
opcache.jit_max_side_traces => 128 => 128
opcache.jit_max_trace_length => 1024 => 1024
opcache.jit_prof_threshold => 0.005 => 0.005
安装nginx
sudo apt install nginx
查看nginx状态:sudo systemctl status nginx
重启nginx:sudo systemctl restart nginx
禁止nginx自启动:sudo systemctl disable nginx
开启nginx自启动:sudo systemctl enable nginx
nginx配置文件夹:/etc/nginx
查看nginx运行用户:/etc/nginx/nginx.conf
user www-data;
这与php运行用户一致。
增加php解析,修改配置文件:/etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# 增加主页文件index.php
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
# 开启php解析
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# 这里默认的php socket文件也可以修改为指定的php:/run/php/php8.3-fpm.sock
fastcgi_pass unix:/run/php/php-fpm.sock;
}
}
在 /var/www/html 目录下新建index.php
<?php
phpinfo();重启nginx后,访问网站,出现php信息页面,说明nginx解析php配置成功。

为避免文件权限问题,应该修改 /var/www/html 目录所属用户为 www-data。
sudo chown -R www-data:www-data /var/www/html/
如果需要修改文件夹权限,可以执行下面命令。
sudo chmod -R 755 /var/www/html/
安装MySQL
sudo apt install mysql-server
查看MySQL状态:sudo service mysql status
重启MySQL:sudo service mysql restart
登录MySQL:sudo mysql -u root
无需密码即可以进入,因为新版默认采用 auth_socket 认证。
MySQL配置文件夹:/etc/mysql
修改MySQL配置:/etc/mysql/mysql.conf.d/mysqld.cnf
socket = /var/run/mysqld/mysqld.sock
bind-address = 127.0.0.1
php连接MySQL测试
由于php运行用户为 www-data,所以需要在数据库里创建一个 www-data 用户,供php使用。
— 创建用户 www-data,使用 auth_socket 插件
CREATE USER ‘www-data’@’localhost’ IDENTIFIED WITH auth_socket;
— 授予所有数据库的访问权限(可按需调整)
GRANT ALL PRIVILEGES ON *.* TO ‘www-data’@’localhost’;
— 刷新权限
FLUSH PRIVILEGES;
在网站根目录下新建mysql.php文件,测试php连接MySQL。
<?php
/**
* MySQL 连接测试脚本 - 使用 auth_socket 认证
* 运行方式: php mysql_test.php
* 或在浏览器中访问(如果配置了 web 服务器)
*/
// 获取当前操作系统用户名(用于调试)
$systemUser = exec('whoami');
echo "========================================\n";
echo "MySQL auth_socket 连接测试\n";
echo "========================================\n";
echo "当前系统用户: " . $systemUser . "\n";
echo "PHP 版本: " . phpversion() . "\n";
echo "----------------------------------------\n";
// 数据库连接配置
$config = [
'host' => 'localhost', // 必须使用 localhost 才能使用 socket 认证
'user' => 'www-data', // 使用 auth_socket 认证的 MySQL 用户名
'password' => '', // auth_socket 不需要密码,留空即可
'database' => 'mysql', // 测试连接用系统库
'socket' => '/var/run/mysqld/mysqld.sock' // MySQL socket 文件路径
];
/**
* 方法1:使用 MySQLi 扩展连接
*/
echo "尝试使用 MySQLi 连接...\n";
// 创建连接(不指定密码)
$mysqli = new mysqli($config['host'], $config['user'], null, $config['database'], null, $config['socket']);
// 检查连接
if ($mysqli->connect_error) {
echo "❌ MySQLi 连接失败: " . $mysqli->connect_error . "\n\n";
} else {
echo "✅ MySQLi 连接成功!\n";
// 执行测试查询
$result = $mysqli->query("SELECT USER(), CURRENT_USER(), DATABASE()");
if ($result) {
$row = $result->fetch_row();
echo " 当前数据库用户: " . $row[0] . "\n";
echo " 认证用户: " . $row[1] . "\n";
echo " 当前数据库: " . $row[2] . "\n";
$result->free();
}
// 查询认证插件信息
$result = $mysqli->query("SELECT plugin FROM mysql.user WHERE user = '" . $config['user'] . "' AND host = 'localhost'");
if ($result && $row = $result->fetch_assoc()) {
echo " 用户认证插件: " . $row['plugin'] . "\n";
}
$mysqli->close();
echo "\n";
}
/**
* 方法2:使用 PDO 扩展连接
*/
echo "尝试使用 PDO 连接...\n";
try {
// DSN - 使用 unix_socket 参数指定 socket 路径
$dsn = "mysql:host={$config['host']};unix_socket={$config['socket']};dbname={$config['database']};charset=utf8mb4";
$pdo = new PDO($dsn, $config['user'], null);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "✅ PDO 连接成功!\n";
// 执行测试查询
$stmt = $pdo->query("SELECT USER(), CURRENT_USER(), DATABASE(), VERSION()");
if ($stmt) {
$row = $stmt->fetch(PDO::FETCH_NUM);
echo " 当前数据库用户: " . $row[0] . "\n";
echo " 认证用户: " . $row[1] . "\n";
echo " 当前数据库: " . $row[2] . "\n";
echo " MySQL 版本: " . $row[3] . "\n";
}
// 查询 auth_socket 插件状态
$stmt = $pdo->query("SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%socket%'");
if ($stmt && $row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo " auth_socket 插件状态: " . $row['PLUGIN_STATUS'] . "\n";
}
} catch (PDOException $e) {
echo "❌ PDO 连接失败: " . $e->getMessage() . "\n";
}
echo "========================================\n";
// 故障排查建议
echo "\n📋 如果连接失败,请检查:\n";
echo "1. MySQL socket 文件路径是否正确:ls -l /var/run/mysqld/mysqld.sock\n";
echo "2. MySQL 用户 '$config[user]'@'localhost' 是否使用了 auth_socket 插件:\n";
echo " SELECT user, host, plugin FROM mysql.user WHERE user='$config[user]' AND host='localhost';\n";
echo "3. 当前系统用户 '$systemUser' 是否匹配 MySQL 用户名(或已在 authentication_string 中授权)[citation:1][citation:5]\n";
echo "4. 检查 PHP 是否已安装 mysql 扩展:php -m | grep mysql\n";访问这个php文件,输出成功信息说明连接MySQL成功。
安装libreoffice
sudo apt install libreoffice-nogui fonts-wqy-zenhei
查看libreoffice版本:soffice –version
LibreOffice 24.2.7.2 420(Build:2)
如果需要php调用libreoffice命令,确保命令行使用www-data用户运行和创建crontab计划任务。
示例:
sudo crontab -u www-data -e