История о том, как взялся настроить связку nginx+php-fpm+roundcube в одной небольшой конторке. Собственно, во многих своих проектах стараюсь уходить от apache+mod_php к nginx+php-fpm, поскольку ее (связки) производительность и надежность, на мой взгляд, просто замечательная. Итак, задача сводилась к поднятию web-сервера с поддержкой SSL на нестандартном порту 8443. Под управлением данного web-сервера будут крутиться несколько сайтов, в том числе и roundcube.
Настройка конфигурации roundcube взята из моей предыдущей статейки, не буду поэтому повторяться, приводя аналогичные настройки. Генерация собственных сертификатов подробно описана на просторах интернета и вроде как вполне тривиальная задача, приведу просто команды, чтоб самому было легче вспоминать).
Итак,
1. Скачать дистрибутив roundcubemail-0.7.1.tar.gz с официального сайта.
2. Подключить репозиторий nginx и установить web-сервер
wget -c http://nginx.org/packages/rhel/6/noarch/RPMS/nginx-release-rhel-6-0.el6.ngx.noarch.rpm
yum -y install nginx-release-rhel-6-0.el6.ngx.noarch.rpm
yum -y install nginx
3. Подключить репозиторий remi и установить php-fpm
wget -c http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
yum -y install php-fpm
4. Сгенерировать SSL-сертификаты/ключи и просмотреть информацию о них, переместить в директорию /etc/nginx/conf.d/
openssl req -new -x509 -extensions v3_ca -keyout private/rootCA.key -out rootCA.crt -days 5000 -config ./openssl.cnf
openssl x509 -in rootCA.crt -noout -purpose
openssl x509 -in rootCA.crt -noout -text
openssl x509 -in rootCA.crt -noout -dates
openssl req -new -nodes -out webmail.DOMAIN.csr -keyout webmail.DOMAIN.key -config ./openssl.cnf
openssl ca -out webmail.DOMAIN.crt -infiles webmail.DOMAIN.csr -config ./openssl.cnf
mv webmail.DOMAIN.{crt,key} /etc/nginx/conf.d/
chown 0.0 /etc/nginx/conf.d/webmail.DOMAIN.{crt,key}
chmod 444 /etc/nginx/conf.d/webmail.DOMAIN.crt
chmod 400 /etc/nginx/conf.d/webmail.DOMAIN.key
5. Настройка nginx+php-fpm. Приведу только измененные строки
server {
listen 80;
server_name webmail.DOMAIN webmail;
access_log /var/log/nginx/webmail-access.log main;
error_log /var/log/nginx/webmail-error.log;
rewrite ^ https://webmail.DOMAIN:8443$request_uri permanent;
}
server {
listen 8443;
server_name webmail.DOMAIN webmail;
ssl on;
ssl_certificate /etc/nginx/conf.d/webmail.DOMAIN.crt;
ssl_certificate_key /etc/nginx/conf.d/webmail.DOMAIN.key;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/webmail-access.log main;
error_log /var/log/nginx/webmail-error.log;
root /var/www/rcube;
index index.php;
error_page 497 https://$host:8443$request_uri;
location ~ ^/.+\.(jpg|png|gif)$ {
expires max;
}
location ~* ^/(config|logs|temp|bin|sql)/.+$ {
deny all;
}
location ~ \.php$ {
fastcgi_param HTTPS on;
include /etc/nginx/conf.d/php-pharm;
}
location ~ /\.ht {
deny all;
}
}
6. Дальнейшая настройка roundcube (см. статью).
7. Важные моменты:
Указав, rewrite ^ https://webmail.DOMAIN:8443$request_uri permanent; я думал, что все сделано, но не тут то было. В ответ я получил 400 ошибку:
400 Bad Request
Литература:
http://forum.nginx.org/read.php?2,155978
Настройка конфигурации roundcube взята из моей предыдущей статейки, не буду поэтому повторяться, приводя аналогичные настройки. Генерация собственных сертификатов подробно описана на просторах интернета и вроде как вполне тривиальная задача, приведу просто команды, чтоб самому было легче вспоминать).
Итак,
1. Скачать дистрибутив roundcubemail-0.7.1.tar.gz с официального сайта.
2. Подключить репозиторий nginx и установить web-сервер
wget -c http://nginx.org/packages/rhel/6/noarch/RPMS/nginx-release-rhel-6-0.el6.ngx.noarch.rpm
yum -y install nginx-release-rhel-6-0.el6.ngx.noarch.rpm
yum -y install nginx
3. Подключить репозиторий remi и установить php-fpm
wget -c http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
yum -y install php-fpm
4. Сгенерировать SSL-сертификаты/ключи и просмотреть информацию о них, переместить в директорию /etc/nginx/conf.d/
openssl req -new -x509 -extensions v3_ca -keyout private/rootCA.key -out rootCA.crt -days 5000 -config ./openssl.cnf
openssl x509 -in rootCA.crt -noout -purpose
openssl x509 -in rootCA.crt -noout -text
openssl x509 -in rootCA.crt -noout -dates
openssl req -new -nodes -out webmail.DOMAIN.csr -keyout webmail.DOMAIN.key -config ./openssl.cnf
openssl ca -out webmail.DOMAIN.crt -infiles webmail.DOMAIN.csr -config ./openssl.cnf
mv webmail.DOMAIN.{crt,key} /etc/nginx/conf.d/
chown 0.0 /etc/nginx/conf.d/webmail.DOMAIN.{crt,key}
chmod 444 /etc/nginx/conf.d/webmail.DOMAIN.crt
chmod 400 /etc/nginx/conf.d/webmail.DOMAIN.key
5. Настройка nginx+php-fpm. Приведу только измененные строки
server {
listen 80;
server_name webmail.DOMAIN webmail;
access_log /var/log/nginx/webmail-access.log main;
error_log /var/log/nginx/webmail-error.log;
rewrite ^ https://webmail.DOMAIN:8443$request_uri permanent;
}
server {
listen 8443;
server_name webmail.DOMAIN webmail;
ssl on;
ssl_certificate /etc/nginx/conf.d/webmail.DOMAIN.crt;
ssl_certificate_key /etc/nginx/conf.d/webmail.DOMAIN.key;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/webmail-access.log main;
error_log /var/log/nginx/webmail-error.log;
root /var/www/rcube;
index index.php;
error_page 497 https://$host:8443$request_uri;
location ~ ^/.+\.(jpg|png|gif)$ {
expires max;
}
location ~* ^/(config|logs|temp|bin|sql)/.+$ {
deny all;
}
location ~ \.php$ {
fastcgi_param HTTPS on;
include /etc/nginx/conf.d/php-pharm;
}
location ~ /\.ht {
deny all;
}
}
6. Дальнейшая настройка roundcube (см. статью).
7. Важные моменты:
Указав, rewrite ^ https://webmail.DOMAIN:8443$request_uri permanent; я думал, что все сделано, но не тут то было. В ответ я получил 400 ошибку:
400 Bad Request
The plain HTTP request was sent to HTTPS portЕсли изменить rewrite на обычный 443 порт и директиву listen соот. поменять 8443 на 443, то все работает.
Недолгий поиск в интернете приводит к решению. При переходе по протоколу HTTP по адресу, на котором HTTPS (ssl on), то будет сгенерирована (нестандартная) ошибка 497, соответственно на нее надо повесить error_page с перенаправлением. Ошибки 411, 414, 495, 496 и 497 могут возникнуть только на уровне сервера, НЕ на уровне location.
Литература:
http://forum.nginx.org/read.php?2,155978
Комментариев нет:
Отправить комментарий