Nginx 1.8, PHP-FPM, memcache sur FreeBSD 10

Rédigé par Jérôme / 28 avril 2015 / 1 commentaire

Howto afin d'obtenir un équivalent haute performance Nginx au traditionnel Apache, PHP, FastCGI, suexec, etc... Configuration plutôt orientée production qui pourra être assez facilement adaptée à un cluster grâce à memcached (pour les sessions), utilisation des vhosts, et isolation des process PHP avec un user dédié par site (pour la sécurité).

Prérequis

Installation de paquets nécessaires. Vive pkg-ng, ça va aller vite.
# pkg install nginx
# pkg install php56 php56-opcache
# pkg install memcached pecl-memcache

Nginx

Création des répertoires dans lesquels on pourra loger nos fichiers de conf, logs, et certificats SSL
# mkdir /usr/local/etc/nginx/vhosts
# mkdir /usr/local/etc/nginx/ssl
# mkdir /var/log/www ; chown www:www /var/log/www ; chmod 774 /var/log/www
Au besoin, création de clefs ssl self-signed
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /usr/local/etc/nginx/ssl/server.key -out /usr/local/etc/nginx/ssl/server.crt

Fichier de configuration maitre :
# vi /usr/local/etc/nginx/nginx.conf
user  www www;
worker_processes 2;

error_log /var/log/www/error.log ;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

# main conf
http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;

# vhosts
include /usr/local/etc/nginx/vhosts/*.conf;
}

Création vhost par défaut :
# mkdir /usr/local/www/default
# chown www:www /usr/local/www/default
# vi /usr/local/etc/nginx/vhosts/00-default.conf
# http
server {
listen 80 default;
server_name _;
access_log /var/log/www/default-access.log main;
error_log /var/log/www/default-error.log;
server_name_in_redirect off;

location / {
root /usr/local/www/default;
index index.php index.html index.htm;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/default$fastcgi_script_name;
include fastcgi_params;
}
}

# https
server {
listen 443 default;
server_name _;
access_log /var/log/www/default-access.log main;
error_log /var/log/www/default-error.log;
server_name_in_redirect off;

ssl on;
ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/server.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!RC4:!MD5;
ssl_prefer_server_ciphers on;

location / {
root /usr/local/www/default;
index index.php index.html index.htm;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/default$fastcgi_script_name;
include fastcgi_params;
}
}

Création vhost example.com et d'un user dédié :
# pw groupadd www-example
# pw useradd www-example -g www-example -G www -c "example.com Owner" -d /nonexistent -s /usr/sbin/nologin

# mkdir /usr/local/www/example.com
# chown www-example:www-example /usr/local/www/example.com

# vi /usr/local/etc/nginx/vhosts/example.com.conf
# http
server {
listen 80;
server_name example.com www.example.com;
access_log /var/log/www/example.com-access.log main;
error_log /var/log/www/example.com-error.log;

location / {
root /usr/local/www/example.com;
index index.php index.html index.htm;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/example.com$fastcgi_script_name;
include fastcgi_params;
}
}

# https
server {
listen 443;
server_name example.com www.example.com;
access_log /var/log/www/example.com-access.log main;
error_log /var/log/www/example.com-error.log;

ssl on;
ssl_certificate ssl/example.com.crt;
ssl_certificate_key ssl/example.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!RC4:!MD5;
ssl_prefer_server_ciphers on;

location / {
root /usr/local/www/example.com;
index index.php index.html index.htm;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/example.com$fastcgi_script_name;
include fastcgi_params;
}
}

PHP

Installation du fichier php.ini général :
# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

Fichier de configuration général du service php-fpm :
# vi /usr/local/etc/php-fpm.conf
include=/usr/local/etc/php-fpm.d/*.conf

[global]
pid = /var/run/php-fpm.pid
error_log = /var/log/php-fpm.log

Fichier de configuration pour le pool dédié au vhost default :
# vi /usr/local/etc/php-fpm.d/default.conf
[default]
user = www
group = www
listen = 127.0.0.1:9000

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

; php.ini overwrites
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/www/default-php.log
php_admin_value[memory_limit] = 16M

Fichier de configuration pour le pool dédié au vhost example.com :
# vi /usr/local/etc/php-fpm.d/example.com.conf
[example.com]
user = www-example
group = www-example
listen = 127.0.0.1:9001

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

; php.ini overwrites
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/www/example.com-php.log
php_admin_value[memory_limit] = 64M
php_value[session.save_handler] = memcache
php_value[session.save_path] = 'tcp://127.0.0.1:11211'
php_flag[opcache.enable] = on
A noter : la dernière section du fichier permettra de surclasser les paramètre définis dans /usr/local/etc/php.ini pour chaque pool en fonction des besoins du vhost. Plus d'infos dans la documentation php.net.

Il ne reste plus qu'à démarrer les services :
# service php-fpm start
# service memcached start
# service nginx start
Source :
http://www.cyberciti.biz/faq/freebsd-nginx-namebased-virtual-hosting-configuration/
http://php.net/manual/fr/install.fpm.configuration.php

1 commentaire

#1 mardi 05 mai 2015 @ 13:16 Secrer a dit :

Concernant le php-fpm, en passant du mode "dynamic" en mode "ondemand", ça permet de gagner beaucoup de mémoire utilisé.

Écrire un commentaire

Quelle est la deuxième lettre du mot pgrkpo ? :

buffin.net

"Le cloud n'existe pas, vous utilisez juste l'ordinateur de quelqu'un d'autre."