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 [email protected] 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:).