Распределенный кластер LNMP (1): построение платформы Nginx+PHP и настройка балансировки нагрузки

балансировки нагрузки

предисловие

Эта статья представляет собой краткое изложение и усовершенствование процесса обучения Nginx.Так называемый LNMP означает Linux+Nginx+MySQL+PHP, а распределенный означает разделение работы на разные предприятия на несколько разных серверов, чтобы они могли выполнять свою собственную работу. Распределенный и кластеризованный имеют свои преимущества и недостатки.Объединение преимуществ образует распределенный кластер. Разделите задание на несколько предприятий и распределите их по кластеру для обработки. В дополнение к LNMP можно также развернуть LNAMP (добавление сервера Apache для обработки динамических ресурсов, Nginx для обработки статических ресурсов и обратного прокси-сервера), поэтому я не буду здесь много говорить.

Что меня выбило из колеи: сначала я использовал Nginx версии 1.16.1 и PHP версии 5.6.27, но они не смогли нормально работать вместе, поэтому Nginx вернулся к 1.10.3.

LNMP分布式部署

Как видно из рисунка, мы создали 9 серверов для выполнения своих обязанностей, и каждый сервер представляет собой службу.

Нумерация IP сервер
1 192.168.177.11 Nginx (www.itshop.test): балансировка нагрузки
2 192.168.177.12 Nginx (file.itshop.test): статический файловый кеш
3 192.168.177.13 Nginx+PHP (upload.itshop.test): загрузка файла
4 192.168.177.14 Nginx+PHP
5 192.168.177.15 Nginx+PHP
6 192.168.177.16 NFS: хранилище файлов
7 192.168.177.17 MySQL (основной)
8 192.168.177.18 MySQL (от)
9 192.168.177.19 Memcached: кеш данных

развертывать

Развертывание серверов Linux

Подробнее об этом разделе читайте в статье:Установите Nginx, скомпилировав исходный код в CentOS..

install centos minimal

Сначала необходимо контролировать квоту памяти каждой виртуальной машины, чтобы предотвратить нехватку памяти физической машины.Если физическая машина имеет 8 ГБ памяти, рекомендуется, чтобы каждая виртуальная машина выделяла 512 МБ.

在安装的时候开启网络

Рекомендуется установить net-tools:yum -y install net-tools, также рекомендуется, чтобы системаИзмените источник тунца.

После завершения установки системы Linux на сервере № 1 клонируйте остальные 4 сервера Nginx, которые не нужно устанавливать, а затем разверните Nginx и клонируйте другие 4 сервера, для которых требуется Nginx.Основной процесс выглядит следующим образом:

虚拟机克隆流程

Каждый сервер должен уделять внимание настройке сети в соответствии с требованиями, в основном статической конфигурации сети.

Мы можем написать сценарий оболочки или настроить его вручную:

#! /bin/bash
ens33=/etc/sysconfig/network-scripts/ifcfg-ens33
sed -i 's/BOOTPROTO=.*/BOOTPROTO=\"static\"/g' $ens33
sed -i '$aIPADDR=192.168.177.1'$1'' $ens33
sed -i '$aNETMASK=255.255.255.0' $ens33
sed -i '$aGATEWAY=192.168.177.2' $ens33
sed -i '$aDNS1=192.168.177.2' $ens33
service network restart

затем используйте./network-settings.sh 1Настройте сеть сервера,

sedв команде,iозначает прямое редактирование,sзначит заменить,$соответствует окончанию последней строки,aОбозначает дополнение, подробнее см.:man.linuxde.net/sed, можно использовать заменуsed -i 's/IPADDR=.*/IPADDR=192.168.177.1'$1'/g' $ens33.

Ниже приведено официальное развертывание, прежде чем мы рассмотрим изображение, нужно запомнить эту архитектуру:

架构(序号代表IP地址:192.168.177.1X)

Развертывание среды Nginx

Сначала установите Nginx на сервер №1 (см.Установите Nginx, скомпилировав исходный код в CentOS.):

