Nginx
En esta página de la wiki se detalla un ejemplo de óptima instalación del servidor web nginx.
Características de esta configuración en particular
- Soporte dual-stack completo (IPv4+IPv6)
- SSL/TLS optimizado para mayor seguridad
- Parámetros por defecto para ahorrar código
- No necesitamos activar cgi_pathinfo en PHP
Por hacer
- Separar aún más todo en snippets (ej. PHP5 y PHP7)
- SSL/TLS para default
- Agregar soporte a negociaciones TLS con claves ECDSA (actualmente sólo RSA)
Instalación
Para Debian/Ubuntu, sigue las instrucciones en la página oficial de nginx para instalar la última versión mainline.
Para ahorrar tiempo, puedes usar scripts como Gotdeb para automatizar la instalación. También soporta el repositorio de Dotdeb si planeas usar PHP 7.
Configuración
En los repositorios de Debian, nginx viene con la configuración dividida: sites-available y sites-enabled. En este caso, utilizaremos la configuración de nginx upstream (sólo conf.d).
Configuración principal
/etc/nginx/nginx.conf
user www-data; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Parámetros por defecto para el SSL/TLS para no repetir todo luego ssl_dhparam "/etc/nginx/dh-primes.pem"; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # Crear zona de riesgo (aún no la usamos): máximo 2 peticiones por segundo # Para proteger scripts PHP de login, etc limit_req_zone $binary_remote_addr zone=one:15m rate=2r/s; access_log /var/log/nginx/access.log main; gzip on; gzip_disable "msie6"; include /etc/nginx/conf.d/*.conf; }
/etc/nginx/fastcgi_params
Agregar estas dos líneas al archivo.
fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
/etc/nginx/snippets/fastcgi-php.conf
fastcgi_split_path_info ^(.+\.php)(/.+)$; try_files $fastcgi_script_name =404; set $path_info $fastcgi_path_info; fastcgi_param PATH_INFO $path_info; fastcgi_index index.php;
Configuración de sitios web
/etc/nginx/conf.d/default.conf
En este caso, por única vez se utilizará la directiva default_server e ipv6_only. De esta manera los sitios webs añadidos no tendrán problemas en soportar IPv4 e IPv6.
server { # __NO__ usar este archivo como plantilla para otros archivos de conf listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name _; #access_log /var/log/nginx/default.access.log main; root /var/www/default; index index.html; location / { try_files $uri $uri/ =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # Sin soporte de PHP. }
/etc/nginx/conf.d/algunsitio.conf (HTTPS activado y por defecto)
Para agregar más sitios web, clona este archivo.
Si tienes instalado el repositorio Dotdeb, puedes disponer de PHP 5 y PHP 7 en la misma máquina, corriendo simultáneamente. Aquí puede elegir cuál ejecutar.
Se asume que queremos que la web funcione con HTTPS, y que disponemos de certificados SSL/TLS. Si no es el caso, podemos ver el ejemplo que sigue después de éste.
server { listen 80; listen [::]:80; server_name la0trared.hacklab.org.bo; # Para hacer el sitio sólo HTTP, eliminamos la línea siguiente y copiamos los # argumentos necesarios del siguiente bloque "server" antes de eliminarlo también. return 301 https://la0trared.hacklab.org.bo$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name la0trared.hacklab.org.bo; root /var/www/abcd; index index.php; # Aquí vienen en un sólo archivo la clave pública de nuestro par de claves, y las claves públicas del CA. ssl_certificate "/etc/certs/evssl/hacklab.org.bo/fullchain.pem"; ssl_certificate_key "/etc/certs/evssl/hacklab.org.bo/privkey.pem"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; client_max_body_size 4M; client_body_buffer_size 128k; location / { try_files $uri $uri/ =404; } location ~ [^/]\.php$ { include snippets/fastcgi-php.conf; # Descomenta la opción preferida. #fastcgi_pass unix:/run/php/php7.0-fpm.sock; #fastcgi_pass unix:/run/php/php5-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS on; include fastcgi_params; }
/etc/nginx/conf.d/websimple.conf (Sólo HTTP)
CUIDADO: Un sitio web HTTPS que tiene HSTS activado no puede ser reemplazado por una versión sólo-HTTP. (ej: diaspora)
server { listen 80; listen [::]:80; server_name la0trared.hacklab.org.bo; root /var/www/abcd; index index.php; client_max_body_size 4M; client_body_buffer_size 128k; location / { try_files $uri $uri/ =404; } location ~ [^/]\.php$ { include snippets/fastcgi-php.conf; # Descomenta la opción preferida. #fastcgi_pass unix:/run/php/php7.0-fpm.sock; #fastcgi_pass unix:/run/php/php5-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS on; include fastcgi_params; }