Berkutman
@Berkutman

Как настроить правильно nginx front end apache2 ( Drupal 8, Moodle)?

Имеется веб сервер на Debian 10 , PHP Версия 7.3.4-2 , СУБД 5.5.5-10.3.17-MariaDB-0+deb10u1, Apache/2.4.38 (Debian) , Nginx 1.14.2 и модуль mod_rpaf 0.8.4 для проброски адреса клиента к серверу

На данном сервере будут крутится на данный момент два веб сайта , один на основе Drupal 8 , другой на основе moodle 3.7.2
D8 - example.com
Moodle 3.7.2 - moodle.example.com

Почитав решил сделать nginx front end apache2 + mod_rpaf
Конфигурация следующая:
Apache2:
/etc/apache2/apache2.conf
замена
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
 на
 LogFormat "%v:%p %{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined

/etc/apache2/ports.conf
Listen 127.0.0.1:81

<VirtualHost 127.0.0.1:81>
	ServerName example.com
	ServerAlias www.example.com
	ServerAdmin admin@example.com
	DocumentRoot /var/www/example_com/web
	<Directory /var/www/example_com/web>
		Options FollowSymLinks
		AllowOverride All
	</Directory>
	ErrorLog ${APACHE_LOG_DIR}/example_com_error.log
	CustomLog ${APACHE_LOG_DIR}/example_com_access.log vhost_combined
	ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php/php7.3-fpm.sock|fcgi://localhost/var/www/example_com/web"
</VirtualHost>

<VirtualHost 127.0.0.1:81>
	ServerName moodle.example.com
	ServerAdmin admin@moodle.example.com
	DocumentRoot /var/www/moodle_example_com/web
	<Directory /var/www/moodle_example_com/web>
		Options FollowSymLinks
		AllowOverride All
	</Directory>
	ErrorLog ${APACHE_LOG_DIR}/moodle_example_com_error.log
	CustomLog ${APACHE_LOG_DIR}/moodle_example_com_access.log vhost_combined
	ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php/php7.3-fpm.sock|fcgi://localhost/var/www/moodle_example_com/web"
</VirtualHost>

/etc/apache2/mods-available/rpaf.conf
<IfModule rpaf_module>
	RPAF_Enable             On
	RPAF_ProxyIPs           127.0.0.1 ::1
	RPAF_SetHostName        On
	RPAF_SetHTTPS           On
	RPAF_SetPort            On
	RPAF_ForbidIfNotProxy   Off
	RPAF_Header				 X-Forwarded-For
</IfModule>

Nginx:
server {
	listen 80;
	listen [::]:80;
	
	server_name example.com www.example.com;

	return 301 https://example.com$request_uri;
}
server {
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	root /var/www/example_com/web;
	index index.php index.html index.htm;
	server_name example.com www.example.com;
	 
location / {
		proxy_pass http://127.0.0.1:81;
		proxy_redirect        on;
		set_real_ip_from 1.2.3.4;
		real_ip_recursive on;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_pass_header Set-Cookie;
    }

	location ~ /\.ht {
		deny all;
    }

	location ~* \.(ico|docx|doc|xls|xlsx|rar|zip|jpg|jpeg|txt|xml|pdf|gif|png|css|js|html)$ {
		root   /var/www/example_com/web;
	}
	
	ssl_certificate			/etc/nginx/ssl/example_com.crt;
	ssl_certificate_key		/etc/nginx/ssl/example_com.key;
}

server {
	listen 80;
	listen [::]:80;
	server_name moodle.example.com;
}
server {
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	root /var/www/moodle_example_com/web;
	index index.php;

	server_name moodle.example.com;
	
	location / {
		proxy_pass http://127.0.0.1:81;
		proxy_redirect        on;
		set_real_ip_from 1.2.3.4;
		real_ip_recursive on;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_pass_header Set-Cookie;
    }

	ssl_certificate			/etc/nginx/ssl/moodle_example_com.crt;
	ssl_certificate_key		/etc/nginx/ssl/moodle_example_com.key;
}


Ошибок никаких не вызывает, веб сайты работают.
Но есть одна проблема, которую я не понял как решить.

Мысль следующая:
На D8 стоит плагин CAS Server , на Moodle стоит плагин CAS Auth
При попытке авторизоваться на Moodle через CAS Server который на D8 вылазит следующая оиюка только в логах nginx
2019/09/14 20:33:28 [error] 10802#10802: *105 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 1.2.3.4, server: moodle.example.com, request: "GET /login/index.php?authCASattras=CAS&ticket=ST-qXn8UiwEbFsYpX0nobVmGMS-ZARMGrXcm3Hbo7_uj2s HTTP/2.0", upstream: "http://127.0.0.1:81/login/index.php?authCASattras=CAS&ticket=ST-qXn8UiwEbFsYpX0nobVmGMS-ZARMGrXcm3Hbo7_uj2s", host: "moodle.example.com", referrer: "https://example.com/cas/login?service=https%3A%2F%2Fmoodle.example.com%2Flogin%2Findex.php%3FauthCASattras%3DCAS"


Что я сделал, я создал сайт на хостинге( который не мой сервер) назвал его d8.example.com ( Drupal 8) и md.example.com ( Moodle 3.7.2)
Получается :
На моем сервере сайты - example.com и moodle.example.com
На хостинге - d8.example.com и md.example.com

Сделал d8.example.com CAS Server , md.example.com и example.com и moodle.example.com CAS client

На всех трех сайтах я авторизовался под пользователем CAS Server который на d8.example.com

Далее я сделал example.com CAS Server , md.exemple.com и d8.example.com и moodle.example.com

Авторизация прошла и на md.exemple.com и на d8.example.com , на moodle.example.com вышла та ошибка.