[Дружеское напоминание, настраивайте в соответствии с версией программного обеспечения этой статьи, насколько это возможно, например, Nginx — 1.10.3, PHP — 5.6.27, в противном случае это будет очень фатально, потому что несоответствие версии вызовет большие проблемы, либо используйте последнюю версию или выполните настройку этой статьи, чтобы]

wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar -zxvf nginx-1.10.3.tar.gz
yum -y install gcc pcre-devel openssl-devel
cd nginx-1.10.3
./configure --preifx=/usr/local/nginx --with-http_ssl_module --with-http_realip_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
vi /etc/init.d/nginx # 此时参考之前的文章写一个启动脚本于:/etc/init.d/nginx
chmod +x /etc/init.d/nginx
chkconfig --add nginx
# 创建用户www和站点目录/data/www
useradd -s /sbin/nologin -M www
mkdir -p /data/www
cp /usr/local/nginx/html/* /data/www
chown -R www:www /data/www
vi /usr/local/nginx/conf/nginx.conf
# 配置用户
user www
# 修改server块
server {
    listen 80;
    server_name localhost;
    root /data/www;
    index index.html index.htm;
}
service nginx start
# 更新和配置防火墙
systemctl stop firewalld
systemctl disable firewalld
firewall-cmd --state 
yum -y install iptables-services
systemctl enable iptables
systemctl start iptables
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
service iptables save

useraddКоманда, -M: не создавать каталог входа пользователя автоматически, -s: указать оболочку, используемую пользователем после входа в систему;chownкоманда, параметры用户:组: укажите владельца и рабочую группу, к которой они принадлежат. Когда ":group" опущен, изменяется только владелец файла; -R или --recursive: обрабатывать рекурсивноuser 用户 [用户组];Команда настраивает пользователя или группу, от имени которой работает сервер.

Затем клонируйте виртуальные машины №2 и №3, обратите внимание на выполнение скрипта для настройки сети.

После этого измените файл hosts локального хоста, например, на моем MacBook Pro.vi /etc/hosts:

192.168.177.11 itshop.test
192.168.177.11 www.itshop.test
192.168.177.12 file.itshop.test
192.168.177.13 upload.itshop.test

Создание сервера Nginx + PHP

Установите PHP на серверы № 3, 4 и 5. Сервер № 3 предоставляет услуги загрузки файлов, в том числе сжатие картинок, создание эскизов, добавление водяных знаков и т. д., и, наконец, сохранение их на сервере хранения файлов № 6. Нет. 4 и 5 Сервер — это кластер сценариев, используемых для выполнения веб-сайта.

Сама по себе комбинация PHP и Apache является наиболее совершенной (PHP работает в модульном режиме), но здесь нам нужно использовать Nginx (PHP работает в CGI-режиме), поэтому нам нужно настроить FastCGI, подробнее читайтеПодробное объяснение принципа работы Nginx+Php-fpm.

Установите PHP на сервер 3:

# 安装依赖,需自行下载[libmcrypt-2.5.8.tar.gz](https://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz/download)
yum -y install gcc-c++ libxmk2-devel curl-devel libjpeg-devel libpng-devel freetype-devel
tar -zxf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure && make && make install && cd ..
# 编译安装PHP(演示用,我们采用的是php-5.6.27)
wget https://www.php.net/distributions/php-7.4.0.tar.gz
tar -zxf php-5.6.27.tar.gz
cd php-5.6.27
./configure --prefix=/usr/local/php --enable-fpm --with-zlib --enable-zip --enable-mbstring --with-mcrypt --with mysql \
--with-mysqli --with-pdo-mysql --with-gd --with-jpeg-dir --with-png-dir  \
--with-freetype-dir --with-curl --with-openssl --with-mhash --enable-bcmath \
--enable-opcache && make && make install
# 配置Nginx 和PHP
cp php.ini-production /usr/local/php/lib/php.ini
vi /usr/local/php/lib/php.ini # 配置时区为PRC date.timezone=PRC
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm # 创建服务脚本、配置开机启动
chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm
cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf
vi php-fpm.conf 
# 更改 [www] 下的配置
user=www # 子进程工作用户
group=www
listen=/dev/shm/php-cgi.sock # 监听sock文件
listen.owner=www # socket 文件的所有者
listen.group=www
service php-fpm start
vi /usr/local/nginx/conf/nginx.conf
# 在server块中配置:
index index.html index.htm index.php
location ~\.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    include fastcgi.conf;
}
service nginx reload

Вы также можете узнать, какой сокет подключения к сокету домена unix используется здесь./dev/shm/php-cgi.sock(многие учебники используют пути/tmp, а путь/dev/shmэто tmpfs, который намного быстрее диска) -Разница между unix-сокетом порта прослушивания fastcgi_pass и сокетом tcp в Nginx.

После выполнения вышеуказанных операций платформа Nginx+PHP собрана.

На основе виртуальной машины №3 клонируйте виртуальные машины №4 и №5, обратите внимание на настройку IP-адреса и брандмауэра, здесь серверы №4 и №5Нет необходимости в прямом внешнем доступе, поэтому вы можете изменить правила брандмауэра, чтобы разрешить доступ только к IP-адресу сервера балансировки нагрузки № 1:

vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 改IP
iptables --list -n --line-numbers# 查看规则
iptables -R INPUT 1 -s192.168.177.1 -p tcp --dport 80 -j ACCEPT
service iptables save

Касательно iptables, доступ к локальной машине: фильтрация по цепочке INPUT, локальный доступ к внешней: фильтрация по цепочке OUTPUT, доступ к другим хостам через локальную машину: фильтрация по цепочке FORWARD. вам может понадобиться репетиторствоучебник по iptables.

Настройте обратный прокси и балансировку нагрузки

После предыдущей настройки к серверам 4 и 5 может получить доступ только сервер 1. Затем настройте Nginx на сервере 1 для достижения обратного прокси и балансировки нагрузки, отредактируйте/usr/local/nginx/conf/nginx.conf:

server {
    listen 80;
    server_name itshop.test www.itshop.test;
    location / {
        proxy_pass http://web_server;
        proxy_http_version 1.1;    # 后盾服务器使用HTTP1.1
        proxy_set_header Connection "";  # 清空客户端Connection消息头
        proxy_set_header Host $host;  # 传递Host头
        proxy_set_header X-Real-IP $remote_addr;  # 传递真实客户端IP
    }
}
upstream web_server{
    server 192.168.177.14;
    server 192.168.177.15;
    keepalive 32;  # 与后端服务器保持的长连接数
}

может быть в/data/wwwНапишите index.php ниже:

<?php
echo phpinfo();
?>

В локальном доступе видно, что REMOTE__ADDR — это адрес машины балансировки нагрузки (машина №1):

itshop.test/index.php

В приведенном выше примере используется заголовок запроса X-Real-IP для передачи IP-адреса реального клиента.Для резервного копирования серверов № 4 и 5 для идентификации заголовка запроса X-Real_IP с сервера № 1 в качестве IP-адреса клиента. , также необходимо использовать сервер серверов № 4 и № 5. Конфигурация в блоке:

real_ip_header X-Real-IP;
set_real_ip_from 192.168.177.11;  # 只从来自指定IP的请求中获取X-Real_IP

не забудьте:service nginx reload.

itshop.test/index.php

[На самом деле, я думаю, что это слишком громоздко для развертывания и развертывания, поэтому это не так хорошо, как указано выше.docker, но Tucao есть Tucao, продолжаем доделывать последующий контент]

Серия статей о практике развертывания распределенного кластера LNMP:


dffaceУведомление об авторских правах: Все статьи, если не указано иное, используютCC BY-NC-SA 4.0соглашение. Перепечатка с указанием источника, коммерческое использование строго запрещено!