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

Урок 5 из 8

5 мин

В качестве единой точки входа на портал, как правило, используют прикладные программные или аппаратные балансировщики нагрузки.

Nginx

Если архитектура портала для закрытого контура не предполагает использование подсистемы балансировки и в качестве единой точки входа и сервера приложений используется BitrixVM, то Nginx будет предоставлять пользователям статические файлы и проксировать запросы на сервер приложений Apache. В таком варианте необходимые модули Nginx для корректной работы портала уже предварительно собраны и установлены с пакетом Nginx из официального репозитория Bitrix.

Список статических модулей и параметров сборки Nginx, поставляемых с BitrixVM:

nginx version: nginx/1.24.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1w  11 Sep 2023
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-openssl=/builddir/build/BUILD/bx-nginx-1.24.0/openssl-1.1.1w --with-openssl-opt=enable-tls1_3 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-file-aio --add-module=/builddir/build/BUILD/bx-nginx-1.24.0/nginx-push-stream-module-0.5.6 --add-module=/builddir/build/BUILD/bx-nginx-1.24.0/mod_zip-1.3.0 --add-module=/builddir/build/BUILD/bx-nginx-1.24.0/headers-more-nginx-module-0.34 --add-module=/builddir/build/BUILD/bx-nginx-1.24.0/ngx_brotli --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

В случае, когда используется стороннее окружение, необходимо собрать Nginx с необходимыми модулями самостоятельно.

Модули

Если проксирование пользовательских запросов с балансировщика осуществляется на несколько серверов приложений, то необходимо дополнительно собрать модуль nginx-sticky-module-ng. Методы балансировки бесплатной версии Nginx не позволяют корректно распределить нагрузку по весам для пользователей локальной сети.

nginx-sticky-module-ng

Модуль доступен в репозитории репозитории github.

Модуль позволяет «приклеить» сессию пользователя к определенному серверу приложений через cookie.

ngx_healthcheck_module

Для активных проверок upstream необходимо дополнительно собрать модуль ngx_healthcheck_module.

Модуль доступен в репозитории github репозитории github.

Модуль позволяет осуществлять активные health-check проверки группы серверов приложений и в случае сбоя одного или нескольких выполнять его исключение из группы проксирования. Модуль поддерживает одновременную работу с nginx-sticky-module-ng.

Установка nginx-sticky-module-ng ngx_healthcheck_module не является обязательным решением, конфигурацию можно реализовать и без них [прим. команды академии].

Примеры конфигурации балансировщика

Публикация одного сервера приложений

Пример основного файла конфигураций /etc/nginx/nginx.conf

user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid    	/var/run/nginx.pid;

worker_rlimit_nofile 200000;

events {
	use epoll;
	worker_connections  50000;
	multi_accept on;
}

