Цель работы: настройка проксирования
Виды проксирования:
1. Forward proxy (прямой прокси)
Клиент подключается к прокси, а прокси ходит в интернет. Используется, например, в организациях для фильтрации/кэширования трафика.
2. Reverse proxy (обратный прокси)
Клиент думает, что он подключается к основному серверу, а на самом деле общается с прокси‑узлом, который перераспределяет запросы к внутренним серверам/приложениям.
Это то, что мы будем настраивать в лабораторной.
Пользователь → Nginx (reverse proxy) → Backend (например, локальный сервер на порту 8080)
Ключевые понятия в конфигурации Nginx
Основной конфигурационный файл:
/etc/nginx/nginx.conf
Основные директивы, которые мы будем использовать:
- listen — на каком порту/адресе слушать (обычно 80 для HTTP).
- server_name — имя сайта/виртуального хоста.
- location — блок настройки обработки запросов к определённому пути.
- proxy_pass — куда пересылать запросы (адрес бэкенда).
sudo apt-get update && apt-get install nginx -y
systemctl enable --now nginx
Для демонстрации reverse‑proxy нам нужен «внутренний» сервер, до которого Nginx будет проксировать запросы. В качестве бэкенда воспользуемся простым HTTP‑сервером на Python.
apt-get install python3 -y
mkdir -p ~/backend
cd ~/backend
vim index.html
Вставьте в файл:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Backend server</title>
</head>
<body>
<h1>Привет! Это backend-сервер на порту 8080</h1>
</body>
</html>
cd ~/backend
python3 -m http.server 8080
Терминал «зависнет» — это нормально, сервер запущен и ждёт запросов.
Не закрывайте это окно. При необходимости откройте второй терминал для дальнейшей работы.
curl http://127.0.0.1:8080
Вы должны увидеть HTML‑код, который вы создали.
Теперь настроим Nginx так, чтобы он принимал запросы на порт 80 и проксировал их на наш backend на 127.0.0.1:8080.
cd /etc/nginx
vim /etc/nginx/sites-available.d/proxy.conf
Вставьте в него следующую конфигурацию:
server {
listen 80; # Слушаем порт 80
server_name localhost; # Имя сервера
location / {
proxy_pass http://127.0.0.1:8080; # Проксируем на backend-сервер
proxy_set_header Host $host; # Пробрасываем исходный Host
proxy_set_header X-Real-IP $remote_addr; # Пробрасываем IP клиента
}
}
Создайте символическую ссылку
ln -s /etc/nginx/sites-available.d/proxy.conf /etc/nginx/sites-enabled.d/proxy.conf
Важно: удостоверьтесь, что в `conf.d` нет другого файла, который также слушает `listen 80;` с таким же `server_name`, иначе может быть конфликт. При необходимости временно переименуйте лишние конфиги (добавьте расширение `.bak`).
nginx -t
При корректной конфигурации вы увидите сообщение вида:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Если есть ошибки — внимательно прочитайте сообщение об ошибке, исправьте конфигурацию и повторите проверку.
systemctl restart nginx
(в первом окне терминала должны быть видны логи Python‑сервера).
curl http://127.0.0.1
Теперь ответ должен приходить от Nginx, который в свою очередь пересылает запрос на `127.0.0.1:8080`.
Обратите внимание:
- В терминале с Python‑сервером вы увидите лог запросов, пришедших от Nginx (обычно с адреса `127.0.0.1`).
- В браузере при открытии `http://127.0.0.1` будет страница «Привет! Это backend-сервер на порту 8080», но реально она приходит «через» Nginx.
Добавим пример, когда только часть запросов проксируется, а остальное обслуживает сам Nginx.
vim /etc/nginx/sites-available.d/proxy.conf
server {
listen 80;
server_name localhost;
# Корень сайта для статических файлов
root /var/www/html/;
index index.html;
# Все запросы к /api/ отправляем на backend
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# Остальные запросы – обычная статика
location / {
try_files $uri $uri/ =404;
}
}
Удалите прошлую символическую ссылку и создайте новую
rm -rf /etc/nginx/sites-enabled.d/proxy.conf
ln -s /etc/nginx/sites-available.d/proxy.conf /etc/nginx/sites-enabled.d/proxy.conf
nginx -t
systemctl restart nginx
Предварительно создайте в директории /var/www/html, файл index.html
vim /var/www/html/index.html
Вставьте в файл
<html><body><h1>It works! Nginx</h1></body></html>
- Стандартная страница Nginx:
curl http://127.0.0.1/
Ожидается стандартная «Welcome to nginx» (если index.html по умолчанию).
- Запрос к `/api/`:
curl http://127.0.0.1/api/
Ожидается HTML, который выдаёт Python‑сервер (`Привет! Это backend-сервер...`).
В терминале с Python‑сервером проверьте, что запросы к `/api/` действительно доходят до backend‑сервера (в логах должны появиться соответствующие строки).
#Postgresql
apt-get install postgresql16-server zabbix-server-pgsql fping
/etc/init.d/postgresql initdb
systemctl enable --now postgresql
su - postgres -s /bin/bash
# создание пользователя Zabbix (нужно установить пароль zabbixpwd)
createuser --no-superuser --no-createdb --no-createrole --encrypted --pwprompt zabbix
# создание БД zabbix
createdb -O zabbix zabbix
# добавить в базу данные для веб-интерфейса (займет минут 5)
psql -U zabbix -f /usr/share/doc/zabbix-common-database-pgsql-*/schema.sql zabbix
psql -U zabbix -f /usr/share/doc/zabbix-common-database-pgsql-*/images.sql zabbix
psql -U zabbix -f /usr/share/doc/zabbix-common-database-pgsql-*/data.sql zabbix
exit
#Apache
apt-get install apache2 apache2-mod_php8.2
systemctl enable --now httpd2
#PHP
apt-get install php8.2 php8.2-mbstring php8.2-sockets php8.2-gd php8.2-xmlreader php8.2-pgsql php8.2-ldap php8.2-openssl
vim /etc/php/8.2/apache2_mod_php/php.ini
memory_limit = 256M
post_max_size = 32M
max_execution_time = 600
max_input_time = 600
date.timezone = Europe/Moscow
always_populate_raw_post_data = -1
systemctl restart httpd2
vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbixpwd
systemctl enable --now zabbix_pgsql
systemctl enable –now zabbix_agentd
#Установка веб-морды
apt-get install zabbix-phpfrontend-apache2 zabbix-phpfrontend-php8.2
ln -s /etc/httpd2/conf/addon.d/A.zabbix.conf /etc/httpd2/conf/extra-enabled/
systemctl restart httpd2
chown apache2:apache2 /var/www/webapps/zabbix/ui/conf
vim /etc/php/8.2/apache2_mod_php/php.ini
memory_limit = 256M
post_max_size = 32M
max_execution_time = 600
max_input_time = 600
date.timezone = Europe/Moscow
always_populate_raw_post_data = -1
systemctl restart httpd2
vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbixpwd
systemctl enable --now zabbix_pgsql
systemctl enable –now zabbix_agentd
#Установка веб-морды
apt-get install zabbix-phpfrontend-apache2 zabbix-phpfrontend-php8.2
ln -s /etc/httpd2/conf/addon.d/A.zabbix.conf /etc/httpd2/conf/extra-enabled/
systemctl restart httpd2
chown apache2:apache2 /var/www/webapps/zabbix/ui/conf
Если нужен клиент:
apt-get install zabbix-agent
vim /etc/zabbix/zabbix-agentd.conf
# Изменить
Server=192.168.11.68
ServerActive=192.168.11.68
Hostname=hostname
systemctl enable --now zabbix_agentd
На сервере nginx:
/etc/nginx/sites-available.d/default.conf
# Стандартный конфиг в этом файле нужно стереть
upstream zabbix {
server srv3-dt.au.team; #здесь должен быть ip
}
server {
listen 80;
server_name zabbix.au.team; #здесь должен быть ip
location / {
return 301 http://$host/zabbix/$request_uri;
}
location /zabbix {
proxy_pass http://zabbix;
}
}
cd /etc/nginx/sites-enabled.d/
ln -s ../sites-available/default.conf default.conf
systemctl enable --now nginx