FreeBSD Nginx + php-fpm + mini_httpd + SSL
Когда на сервере необходимо поднять Web-сервер, который мог бы выполнять php скрипты, а также cgi и pl скрипты perl и не хочется устанавливать монстра Apache, то для этих целей подойдет связка:
Nginx — фронтэндом как веб-сервер
php-fpm — бэкэнд для выполнения php скриптов
mini_httpd — маленький http сервер, бэкэнд для выполнения cgi и pl скриптов.
И все это приправим еще прикручиванием SSL и на Nginx и на mini_httpd, чтобы максимально увеличить полезность данной статьи.
Все это будем проделывать на FreeBSD. На остальных Unix системах настраивается все также, различаются только пути до файлов и прочие мелочи.
Устанавливаем весь необходимый софт из портов
cd /usr/ports/www/nginx make install clean |
Не забываем при установке проставить галочку на HTTP_SSL
Ставим php, также не забываем поставить галочку напротив FPM для установки php-fpm.
cd /usr/ports/lang/php5 make install clean |
Если уже установили пакет без нужных элементов (это относится ко всем пакетам), то поможет деинсталляция, удаление конфига и установка пакета заново.
cd /usr/ports/пакет для деинсталяции make deinstall clean make rmconfig make install clean |
Ставим mini_httpd
cd /usr/ports/www/mini_httpd make install clean |
Добавляем строки в файл /etc/rc.conf
nginx_enable="YES" php_fpm_enable="YES" mini_httpd_enable="YES" |
Запускаем nginx и php-fpm
/usr/local/etc/rc.d/nginx start /usr/local/etc/rc.d/php-fpm start |
Открываем браузер и проверяем работоспособность nginx, для этого вводим в адресную строку ip сервера, если все хорошо, то мы видим приветственную страницу nginx.
Идем далее
Настраиваем nginx
Для начала сгенерируем сертификаты для нашего HTTPS-сервера
Для этого создадим директорию под ключи и сертификаты и зайдем туда
mkdir /usr/local/etc/nginx/ssl cd /usr/local/etc/nginx/ssl |
Далее займемся созданием сертификатов и ключей. Воспользуемся для этого openssl
openssl genrsa -out rsa.key 1024 openssl req -new -key rsa.key -out rsa.csr |
Команда выше спросит информацию о будущем сертификате, если хочется вводим, либо пропускаем
openssl x509 -req -days 730 -in rsa.csr -signkey rsa.key -out rsa.crt |
По итогу имеем в папке 3 файла:
rsa.key — Приватный ключ
rsa.csr — CSR запрос для приватного ключа
rsa.crt — Самоподписанный сертификат
Если особо не вдаваться в настройки nginx и оставлять все максимально по умолчанию то конфиг должен получиться примерно таким:
Редактируем /usr/local/etc/nginx/nginx.conf
Здесь приведен не весь конфиг, только секции server, остальное все осталось по умолчанию.
server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root /usr/local/www; index index.php index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/local/www/nginx-dist; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ .php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/www/$fastcgi_script_name; include fastcgi_params; } location ~ .cgi$ { root /usr/local/www/cgi-bin; proxy_pass http://127.0.0.1:9001; } } # HTTPS server # server { listen 443; server_name localhost; ssl on; ssl_certificate ssl/rsa.crt; ssl_certificate_key ssl/rsa.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /usr/local/www; index index.php index.html index.htm; } location ~ .php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/www/$fastcgi_script_name; include fastcgi_params; } location ~ .cgi$ { root /usr/local/www/cgi-bin; proxy_pass http://127.0.0.1:9001; } } |
Не забываем перезагрузить nginx
/usr/local/etc/rc.d/nginx restart |
Проверим работоспособность php скриптов и HTTPS-сервера. Для этого создадим файл test.php
Примерно такого содержания:
<?php phpinfo(); ?> |
И положим его в папку /usr/local/www
Открываем в браузере http://xxx.xxx.xxx.xxx/test.php и видим информационную таблицу с версией php и т.д., значит все работает.
Теперь открываем https://xxx.xxx.xxx.xxx/test.php для проверки https
Сначала будет предупреждающее сообщение от браузера, о сертификате, о его недоверенности, не обращаем внимания и продолжаем, так как сертификат у нас самопальный, соответственно поэтому для браузера он недоверенный. Если сервер поднимается для внутренних целей то это не критично, если нет, то как сделать сертификат доверенным это уже тема отдельной статьи.
В итоге видим такую же таблицу как в первый раз, значит все нормально.
Настраиваем mini_httpd для выполнения cgi скриптов
По умолчанию mini_httpd ищет свой конфигурационный файл в папке /usr/local/www, так как многие считают что это не очень хорошая идея немножко подправим конфигурацию mini_httpd.
Для этого отредактируем файл /usr/local/sbin/mini_httpd_wrapper
И заменим эту строчку
/usr/local/sbin/mini_httpd -D -C /usr/local/www/mini_httpd_config |
на эту
/usr/local/sbin/mini_httpd -D -C /usr/local/etc/mini_httpd.conf |
Теперь создадим этот конфигурационный файл
touch /usr/local/etc/mini_httpd.conf |
Выглядеть он должен примерно так:
port=9001 cgipat=**.cgi user=www data_dir=/usr/local/www logfile=/var/log/mini_httpd.log pidfile=/var/run/mini_httpd.pid |
Если хотим чтобы mini_httpd использовал SSL то файл должен выглядеть примерно так:
port=9001 cgipat=**.cgi user=www data_dir=/usr/local/www logfile=/var/log/mini_httpd.log pidfile=/var/run/mini_httpd.pid ssl certfile=/usr/local/etc/nginx/ssl/rsa.pem |
Для создания rsa.pem необходимо соединить приватный ключ и сертификат в одном файле
touch rsa.pem cat rsa.key > rsa.pem cat rsa.crt >> rsa.pem |
После проделанных действий перезагружаем mini_httpd
/usr/local/etc/rc.d/mini_httpd.sh stop /usr/local/etc/rc.d/mini_httpd.sh start |
Хочется отметить что порой с перезагрузкой mini_httpd возникают непонятные проблемы из разряда:
bind: Address already in use /usr/local/sbin/mini_httpd: can't bind to any address |
Я не стал разбираться, а просто перезагрузил сервер. Если перезагрузка критична, то смотрите в сторону удаления файла /var/run/mini_httpd.pid и остановки mini_httpd командой kill
Пришло время проверить как выполняются cgi скрипты
Для этого создадим папку cgi-bin под скрипты и создадим там файл test.cgi
mkdir /usr/local/www/cgi-bin touch /usr/local/www/cgi-bin/test.cgi |
Не забываем присвоить файлу права на выполнение
chmod 755 /usr/local/www/cgi-bin/test.cgi |
Наш test.cgi должен быть примерно такого содержания:
#!/usr/local/bin/perl print "Content-type: text/htmlnn"; print "<h1>Hello World</h1>n"; |
Теперь открываем в браузере http://xxx.xxx.xxx.xxx/cgi-bin/test.cgi
и https://xxx.xxx.xxx.xxx/cgi-bin/test.cgi
В обоих случаях мы должны увидеть надпись «Hello World».
Напоследок хочется отметить, что mini_httpd в отличие от apache, как оказалось, поддерживает не все переменные окружения, так что если вы их используете обратите на это внимание. К примеру переменная $ENV{HTTPS} даже при использовании HTTPS окажется пустая.