Szybkie uruchamianie aplikacji / strony internetowej - nginx + php5-fpm

Szybkie uruchamianie aplikacji / strony internetowej - nginx + php5-fpm

Życie trzeba sobie ułatwiać. Tak więc przygotowany mam prosty skrypt, dzięki któremu w prosty i co ważniejsze szybki sposób uruchamiam apke w oparciu o serwe nginx wraz z php5 jako pp5-fpm, coś jak:

add_site.sh moja-strona.pl

Sam skrypt jest banalny, a całość składa się z kilku plików szablonów, tj. szablon nginx czy szablon konfiguracji php. W moimprzypadku każda appka lata na osobnej instancji php, to taka mała nauczka gdy kiedyś tam php miałem globalnie dla kilku serwisów i błędna aplikacja zamrażała wszystkie procesy php – dokładniej tutaj problem polegał na braku komunikacji ipv6 z fejsbugiem.

Zatem do dzieła. W pierwszej kolejności tworzymy skrypt (nie kopjować, czytać) a potem template. Powiedzmy w /etc/nginx/

vim /etc/nginx/add_site.php
NGINX_CONFIG='/etc/nginx/sites-available'
NGINX_SITES_ENABLED='/etc/nginx/sites-enabled'
WEB_DIR='/web'
SED=`which sed`
CURRENT_DIR=`dirname $0`

if [ -z $1 ]; then
        echo "No domain name given"
        exit 1
fi
DOMAIN=$1

# sprawdzamy poprawność domeny
PATTERN="^([[:alnum:]]([[:alnum:]\-]{0,61}[[:alnum:]])?\.)+[[:alpha:]]{2,6}$"
if [[ "$DOMAIN" =~ $PATTERN ]]; then
        DOMAIN=`echo $DOMAIN | tr '[A-Z]' '[a-z]'`
        echo "Dodaje host:" $DOMAIN
else
        echo "zła nazwa domeny"
        exit 1
fi

SITE_DIR=`echo $DOMAIN`

useradd $DOMAIN
CONFIG=$NGINX_CONFIG/$DOMAIN
cp $CURRENT_DIR/virtual_host.template $CONFIG
$SED -i "s/DOMAIN/$DOMAIN/g" $CONFIG
$SED -i "s!ROOT!$WEB_DIR/$SITE_DIR!g" $CONFIG

# PHP konfiguracja
cp $CURRENT_DIR/php5-fpm.template /etc/php5/fpm/pool.d/$DOMAIN.conf
$SED -i "s/DOMAIN/$DOMAIN/g" /etc/php5/fpm/pool.d/$DOMAIN.conf

# struktura
mkdir $WEB_DIR/$SITE_DIR
mkdir $WEB_DIR/$SITE_DIR/app
mkdir $WEB_DIR/$SITE_DIR/log
mkdir $WEB_DIR/$SITE_DIR/tmp
chown $DOMAIN:$DOMAIN -R $WEB_DIR/$SITE_DIR
chown $DOMAIN:$DOMAIN -R $WEB_DIR/$SITE_DIR/app
chown $DOMAIN:$DOMAIN -R $WEB_DIR/$SITE_DIR/log
chown $DOMAIN:$DOMAIN -R $WEB_DIR/$SITE_DIR/tmp
chmod 600 $CONFIG

# symlink
ln -s $CONFIG $NGINX_SITES_ENABLED/$DOMAIN

# przeladowanie
sudo /etc/init.d/nginx reload
sudo /etc/init.d/php5-fpm reload


cp $CURRENT_DIR/user.ini $WEB_DIR/$SITE_DIR/app/.user.ini
chown $DOMAIN:$DOMAIN $WEB_DIR/$SITE_DIR/app/.user.ini
echo "Masz sajta $DOMAIN"

Oczywiście $DOMAIN oraz $SITE_DIR się powiela, jednak to było kiedyś na potrzeby czegoś tam :).

Jak widać moja struktura jest prosta :) a wszystko znajduje się w /web: app, log, tmp

Teraz potrzebujemy plików template, w poniższej konfiguracji używam Google PageSpeed, który opisywałem już na blogu. Wiec.:

vim /etc/nginx/virtual_host.template
server {
        listen 80;
        access_log /web/DOMAIN/log/access.log; #access logi
        error_log /web/DOMAIN/log/error.log; # error logi
        server_name www.DOMAIN DOMAIN;
        server_tokens off;
        pagespeed off; # tymczasowo blogujemy pagespeed

        root /web/DOMAIN/app/;

        location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; }
        location ~ "^/ngx_pagespeed_static/" { }
        location ~ "^/ngx_pagespeed_beacon$" { }
        location /ngx_pagespeed_statistics { allow 127.0.0.1; deny all; }
        location /ngx_pagespeed_global_statistics { allow 127.0.0.1; deny all; }
        location /ngx_pagespeed_message { allow 127.0.0.1; deny all; }
        location /pagespeed_console { allow 127.0.0.1; deny all; }

        location / {
            open_file_cache off; # tymczasowo blokujemy opcache, po uuchomieniu sajtu kasuje tą linijke
            try_files $uri $uri/ /index.php?$args;
            #auth_basic            "Restricted";
            #auth_basic_user_file  /etc/.htpasswd;
        }

        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        location ~ \.php$ {
            open_file_cache off; # tymczasowo blokujemy opcache, po uuchomieniu sajtu kasuje tą linijke
            fastcgi_pass unix:/var/php5-fpm/DOMAIN.socket; # link do socketu php, ktore trzymam w /var/php5-fpm
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
        }

        location ~ /\.ht {
            deny all;
        }
}
vim /etc/nginx/php5-fpm.template

Ot jakieś ustawienia domyślne, tyle o ile :) zmiana usera php-a, sciezki do socketu i jakies drobne restrykcje

[DOMAIN]
user = DOMAIN
group = DOMAIN
listen = /var/php5-fpm/DOMAIN.socket
listen.owner = DOMAIN
listen.group = DOMAIN
listen.mode = 0666
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
;pm.status_path = /status
;ping.path = /ping
;ping.response = pong

;access.log = /web/DOMAIN/log/php-access.log
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
;slowlog = log/$pool.log.slow
;request_slowlog_timeout = 0

request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited

chdir = /web/DOMAIN/app

security.limit_extensions = .php

env[HOSTNAME] = DOMAIN
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /web/DOMAIN/tmp
env[TMPDIR] = /web/DOMAIN/tmp
env[TEMP] = /web/DOMAIN/tmp
env[HOME] = /web/DOMAIN/app
env[USER] = DOMAIN

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f admin@8px.pl
php_flag[display_errors] = off
php_admin_value[error_log] = /web/DOMAIN/log/php-error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 64M
php_admin_value[open_basedir] = /web/DOMAIN/app:/web/DOMAIN/tmp
php_admin_value[disable_functions] = dl,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

I poniżej taki „prywatny php.ini”, z którego i tak nie korzystam :). Wszystko co chcę ładuje do konfiguracji php-a w pool.d

vim /etc/nginx/user.ini
error_reporting(E_ALL);
ini_set('display_errors', '1');

Oczywiście można się pokusić o to aby skrypt dodawał baze i usera w SQL, jednak w moinm przypadku nie robie tego z poziomu tego skryptu, gdyż często stawiam sobie coś na szybko bez bazy. Jedynie co musze zmajstrować w wolnym czasie to usówaczke sajtu:).