Je ne sais pas ce que vous entendez par "sûr", mais laissez-moi vous parler d'un cas que j'ai rencontré récemment. J'avais besoin de refuser l'accès à un site à moins qu'un certain paramètre ne soit passé. Disons que la configuration ressemble à ceci :
server {
server_name localhost;
root /usr/share/nginx/html;
try_files $uri /index.html;
}
J'ai ajouté un if
:
...
if ($arg_secret-key != 123456) {
return 404;
}
Pero nginx
me donnerait 404 même si je fournissais le secret :
$ curl -sS localhost/?secret-key=123456
Il s'est avéré que try_files
a fait une redirection interne vers /index.html
(sans passer le paramètre), ce qui a donné lieu à 404. Pour que cela fonctionne, il fallait donc procéder de cette façon :
try_files $uri /index.html$is_args$args;
Mais en fait, je devais interdire l'accès à la page principale uniquement :
...
location = / {
if ($arg_secret-key != 123456) {
return 404;
}
}
Et comme ça, ça a marché sans changer try_files
. C'est parce qu'il y a aussi le index
module . Et try_files
n'est pas hérité par le location
bloc. Ainsi, le index
fait la bonne redirection vers /index.html?secret-key=123456
et pour la nouvelle demande, il n'y a plus rien à faire pour try_files
.
Si vous n'êtes pas sûr de ce qui se passe, vous pouvez exécuter nginx
construit avec --with-debug
et configurer le journal d'erreurs avec l'option debug
niveau, par exemple :
nginx.conf
:
error_log /var/log/nginx/error.log debug;
server {
server_name localhost;
root /usr/share/nginx/html;
...
}
$ docker run --rm --name nginx -p 1111:80 -dv $PWD/nginx.conf:/etc/nginx/conf.d/default.conf nginx:alpine nginx-debug -g 'daemon off;'
// launch `docker logs -f nginx` in a separate console, use Enter to separate requests
// processing starts with "generic phase: 0"
$ curl -sS localhost:1111/?secret-key=123456
// change nginx.conf
$ docker exec nginx nginx -s reload
$ curl -sS localhost:1111/?secret-key=123456
...
$ docker stop nginx
En savoir plus aquí .
Pour votre deuxième question, je pense que dans votre cas, avoir 2 server
est préférable. Parce que c'est ce qui est suggéré par les développeurs, et si vous choisissez l'option if
un jour, vous pourriez rencontrer un problème après avoir modifié la configuration. Ou vous pourriez vous rendre compte que dans certains cas, le système ne fonctionne pas comme vous l'aviez prévu (dans les cas plus complexes). On pourrait dire, if
introduit une complexité dans la configuration que vous pourriez ne pas connaître. En tant que tel, j'utiliserais if
si je comprenais bien comment tout cela fonctionne, ou si je n'avais pas d'autre choix. Et le if
semble être pire en termes de performances. Bien que ce ne soit qu'une spéculation, et je ne peux pas fournir de chiffres. Dans mon cas, je ne vois pas de solution de contournement, et c'est donc ce que je vais utiliser pour l'instant.
1 votes
D'après ce que j'ai compris, les blocs de deux serveurs sont la meilleure pratique et sont plus performants.
0 votes
Tim - Vous savez pourquoi ? Est-ce simplement que vous évitez l'obligation d'évaluer l'objet de l'opération ?
if
puisque cette détermination est faite par la logique de choix du serveur, qui s'exécuterait dans tous les cas ? Cette logique est-elle simplement plus optimisée queif
?0 votes
Je suppose que c'est simplement plus efficace en interne dans Nginx. Je vais probablement en rester là car c'est à peu près la limite de mes connaissances dans ce domaine, d'autres en sauront plus.
0 votes
D'après ce que j'ai compris, ils ne recommandent pas l'utilisation de "if" car il existe un risque potentiel de faire une mauvaise déclaration "if", ce qui entraîne des questions/problèmes inattendus/etc ?
0 votes
Ce n'est que mon avis, mais je soupçonne que le but de nginx de mentionner que "if est le mal" est précisément d'éviter le genre de situation que vous créez : il existe des moyens de faire ce que vous voulez qui ne nécessitent pas d'évaluer une clause if pour chaque requête. C'est la principale différence : avec deux blocs, vous demandez au système de faire ce que vous voulez. en fait qui est de faire en sorte que les utilisateurs utilisent un domaine spécifique (non-www). Avec la clause if, vous contournez le mécanisme de nginx pour acheminer les requêtes en fonction de l'adresse de l'utilisateur.
Host:
et de mettre en œuvre ce routage vous-même à l'aide des éléments suivantsif
clauses0 votes
@Tim C'est exactement ce que dit un tutoriel officiel de nginx.
0 votes
@IvanShatsky c'est une question vieille de plus de trois ans. La direction sur "si est le mal" semble avoir changé depuis 2017, donc vous pourriez bien avoir raison de dire qu'en 2020 la recommandation a changé.
0 votes
@Tim Qu'est-ce qui vous fait penser que ça a changé ?
0 votes
@x-yuri aucune idée à ce stade, la question date de 2017 et ce commentaire date d'un an. Je suppose que lorsque j'ai écrit cette réponse, mon souvenir était que la page semblait différente. Je n'ai pas fait beaucoup avec Nginx récemment, donc je ne me souviens pas des détails.