Quelles meilleures pratiques utilisez-vous lorsque vous utilisez NGinx?
De loin, les meilleurs conseils que j'ai jamais vus sont de l'auteur sur sa page d'écueil: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls /
Comment combiner des blocs HTTP et HTTPS.
server {
listen 80;
listen 443 default ssl;
# other directives
}
Cela a été publié comme réponse à une autre question. Voir ici .
En règle générale, l'utilisation de "si" est une mauvaise pratique (selon l'auteur de nginx). si possible, mieux vaut utiliser try_file des directives error_page à la place "if (-f ...)"
En combinant astuce avec le fichier maintenence.html et astuce avec try_files, nous obtenons:
location/{ try_files /maintenance.html $ uri $ uri/@wordpress; }
Une fois la maintenance terminée, il suffit de mv maintenance.html à partir de $ root.
Configurez nginx pour utiliser des chiffrements SSL plus puissants. Par défaut, SSLv2 est activé (que vous devez désactiver si possible).
ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
http://tumblelog.jauderho.com/post/121851623/nginx-and-stronger-ssl
Il est souvent plus efficace d'utiliser la directive map
à la place des expressions régulières lors du changement de racine pour faire correspondre les sous-domaines:
server {
server_name mysite.tld ~^.+\.mysite\.tld$;
map $Host $files {
default common;
mysite.tld common;
www.mysite.tld common;
admin.mysite.tld admin;
system.mysite.tld system;
*.mysite.tld users;
}
root /var/www/mysite/$files;
}
Le empty_gif
le module est également très utile, surtout si vous avez besoin de surveiller les réponses du serveur web (en utilisant nagios/monit/etc):
location /token {
empty_gif;
}
location /favicon.ico {
empty_gif;
}
location /img/1px.gif {
empty_gif;
}
Nous avons installé Nginx avec Chef, en utilisant ce livre de recettes qui contient des scripts pour gérer la configuration de nginx similaire à la façon dont Debian fait Apache2, ainsi que quelques exemples de modèles avec des valeurs par défaut saines.
Voici une bonne méthode pour renvoyer une page de maintenance. Toutes les demandes sont réécrites et le code http correct est renvoyé. (503 Service Indisponible)
error_page 503 /maintenance.html;
location /
{
if (-f $document_root/maintenance.html)
{
return 503;
}
try_files $uri /index.php?$args;
}
location = /maintenance.html
{
rewrite ^ /maintenance.html break;
}
Depuis nginx 0.7.12 et versions ultérieures, un "" est utilisable dans server_name pour intercepter les requêtes sans en-tête "Host".
Vous pouvez utiliser ce qui suit comme fourre-tout pour les hôtes virtuels non définis.
server {
server_name _ "";
}
J'ai également posté il y a un certain temps comment gérer correctement la compression gzip avec nginx car les anciens navigateurs peuvent avoir des problèmes avec juste une instruction gzip générale. HTH.
http://tumblelog.jauderho.com/post/27655495/gzip-compression-with-nginx
Je ne sais pas si c'est une meilleure pratique, mais certainement un hack soigné pour obtenir des conditions imbriquées dans nginx. Voici un exemple du wiki nginx .
location /xxxx/ {
set $test "";
if ($request_method = POST) {
set $test P;
}
if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
set $test "${test}C";
}
if ($test = PC) {
#rewrite rule goes here.
}
}
Si vous devez basculer contextuellement entre http et https pour les sous-domaines gérés par le même bloc serveur, vous pouvez utiliser des variables pour ce faire. Ce n'est peut-être pas le moyen le plus efficace de faire les choses, mais cela fonctionne:
server {
server mysite.tld ~^.+\.mysite\.tld$;
set $req_ssl = 0;
map $Host $files {
default common;
mysite.tld common;
www.mysite.tld common;
admin.mysite.tld admin;
system.mysite.tld system;
*.mysite.tld users;
}
root /var/www/mysite/$files;
if ( $files = "admin" ){
set $req_ssl 1;
}
if ( $files = "common" ){
set $req_ssl 2;
}
if ( $scheme = http )
{
set $req_ssl $req_ssl.1;
}
if ( $scheme = https )
{
set $req_ssl $req_ssl.2;
}
if ($req_ssl = 1.1){
rewrite ^ https://$Host$uri;
}
if ($req_ssl = 2.2){
rewrite ^ http://$Host$uri;
}
}
J'essaie toujours d'utiliser la directive root
en haut du bloc serveur pour pouvoir profiter de la $document_root
variable et jamais, mais jamais, la directive root
dans un bloc d'emplacement.
La Page des pièges du wiki Nginx contient de bons conseils sur les meilleures pratiques.
Si vous utilisez nginx en tant que proxy, il peut être important de régler les paramètres de délai d'expiration pour vous assurer que vous n'avez pas de connexions de suppression nginx avant que votre application n'en ait fini avec eux, surtout si vous avez affaire à une application à fort trafic:
proxy_connect_timeout
proxy_send_timeout
Avez-vous jeté un œil ici?