Где я накосячил с конфигурацией, как я понял из ошибка он пытается отправить запрос с 127.0.0.1:81 на внешний адрес moodle.example.com.
Как это можно полечить? Редирект?
  • Вопрос задан
  • 754 просмотра
Решения вопроса 2
Вот тебе конфиг рабочий для 80 порта тупо ударишь лишнее.
Апачь при этом может быть практически любой поскольку главное прокся а что там сзади уже не важно.
Так же не нужно использовать домен в бэке хватит и 127.0.0.1 поскольку там все-равно по заголовкам будет разбор а не по домену в проксе.
реальный nginx
server {

######################################################################
## Server configuration 
######################################################################
	listen *:443 ssl http2;
		server_name 5job.ru www.5job.ru   ;
	root /var/www/5job.ru/web;
######################################################################
## Enable gzip for proxied requests and static files
######################################################################
    # Enable gzip for proxied requests and static files
    gzip on;
    gzip_proxied any;
    gzip_vary on;
    gzip_http_version 1.1;
    gzip_types application/javascript application/json text/css text/xml;
    gzip_comp_level 4;

######################################################################
## SSL configuration
######################################################################
# recommended but not manditory directive
# leave commented out unless you know what it is doing
#more_set_headers 'Strict-Transport-Security: max-age=15768000';
	ssl on;
	ssl_session_cache  shared:SSL:10m;
	ssl_session_timeout 1h;
	ssl_protocols TLSv1.2 TLSv1.1;
	add_header Strict-Transport-Security "max-age=15768000" always;
	ssl_stapling on;
	ssl_stapling_verify on;
	ssl_prefer_server_ciphers on;
	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK;
	ssl_certificate /var/www/clients/client26/web28/ssl/5job.ru-le.crt;
	ssl_certificate_key /var/www/clients/client26/web28/ssl/5job.ru-le.key;
	ssl_dhparam /etc/nginx/ssl/dhparam.pem;
######################################################################
## Log configuration
######################################################################
#Все логи отключены  
        error_log /dev/null crit;
        access_log off;
######################################################################
## 555 Еrror requires password password 
######################################################################
# Дев сайты закрыты htpass  login:dev pass:dev (второй кусок ниже)
	error_page 555 = @pass;
	location @pass {
		auth_basic	"Unauthorized";
		auth_basic_user_file	/var/www/dev_htpasswd;
		proxy_pass		https://127.0.0.1:4443;
		proxy_set_header 	Host		$host;
		proxy_set_header	X-Real-IP	$remote_addr;
		proxy_set_header	X-Forwarded-For	$proxy_add_x_forwarded_for;
		proxy_set_header	HTTPS		YES;
		}
######################################################################
## Errors send to apache2
######################################################################
# у апача своих алиасов куча,  а так же некоторая статика отдается 
# средствамси php, по этому все ошибки обрабатывать только apache2
	error_page 401 403 404 405 500 502 503 = @fallback;
	location @fallback {
		proxy_pass		https://127.0.0.1:4443;
		proxy_set_header 	Host		$host;
		proxy_set_header	X-Real-IP	$remote_addr;
		proxy_set_header	X-Forwarded-For	$proxy_add_x_forwarded_for;
		proxy_set_header	HTTPS		YES;
		}

######################################################################
## Locations configuration
######################################################################
#Отключаем логирование ошибок No such file or directory
## Disable .htaccess files

	location ~ /\.ht {
		deny all;

		access_log off;
		log_not_found off;
	}
	##
	location = /favicon.ico {
		log_not_found off;
		access_log off;
	}
	##
	location = /robots.txt {
		allow all;
		log_not_found off;
		access_log off;
	}
	##
######################################################################
# сервисы  на сайте phpmyadmin почта и letxencrypt
	location /phpmyadmin/ {
		deny all;
		# поставить пароль на phpmyadmin
		return 555;
		root  /usr/share/phpmyadmin/;
	}
	##
	location /webmail/ {
		rewrite ^/(.*)$ https://$http_host:8080/$1 permanent;
	}
	# letsencrypt 
	 location /.well-known/acme-challenge/ { 
	 	alias /usr/local/ispconfig/interface/acme/;
	 	default_type text/plain;

	 }
# static content 
# Отдаем статику напрямую с nginx
	location ~* ^.+\.(jpg|jpeg|svg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|flv|mp3)$ {
		root  /var/www/5job.ru/web;
		access_log off;
		expires 30d;
		gzip_static on;
	}

# default location
	location / {
		index index.php index.html index.htm;
		proxy_pass		https://127.0.0.1:4443;
		proxy_set_header 	Host		$host;
		proxy_set_header	X-Real-IP	$remote_addr;
		proxy_set_header	X-Forwarded-For	$proxy_add_x_forwarded_for;
		proxy_set_header	HTTPS		YES;
		######################################################################
		## Dev site Protection Requests in location /
		######################################################################
		# Дабы дев сайты не индексировались поисковиками, принудительно
		# Ставим пароли на них,  все что начинается с dev,old. или домен ks03
			if ($http_host ~* "^(dev|old|www.old|www.dev)\..*\..{2,8}$"){
		                return 555;
		                }
		                if ($http_host ~* "^.*\.ks03\.ru$"){
		                return 555;
		                }
		            
				proxy_set_header X-Forwarded-Proto https;
				include /etc/nginx/locations.d/*.conf;
		}
}


А еще лучше поставь веб морду дабы они есть вналичие
brainycp
vestacp
ispconfig3
bitrix-vm ( морда консольная)
Ответ написан
Комментировать
Berkutman
@Berkutman Автор вопроса
brainycp - за натом работает плохо. Нужна костыльная доработка
vestacp - отлично работает за натом, решил мою проблему.

До других продуктов не дошел. остановился на vestacp
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы