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 окажется пустая.

Комментарии
Если статья вам помогла (или не помогла), оставьте комментарий с отзывом для других пользователей и автора
Добавить комментарий

Ваш адрес email не будет опубликован.

Sidebar