http {
	include   	/etc/nginx/mime.types;
	default_type  application/force-download;
	server_names_hash_bucket_size 128;

	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  	'$status $body_bytes_sent "$http_referer" '
                  	'"$http_user_agent" "$http_x_forwarded_for" '
                  	'psid={$php_sess_id} '
                  	'us={$upstream_status} ua={$upstream_addr} urt={$upstream_response_time} '
                  	'rt={$request_time} bbs={$body_bytes_sent} rb={$request_body} ';

	access_log  /var/log/nginx/access.log  main;
	server_tokens off;

	sendfile                	on;
	tcp_nopush              	on;
	tcp_nodelay             	on;

	client_max_body_size    	1024m;
	client_body_buffer_size 	4m;

	keepalive_timeout       	300;
	client_header_timeout   	300;
	client_body_timeout     	300;

	reset_timedout_connection   on;
	send_timeout            	300;

	proxy_connect_timeout   	300;
	proxy_send_timeout      	300;
	proxy_read_timeout      	300;
	proxy_buffer_size       	64k;
	proxy_buffers           	8 256k;
	proxy_busy_buffers_size 	256k;
	proxy_temp_file_write_size  10m;

	gzip                    	on;
	gzip_proxied            	any;
	gzip_static             	on;
	gzip_http_version       	1.0;
	gzip_comp_level         	9;
	gzip_types              	text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

	# cache informations about file descriptors, frequently accessed files
	# can boost performance, but you need to test those values
	open_file_cache         	max=65000 inactive=20s;
	open_file_cache_valid   	30s;
	open_file_cache_min_uses	2;
	open_file_cache_errors  	on;

	include                 	/etc/nginx/conf.d/*.conf;
}

Дополнительный файл конфигурации для проксирования запросов к push&pull серверу /etc/nginx/conf.d/push.conf

# if connection ti not set
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' 'close';
}

map $http_upgrade  $replace_upgrade {
  default $http_upgrade;
  ''  	"websocket";
}

# sub services
upstream nodejs_sub {
  ip_hash;
  keepalive 1024;
  server sas-1:8010;
  server sas-1:8011;
  server sas-1:8012;
  server sas-1:8013;
  server sas-1:8014;
  server sas-1:8015;
}
# pub services
upstream nodejs_pub {
  ip_hash;
  keepalive 1024;
  server sas-1:9010;
  server sas-1:9011;
}

Дополнительный файл конфигурации /etc/nginx/conf.d/bitrix.conf

server {
	listen 443 ssl;
	server_name example.ru;
	ssl_certificate /etc/nginx/ssl/example.ru.pem;
	ssl_certificate_key /etc/nginx/ssl/example.ru.pem.key;

	set $php_sess_id $cookie_PHPSESSID;

	access_log off;

	#
	# Node.JS Push&Pull server settings
	#

	location ^~ /bitrix/pub/ {
    	access_log off;
    	proxy_pass http://nodejs_pub;
    	proxy_max_temp_file_size 0;
    	proxy_read_timeout  43800;
    	proxy_http_version 1.1;
    	proxy_set_header Upgrade $replace_upgrade;
    	proxy_set_header Connection $connection_upgrade;
    	access_log /var/log/nginx/push_pub_access.log main;
    	error_log /var/log/nginx/push_pub_error.log;
	}

	location ~* ^/bitrix/sub/ {
    	rewrite ^/bitrix/sub/(.*)$ /bitrix/subws/$1 break;
    	proxy_pass http://nodejs_sub;
    	proxy_max_temp_file_size 0;
    	proxy_read_timeout  43800;
    	access_log /var/log/nginx/push_sub_access.log main;
    	error_log /var/log/nginx/push_sub_error.log;
	}

	location ~* ^/bitrix/subws/ {
    	proxy_pass http://nodejs_sub;
    	proxy_max_temp_file_size 0;
    	proxy_read_timeout  43800;
    	proxy_http_version 1.1;
    	proxy_set_header Upgrade $replace_upgrade;
    	proxy_set_header Connection $connection_upgrade;
    	access_log /var/log/nginx/push_subws_access.log main;
    	error_log /var/log/nginx/push_subws_error.log;
	}

	location ~* ^/bitrix/rest/ {
    	proxy_pass http://nodejs_pub;
    	proxy_max_temp_file_size 0;
    	proxy_read_timeout  43800;
	}

	location / {
    	proxy_pass http://app-1;
    	#proxy_http_version 1.1;
    	#proxy_set_header Connection "";
    	proxy_set_header HTTPS YES;
    	proxy_set_header Host $host;
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_set_header X-Real-IP $remote_addr;
    	proxy_set_header X-Scheme $scheme;
    	proxy_set_header X-Forwarded-Proto $scheme;
    	proxy_set_header X-Auth-Request-Redirect $request_uri;
    	#proxy_set_header REMOTE_USER $remote_user;
    	access_log /var/log/nginx/access.log main;
    	error_log /var/log/nginx/error.log;
	}

	location = /basic_status {
    	stub_status;
    	allow 127.0.0.1;
    	allow ;
    	deny all;
    	access_log   off;
	}
}

Публикация двух серверов приложений

Данный пример конфигурации включает в себя конфигурацию и настройки модулей nginx-sticky-module-ng и ngx_healthcheck_module для «приклеивания» сессии пользователя и для активных проверок работоспособности серверов приложений.

Пример основного файла конфигураций /etc/nginx/nginx.conf

user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid    	/var/run/nginx.pid;

worker_rlimit_nofile 200000;

events {
	use epoll;
	worker_connections  50000;
	multi_accept on;
}

http {
	include   	/etc/nginx/mime.types;
	default_type  application/force-download;
	server_names_hash_bucket_size 128;

	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  	'$status $body_bytes_sent "$http_referer" '
                  	'"$http_user_agent" "$http_x_forwarded_for" '
                  	'psid={$php_sess_id} '
                  	'us={$upstream_status} ua={$upstream_addr} urt={$upstream_response_time} '
                  	'rt={$request_time} bbs={$body_bytes_sent} rb={$request_body} ';

	access_log  /var/log/nginx/access.log  main;
	server_tokens off;

	sendfile                	on;
	tcp_nopush              	on;
	tcp_nodelay             	on;

	client_max_body_size    	1024m;
	client_body_buffer_size 	4m;

	keepalive_timeout       	300;
	client_header_timeout   	300;
	client_body_timeout     	300;

	reset_timedout_connection   on;
	send_timeout            	300;

	proxy_connect_timeout   	300;
	proxy_send_timeout      	300;
	proxy_read_timeout      	300;
	proxy_buffer_size       	64k;
	proxy_buffers           	8 256k;
	proxy_busy_buffers_size 	256k;
	proxy_temp_file_write_size  10m;

	gzip                    	on;
	gzip_proxied            	any;
	gzip_static             	on;
	gzip_http_version       	1.0;
	gzip_comp_level         	9;
	gzip_types              	text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

	# cache informations about file descriptors, frequently accessed files
	# can boost performance, but you need to test those values
	open_file_cache         	max=65000 inactive=20s;
	open_file_cache_valid   	30s;
	open_file_cache_min_uses	2;
	open_file_cache_errors  	on;

	include                 	/etc/nginx/conf.d/*.conf;
}


Дополнительный файл конфигурации для проксирования запросов к push&pull серверу /etc/nginx/conf.d/push.conf

# if connection ti not set
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' 'close';
}

map $http_upgrade  $replace_upgrade {
  default $http_upgrade;
  ''  	"websocket";
}

# sub services
upstream nodejs_sub {
  ip_hash;
  keepalive 1024;
  server sas-1:8010;
  server sas-1:8011;
  server sas-1:8012;
  server sas-1:8013;
  server sas-1:8014;
  server sas-1:8015;
}
# pub services
upstream nodejs_pub {
  ip_hash;
  keepalive 1024;
  server sas-1:9010;
  server sas-1:9011;
}

Дополнительный файл конфигурации /etc/nginx/conf.d/bitrix.conf

upstream application_servers {
	sticky;
	server app-1:80 weight=25;
	server app-2:80 weight=25;
	# default tcp upstream check
	check interval=10000 rise=2 fall=4 timeout=15000  default_down=false;
	#check interval=3000 rise=2 fall=3 timeout=5000 type=http;
	#check_http_send "GET / HTTP/1.1\r\nHost: 127.0.0.1:80 r\n\r\n";
	check_http_expect_alive http_2xx http_3xx;
}
server {
	listen 443 ssl;
	server_name example.ru;
	ssl_certificate /etc/nginx/ssl/example.ru.pem;
	ssl_certificate_key /etc/nginx/ssl/example.ru.pem.key;

	set $php_sess_id $cookie_PHPSESSID;

	access_log off;

	#
	# Node.JS Push&Pull server settings
	#

	location ^~ /bitrix/pub/ {
    	access_log off;
    	proxy_pass http://nodejs_pub;
    	proxy_max_temp_file_size 0;
    	proxy_read_timeout  43800;
    	proxy_http_version 1.1;
    	proxy_set_header Upgrade $replace_upgrade;
    	proxy_set_header Connection $connection_upgrade;
    	access_log /var/log/nginx/push_pub_access.log main;
    	error_log /var/log/nginx/push_pub_error.log;
	}

	location ~* ^/bitrix/sub/ {
    	rewrite ^/bitrix/sub/(.*)$ /bitrix/subws/$1 break;
    	proxy_pass http://nodejs_sub;
    	proxy_max_temp_file_size 0;
    	proxy_read_timeout  43800;
    	access_log /var/log/nginx/push_sub_access.log main;
    	error_log /var/log/nginx/push_sub_error.log;
	}

	location ~* ^/bitrix/subws/ {
    	proxy_pass http://nodejs_sub;
    	proxy_max_temp_file_size 0;
    	proxy_read_timeout  43800;
    	proxy_http_version 1.1;
    	proxy_set_header Upgrade $replace_upgrade;
    	proxy_set_header Connection $connection_upgrade;
    	access_log /var/log/nginx/push_subws_access.log main;
    	error_log /var/log/nginx/push_subws_error.log;
	}

	location ~* ^/bitrix/rest/ {
    	proxy_pass http://nodejs_pub;
    	proxy_max_temp_file_size 0;
    	proxy_read_timeout  43800;
	}

	location / {
    	proxy_pass http://application_servers;
    	#proxy_http_version 1.1;
    	#proxy_set_header Connection "";
    	proxy_set_header HTTPS YES;
    	proxy_set_header Host $host;
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_set_header X-Real-IP $remote_addr;
    	proxy_set_header X-Scheme $scheme;
    	proxy_set_header X-Forwarded-Proto $scheme;
    	proxy_set_header X-Auth-Request-Redirect $request_uri;
    	#proxy_set_header REMOTE_USER $remote_user;
    	access_log /var/log/nginx/access.log main;
    	error_log /var/log/nginx/error.log;
	}

	location = /basic_status {
    	stub_status;
    	allow 127.0.0.1;
    	allow ;
    	deny all;
    	access_log   off;
	}
	location = /check_status {
    	check_status;
    	allow 127.0.0.1;
    	allow ;
    	deny all;
    	access_log   off;
	}
}

Прикладные и аппаратные корпоративные системы для публикации ресурсов

В ряде случаев для публикации портала в закрытом контуре используются прикладные или аппаратные решения. Например, к прикладным решениям относят Microsoft ISA/TMG/Forefront Gateway, Microsoft WAP, PfSense, а к аппаратным – Cisco, Alteon, Palo Alto и другие.

При публикации доступа к порталу через подобные системы следует учесть специфику работы push&pull модуля и внести изменения в соответствующую конфигурацию для корректного использования web-sockets.