<think>
我们正在构建一个包含多个组件的Web应用架构,包括:
- 前端代理Nginx服务器 (192.168.20.40)
- Nginx服务器 (192.168.20.50)
- PHP应用服务器兼MySQL主服务器 (192.168.20.60)
- 两个MySQL从服务器 (192.168.20.70, 192.168.20.80)
- ProxySQL服务器 (192.168.20.90)
步骤概述:
1. 前端代理Nginx配置(负载均衡)
2. Nginx服务器配置(处理静态文件,并将PHP请求转发给PHP应用服务器)
3. PHP应用服务器配置(安装PHP并配置,同时作为MySQL主服务器)
4. MySQL主从复制配置(主服务器在192.168.20.60,从服务器在192.168.20.70和192.168.20.80)
5. ProxySQL配置(作为数据库中间件,实现读写分离和负载均衡)
6. 测试整个架构
注意:本文档假设所有服务器操作系统均为Linux(如CentOS或Ubuntu),并已安装基本环境。具体命令可能因系统不同而略有差异。
详细步骤:
## 1. 前端代理Nginx服务器 (192.168.20.40) 的配置
安装Nginx并配置为负载均衡器,将请求分发到后端的Nginx服务器(192.168.20.50)和可能存在的其他Nginx服务器(这里只有一个后端Nginx服务器,但配置可扩展)。
编辑Nginx配置文件(如`/etc/nginx/nginx.conf`或`/etc/nginx/conf.d/default.conf`):
```nginx
http {
upstream backend_nginx {
server 192.168.20.50:80; # 后端Nginx服务器
# 如果有多个,继续添加
}
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://backend_nginx;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
```
重启Nginx服务:
```bash
systemctl restart nginx
```
## 2. Nginx服务器 (192.168.20.50) 的配置
在这个架构中,192.168.20.50作为应用层的Nginx服务器,负责处理静态文件,并将PHP请求转发给后端的PHP应用服务器(192.168.20.60)。
安装Nginx和必要的模块(如支持PHP的代理模块)。
配置Nginx:
```nginx
server {
listen 80;
server_name your_domain.com;
root /path/to/your/webroot; # 静态文件的根目录
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 将PHP请求转发给PHP应用服务器
location ~ \.php$ {
proxy_pass http://192.168.20.60:80; # 这里假设PHP应用服务器监听80端口,实际可能不同
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
```
重启Nginx:
```bash
systemctl restart nginx
```
注意:这里我们直接将PHP请求代理到PHP应用服务器,但也可以使用FastCGI(如果PHP应用服务器上运行的是PHP-FPM)进行转发。但根据架构,PHP应用服务器是单独的一台,且运行着PHP应用(可能是一个Web服务器,如Nginx+PHP-FPM或Apache+PHP),所以我们使用代理方式。
## 3. PHP应用服务器兼MySQL主服务器 (192.168.20.60) 的配置
这台服务器需要同时运行PHP应用和MySQL主服务器。
### 3.1 配置PHP应用服务器
安装Web服务器(这里以Nginx+PHP-FPM为例):
安装Nginx和PHP-FPM以及必要的PHP扩展。
配置Nginx(监听80端口)处理PHP请求:
```nginx
server {
listen 80;
server_name your_domain.com;
root /path/to/php/application;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 根据实际版本调整
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
```
重启Nginx和PHP-FPM。
### 3.2 配置MySQL主服务器
安装MySQL,并配置为主服务器。
编辑MySQL配置文件(`/etc/mysql/my.cnf`或`/etc/my.cnf`):
```ini
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = your_database_name # 需要复制的数据库,如果有多个,重复配置
# 其他配置...
```
重启MySQL服务:
```bash
systemctl restart mysql
```
创建用于复制的用户:
```sql
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
```
记录主服务器的二进制日志位置:
```sql
SHOW MASTER STATUS;
```
记录File和Position,供从服务器使用。
## 4. MySQL从服务器 (192.168.20.70, 192.168.20.80) 的配置
分别在两台从服务器上安装MySQL,并配置为从服务器。
编辑MySQL配置文件(每台server-id唯一):
对于192.168.20.70:
```ini
[mysqld]
server-id = 2
```
对于192.168.20.80:
```ini
[mysqld]
server-id = 3
```
重启MySQL服务。
在每台从服务器上配置复制:
```sql
CHANGE MASTER TO
MASTER_HOST='192.168.20.60',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='记录的文件名',
MASTER_LOG_POS=记录的Position;
START SLAVE;
```
检查复制状态:
```sql
SHOW SLAVE STATUS\G;
```
确保Slave_IO_Running和Slave_SQL_Running都为Yes。
## 5. ProxySQL服务器 (192.168.20.90) 的配置
ProxySQL作为数据库中间件,将应用层的数据库请求路由到MySQL主从服务器。
安装ProxySQL(请参照官方文档安装最新版本)。
启动ProxySQL服务:
```bash
systemctl start proxysql
```
登录到ProxySQL管理界面(默认端口6032):
```bash
mysql -u admin -padmin -h 127.0.0.1 -P 6032
```
配置后端MySQL服务器:
```sql
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES
(0, '192.168.20.60', 3306), -- 主服务器,hostgroup_id为0(写组)
(1, '192.168.20.70', 3306), -- 从服务器1,hostgroup_id为1(读组)
(1, '192.168.20.80', 3306); -- 从服务器2,hostgroup_id为1(读组)
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
```
配置监控用户(在MySQL主服务器上创建,并授予权限):
```sql
CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor_password';
GRANT SELECT, REPLICATION CLIENT ON *.* TO 'monitor'@'%';
```
在ProxySQL中设置监控用户:
```sql
SET mysql-monitor_username='monitor';
SET mysql-monitor_password='monitor_password';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
```
配置应用访问数据库的用户(在MySQL主服务器上创建,并授予权限):
```sql
CREATE USER 'app_user'@'%' IDENTIFIED BY 'app_password';
GRANT ALL PRIVILEGES ON your_database_name.* TO 'app_user'@'%';
```
在ProxySQL中配置该用户:
```sql
INSERT INTO mysql_users(username, password, default_hostgroup) VALUES
('app_user', 'app_password', 0); -- 默认路由到写组(主服务器)
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
```
配置读写分离规则:
```sql
-- 将写操作路由到写组(hostgroup 0)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES
(1, 1, '^SELECT.*FOR UPDATE', 0, 1); -- 写操作
-- 将读操作路由到读组(hostgroup 1)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES
(2, 1, '^SELECT', 1, 1); -- 读操作
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
```
应用服务器(192.168.20.60)中的PHP应用应该配置使用ProxySQL的地址(192.168.20.90)和端口(6033)来访问数据库,而不是直接连接MySQL主服务器。
## 6. 测试整个架构
1. 通过前端代理Nginx访问Web应用,确保静态文件由Nginx服务器(192.168.20.50)提供,PHP请求由PHP应用服务器(192.168.20.60)处理。
2. 在PHP应用中执行写操作,检查是否写入主库(192.168.20.60),并通过复制同步到从库(192.168.20.70和192.168.20.80)。
3. 执行读操作,检查是否由ProxySQL路由到从库。
注意:以上配置是基础示例,实际生产环境需要根据具体需求调整安全设置、优化参数和高可用方案。
参考文献:
[1] Nginx负载均衡配置
[2] ProxySQL官方文档
§§相关问题§§
1. 如何监控MySQL主从复制的延迟?
2. ProxySQL如何实现读写分离的故障转移?
3. 如何优化PHP应用服务器的性能?
4. 在这个架构中,如何实现高可用?
5. 如何备份和恢复这个架构中的数据库?
</think>
### 完整Web应用架构搭建配置指南
以下是包含Nginx、PHP、MySQL主从复制和ProxySQL的完整Web应用架构配置方法,按照服务器角色分步说明:
---
#### **1. 前端代理Nginx服务器 (192.168.20.40)**
**作用**:负载均衡和反向代理
**配置步骤**:
```nginx
# /usr/local/nginx/conf/nginx.conf
http {
upstream app_servers {
server 192.168.20.50:80 weight=10; # 后端Nginx服务器
# 可扩展添加其他应用服务器
}
server {
listen 80;
server_name www.yourdomain.com;
location / {
proxy_pass http://app_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
```
**操作命令**:
```bash
/usr/local/nginx/sbin/nginx -s reload # 重启生效[^2]
```
---
#### **2. Nginx服务器 (192.168.20.50)**
**作用**:静态资源处理和PHP请求转发
**配置步骤**:
```nginx
# /usr/local/nginx/conf/nginx.conf
server {
listen 80;
root /data/www;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 192.168.20.60:9000; # PHP应用服务器
fastcgi_index index.php;
include fastcgi_params;
}
}
```
---
#### **3. PHP应用服务器兼MySQL主服务器 (192.168.20.60)**
**作用**:运行动态应用和MySQL主库
**PHP配置**:
```bash
# 安装PHP-FPM
yum install php-fpm php-mysqlnd
systemctl start php-fpm
# 配置PHP-FPM监听端口
# /etc/php-fpm.d/www.conf
listen = 0.0.0.0:9000
```
**MySQL主库配置**:
```ini
# /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=your_db # 需复制的数据库
```
```sql
# MySQL操作
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'Slave@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; # 记录File和Position[^1]
```
---
#### **4. MySQL从服务器 (192.168.20.70/80)**
**作用**:数据复制和读操作分担
**配置步骤**:
```ini
# 192.168.20.70配置 (/etc/my.cnf)
[mysqld]
server-id=2
# 192.168.20.80配置
[mysqld]
server-id=3
```
```sql
# 两台从服务器执行
CHANGE MASTER TO
MASTER_HOST='192.168.20.60',
MASTER_USER='repl_user',
MASTER_PASSWORD='Slave@123',
MASTER_LOG_FILE='mysql-bin.000001', # 主库show master状态值
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G; # 验证Slave_IO_Running: Yes
```
---
#### **5. ProxySQL服务器 (192.168.20.90)**
**作用**:数据库中间件,读写分离
**配置流程**:
```sql
# 登录ProxySQL管理接口
mysql -u admin -padmin -h 127.0.0.1 -P 6032
-- 添加后端服务器
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES
(10, '192.168.20.60', 3306), -- 写组 (master)
(20, '192.168.20.70', 3306), -- 读组 (slaves)
(20, '192.168.20.80', 3306);
-- 配置读写分离规则
INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup)
VALUES
(1, 1, '^SELECT.*FOR UPDATE', 10), -- 写操作路由
(2, 1, '^SELECT', 20); -- 读操作路由
-- 设置监控用户
UPDATE global_variables SET variable_value='monitor'
WHERE variable_name='mysql-monitor_username';
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
```
**应用层连接配置**:
PHP应用需使用192.168.20.90:6033作为数据库地址
---
### **架构验证要点**
1. **负载均衡**:访问前端Nginx(40)应轮询后端服务
2. **主从复制**:在主库(60)插入数据,从库(70/80)自动同步
3. **读写分离**:SELECT请求由ProxySQL路由到从库,INSERT路由到主库
4. **故障转移**:停止主库后,ProxySQL应自动将写操作标记为离线
[^1]: IP规划参考
[^2]: Nginx配置基础
[^3]: 端口转发配置逻辑
[^4]: Nginx编译参数
[^5]: 文件共享配置示例