NGINX с многопользовательской версией WordPress для защиты пользовательских URL
У меня есть Nginx, настроенный для обслуживания поддомена Wordpress с основным доменом как domain.com.
Мы используем его для создания нескольких сайтов для наших клиентов, тогда некоторые из них хотят персонализированный URL, на нашем сайте у нас есть customername.domain.com
и настроить сайт Wordpress, чтобы иметь customerdomain.com
обслуживать сайт клиента, не используя наш поддомен.
Мой Nginx выглядит так:
map $http_host $blogid {
default -999;
#Ref: http://wordpress.org/extend/plugins/nginx-helper/
#include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
}
server {
server_name domain.com *.domain.com ;
root /var/www/html/portal;
index index.php;
access_log /var/log/nginx/nginxwp.access.log combined;
error_log /var/log/nginx/nginxwp.error.log;
client_max_body_size 100M;
location / {
try_files $uri $uri/ /index.php?$args ;
}
#WPMU Files
location ~ \.php$ {
autoindex on;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
# With php5-fpm:
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
client_max_body_size 100M;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
}
location ~ ^/files/(.*)$ {
try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
access_log off; log_not_found off; expires max;
}
}
Пока здесь все отлично работает.
Теперь мне нужно защитить свой домен клиента.
Как я могу обслуживать свой сайт клиента по ssl-сертификату для домена customerdomain.com и поддерживать другие сайты под HTTP
и даже наш основной сайт domain.com
нетронутым?
1 ответ
После долгих исследований, попыток и неудач, я смог сделать так, чтобы это работало самым простым способом.
Не забудьте использовать сертификат SAN для доменов, которые вы хотите защитить
Я работал с Wordpress Multisite как с обычным сайтом. И защитите его, как и для любого другого отдельного сайта (WP или нет).
По крайней мере, благодаря моим небольшим знаниям о Nginx, я защищаю свои сайты, делая перенаправление на сайт слушателей ssl (443).
Вместо того, чтобы делать отдельную настройку для каждого сайта, я сохранил фактическую конфигурацию для сайтов без SSL (большинство в моей сети), а затем использовал плагин Really Simple SSL для принудительной защиты только сайта, который я хотел защитить. Другие будут продолжать работать "как есть".
Важно сказать, что эта конфигурация работает для многосайтовых поддоменов.
Для ssl я только что создал прослушиватель в порту 443, и я делаю точно такую же обработку, чтобы перенаправить на правильный идентификатор блога. Сохранение только одного блока сервера, независимо от того, сколько сайтов я хочу защитить в будущем.
У меня в моем sites-available & sites-enabled
каталог 3 файлов.
certs.conf
domain.com.conf
ssl_domain.com.conf
Certs файл:
ssl_certificate /customers/certificates/sancert.pem;
ssl_certificate_key /customers/certificates/sancert.key;
domain.com.conf
map $http_host $blogid {
default -999;
#Ref: http://wordpress.org/extend/plugins/nginx-helper/
#include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
}
server {
server_name domain.com *.domain.com ;
root /var/www/html/portal;
index index.php;
access_log /var/log/nginx/nginxwp.access.log combined;
error_log /var/log/nginx/nginxwp.error.log;
location / {
try_files $uri $uri/ /index.php?$args ;
}
#WPMU Files
location ~ \.php$ {
autoindex on;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
# With php5-fpm:
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
client_max_body_size 100M;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
}
location ~ ^/files/(.*)$ {
try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
access_log off; log_not_found off; expires max;
}
}
ssl_domain.com.conf
server {
listen 443;
ssl on;
port_in_redirect off;
server_name domain.com *.domain.com ;
root /var/www/html/portal;
index index.php;
access_log /var/log/nginx/nginxwp.access.log combined;
error_log /var/log/nginx/nginxwp.error.log;
location / {
try_files $uri $uri/ /index.php?$args ;
}
#WPMU Files
location ~ \.php$ {
autoindex on;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
# With php5-fpm:
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
client_max_body_size 100M;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
}
location ~ ^/files/(.*)$ {
try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
access_log off; log_not_found off; expires max;
}
#WPMU x-sendfile to avoid php readfile()
location ^~ /blogs.dir {
internal;
alias /home/portal/wp-content/blogs.dir;
access_log off; log_not_found off; expires max;
}
#add some rules for static content expiry-headers here
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
}
В моем WordPress я установил для сайта настраиваемый домен для этого сайта как customerdomain.com
и принудительно HTTPS с помощью плагина Really Simple SSL
Все работает как шарм, с оценкой A+ на SSLabs.
Надеюсь, что это может сэкономить время для следующего исследования решения