如何配置 LNMP 支持 IPv6
- 2025-02-14 18:43:00
- 丁国栋
- 原创 268
需求:“完成信息化项目管理平台对IPv6应用的支持(包括业务系统对外提供IPv6网络服务、业务系统内容服务之间支持IPv6网络互相调用、业务系统内部中间件/技术组件支持IPv6网络连接、业务系统内部数据库支持IPv6网络连接)”
实现:
需求中提到的“信息化项目管理平台”是禅道项目管理软件,是用PHP编写,使用LNMP Web架构部署。
以 Red Hat Enterprise Linux 8 为例,介绍如何配置 Linux、Nginx、MySQL、PHP 启用 IPv6 访问。IPv6已经出现很久了,几乎所有流行的软件都支持。
本次实验环境使用 Ubuntu 24.04 LTS + VirtualBox + RHEL8 搭建,虚拟机配置双网卡(网卡1设置桥接网络配置ipv6地址,网卡2 设置NAT网络配置ipv4地址用于访问Internet),主机系统添加一个 ipv6 地址用于验证IPv6访问。
因为主机系统 Ubuntu 24 LTS 已经安装了 Gnome 桌面,所以配置文件与无GUI的可能有所差异,仅作记录以供参考。
#sudo cat /etc/netplan/90-NM-e1419a5e-5e1d-3fff-a17c-b2fc6d2cef99.yaml
network:
version: 2
ethernets:
enp5s0:
renderer: NetworkManager
match: {}
addresses:
- "2409:8050:58c0:bbf5::53:13/112"
dhcp4: true
networkmanager:
uuid: "e1419a5e-5e1d-3fff-a17c-b2fc6d2cef99"
name: "netplan-enp5s0"
passthrough:
connection.timestamp: "1738982775"
ipv6.ip6-privacy: "-1"
proxy._: ""
以下是服务端(虚拟机)配置
Linux IPv6 配置
配置文件 /etc/sysconfig/network-scripts/ifcfg-enp0s3 添加 IPV6ADDR=2409:8050:58c0:bbf5::53:7/112
# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=dhcp DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=no IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no NAME=enp0s3 UUID=7322d535-b0cf-4f94-9896-bccafcc13c34 DEVICE=enp0s3 ONBOOT=yes IPV6ADDR=2409:8050:58c0:bbf5::53:7/112
Nginx IPv6 配置
实验环境简易安装:yum install -y nginx
在nginx配置文件中使用英文中括号将IPv6地址包裹起来。
listen [::]:80;
修改 Nginx php 配置,通过 IPv6 访问 php-fpm:
# cat /etc/nginx/conf.d/php-fpm.conf
# PHP-FPM FastCGI server
# network or unix domain socket configuration
upstream php-fpm {
#server unix:/run/php-fpm/www.sock;
server [2409:8050:58c0:bbf5::53:7]:9000;
}
PHP IPv6 配置
实验环境简易安装:yum install -y php-fpm php-pdo php-mysqlnd php-mbstring php-json php-cli
修改 /etc/php-fpm.d/www.conf 配置文件
listen = 9000 listen.allowed_clients = 127.0.0.1,2409:8050:58c0:bbf5::53:7
注意:在 php代码中 pdo|mysqlnd 的配置也需要像Nginx那样使用英文中括号将IPv6地址包裹起来。
MySQL IPv6 配置
实验环境简易安装:yum install -y mysql-server
修改 /etc/my.cnf.d/mysql-server.cnf 修改或添加以下配置:
bind-address=::
可参考MySQL官方文档: https://dev.mysql.com/doc/refman/8.4/en/ipv6-server-config.html
MySQL 主从配置
CHANGE REPLICATION SOURCE TO SOURCE_HOST='2409:8050:58c0:bbf5::53:7', SOURCE_USER='root', SOURCE_PORT=3306, SOURCE_PASSWORD='zentao', SOURCE_LOG_FILE='binlog.000018', SOURCE_LOG_POS=156, SOURCE_CONNECT_RETRY=10; START REPLICA;
CHANGE REPLICATION SOURCE TO SOURCE_HOST='2409:8050:58c0:bbf5::53:7', SOURCE_PORT=3306, SOURCE_LOG_FILE='binlog.000018', SOURCE_LOG_POS=156, SOURCE_CONNECT_RETRY=10; START REPLICA USER='root' PASSWORD='zentao';
浏览器访问验证
如果使用 IPv6 地址访问而不是使用域名,也需要使用英文中括号将IPv6地址包裹起来。
http://[2409:8050:58c0:bbf5::53:7]/index.php
设置 Redis 监听 IPv6 地址。
bind 2409:8050:58c0:bbf5::53:7php 使用redis作为session存储。
session.save_handler = redis session.save_path = "tcp://2409:8050:58c0:bbf5::53:7:6379?auth=zentao"
<?php
// 创建 Redis 对象
$redis = new Redis();
// 连接 Redis 服务器
$result = $redis->connect('2409:8050:58c0:bbf5::53:7', 6379);
// 进行密码认证
$redis->auth('zentao');
// 设置一个key
$redis->set('k', 'v');
// 查询一个key
$v = $redis->get('k');
var_dump($v);
if ($result === true) {
echo '成功连接到 Redis 服务器';
// 发送 PING 命令测试连接
$pingResponse = $redis->ping();
if ($pingResponse) {
echo "\nRedis 服务器正常运行";
} else {
echo "\n无法从 Redis 服务器获取有效响应";
}
} else {
echo '无法连接到 Redis 服务器';
}
// 关闭连接
$redis->close();
?>
提示:如果使用php pdo mysql,mysql的地址也需要使用英文中括号[]包裹起来。
提示:如果在 RHEL8上测试php 7.2.24,phpredis的版本建议使用5.3.7。
yum install -y php-devel gcc make curl -L https://github.com/phpredis/phpredis/archive/refs/tags/5.3.7.zip -o phpredis-5.3.7.zip unzip phpredis-5.3.7.zip cd phpredis-5.3.7/ phpize ./configure make make test make install ls /usr/lib64/php/modules/ echo extension=redis.so > /etc/php.d/30-redis.ini systemctl restart php-fpm.service
关于IPv6地址中的方括号:IPv6地址使用方括号主要是为了解决IPv6地址中的冒号(:)与资源标识符(如URI和URL)既定语法的冲突。冒号在URL中通常用于在端口号之前终止主机路径,而IPv6地址中包含冒号作为分隔符,为了避免这种冲突,IPv6地址在资源标识符中需要用方括号括起来,但在资源标识符以外的场景中不需要使用方括号。
--