Configuration de nginx.conf
nginx.conf
Recherchez le fichier dans le répertoire d'installation de Nginx , qui est responsable de la configuration des fonctions de base de Nginx.
Aperçu du profil
Le fichier de configuration principal de Nginx ( conf/nginx.conf
) est organisé selon la structure suivante :
bloc de configuration | Description de la fonction |
---|---|
bloc global | Paramètres globaux liés au fonctionnement de Nginx |
bloc d'événements | Paramètres liés aux connexions réseau |
bloc http | Configuration des proxys, caches, logs, hôtes virtuels, etc. |
bloc serveur | Paramètres des paramètres de l'hôte virtuel (un bloc http peut contenir plusieurs blocs de serveur) |
bloc de localisation | Définir les méthodes de routage des requêtes et de traitement des pages |
Exemple de fichier de configuration
Un exemple de fichier de configuration relativement complet est le suivant.
# 全局段配置
# ------------------------------
# 指定运行nginx的用户或用户组,默认为nobody。
#user administrator administrators;
# 设置工作进程数,通常设置为等于CPU核心数。
#worker_processes 2;
# 指定nginx进程的PID文件存放位置。
#pid /nginx/pid/nginx.pid;
# 指定错误日志的存放路径和日志级别。
error_log log/error.log debug;
# events段配置信息
# ------------------------------
events {
# 设置网络连接序列化,用于防止多个进程同时接受到新连接的情况,这种情况称为"惊群"。
accept_mutex on;
# 设置一个进程是否可以同时接受多个新连接。
multi_accept on;
# 设置工作进程的最大连接数。
worker_connections 1024;
}
# http配置段,用于配置HTTP服务器的参数。
# ------------------------------
http {
# 包含文件扩展名与MIME类型的映射。
include mime.types;
# 设置默认的MIME类型。
default_type application/octet-stream;
# 定义日志格式。
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
# 指定访问日志的存放路径和使用的格式。
access_log log/access.log myFormat;
# 允许使用sendfile方式传输文件。
sendfile on;
# 限制每次调用sendfile传输的数据量。
sendfile_max_chunk 100k;
# 设置连接的保持时间。
keepalive_timeout 65;
# 定义一个上游服务器组。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #此服务器为备份服务器。
}
# 定义错误页面的重定向地址。
error_page 404 https://www.baidu.com;
# 定义一个虚拟主机。
server {
# 设置单个连接上的最大请求次数。
keepalive_requests 120;
# 设置监听的端口和地址。
listen 4545;
server_name 127.0.0.1;
# 定义location块,用于匹配特定的请求URI。
location ~*^.+$ {
# 设置请求的根目录。
#root path;
# 设置默认页面。
#index vv.txt;
# 将请求转发到上游服务器组。
proxy_pass http://mysvr;
# 定义访问控制规则。
deny 127.0.0.1;
allow 172.18.5.54;
}
}
}
location
Explication détaillée du mappage de chemin
Format:
location [ = | ~ | ~* | !~ | !~* | ^~ | @ ] uri {...}
Explication de chaque marque :
=
: Correspondance exacte. Si la correspondance réussit, arrêtez immédiatement la recherche et traitez la demande.~
: Effectuer une correspondance régulière, sensible à la casse.~*
: effectue une correspondance régulière, sans tenir compte de la casse.!~
: Correspondance régulière, sensible à la casse et sans correspondance.!~*
: Correspondance régulière, non-correspondance insensible à la casse.^~
: Correspondance de préfixe. Si la correspondance réussit, rien d’autre ne sera trouvélocation
et l’expression régulière ne sera pas interrogée.@
:Spécifié nommélocation
, principalement utilisé pour les demandes de redirection internes, telles queerror_page
ettry_files
.uri
: La chaîne de requête à mettre en correspondance. Peut être une chaîne normale ou contenir une expression régulière.
Priorités et exemples
Ordre de priorité : pas d'identifiant spécifique <
^~
<=
< correspondance régulière (~
,~*
,!~
,!~*
)
Exemple:
location = / {
# 精确匹配 /,主机名后面不能带任何字符串
# http://abc.com [匹配成功]
# http://abc.com/index [匹配失败]
}
location ^~ /img/ {
# 以 /img/ 开头的请求,都会匹配上
# http://abc.com/img/a.jpg [匹配成功]
# http://abc.com/img/b.mp4 [匹配成功]
}
location ~* /Example/ {
# 忽略 uri 部分的大小写
# http://abc.com/test/Example/ [匹配成功]
# http://abc.com/example/ [匹配成功]
}
location /documents {
# 如果有正则表达式可以匹配,则优先匹配正则表达式
# http://abc.com/documentsabc [匹配成功]
}
location / {
# http://abc.com/abc [匹配成功]
}
proxy inverse
Le proxy inverse est l'une des fonctions principales de Nginx. Il permet à Nginx de transmettre les requêtes du client au serveur back-end et de renvoyer la réponse du serveur back-end au client, donnant ainsi au client l'impression de communiquer directement avec le serveur back-end. .
configuration de base
Pour configurer Nginx en proxy inverse, vous devez utiliser les directives location
du bloc proxy_pass
:
location /some/path/ {
proxy_pass http://your_backend_address;
}
Commandes courantes
proxy_pass
: Définissez l'adresse du serveur backend.proxy_set_header
: modifiez l'en-tête de requête transmis du client au serveur proxy.proxy_hide_header
: Masquer les en-têtes de réponse renvoyés par le serveur proxy.proxy_redirect
: Modifiez les champs d'en-têteLocation
et dans l'en-tête de réponse renvoyé par le serveur proxy .Refresh
Exemple de configuration
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Dans cette configuration, toutes example.com
les requêtes envoyées à seront transmises par proxy à localhost:8080
.
Précautions
- Lorsque vous utilisez
proxy_pass
la directive, assurez-vous que le serveur backend est disponible, sinon Nginx renverra une erreur. - À utiliser
proxy_set_header
pour garantir que le serveur principal reçoit les en-têtes de requête corrects. - Si le serveur backend et Nginx se trouvent sur des machines différentes, assurez-vous que la connexion réseau est stable.
Les proxys inverses améliorent non seulement les performances et la fiabilité de votre site Web, mais peuvent également être utilisés à diverses fins telles que l'équilibrage de charge, la mise en cache du contenu statique, la maintenance et la sécurité.
l'équilibrage de charge
Lorsqu'il existe plusieurs serveurs, le serveur proxy distribue la demande au serveur désigné pour traitement selon les règles.
Nom de la politique | décrire | Exemple |
---|---|---|
RR (tournoi à la ronde) | La méthode d'équilibrage de charge par défaut est attribuée aux différents serveurs backend un par un par ordre chronologique. | upstream web_servers { server localhost:8081; server localhost:8082; } |
Pose chaude | Lorsque le serveur principal tombe en panne, le trafic est transféré vers le serveur de sauvegarde. | upstream web_servers { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; } |
Poids | Distribuez les requêtes en fonction de poids prédéfinis. Les serveurs avec des poids plus élevés reçoivent plus de requêtes. | upstream web_servers { server localhost:8081 weight=1; server localhost:8082 weight=2; } |
ip_hash | Distribuez les requêtes en fonction du résultat de hachage de l'adresse IP du client pour garantir que les requêtes pour une adresse IP client spécifique sont toujours envoyées au même serveur backend. | upstream test { ip_hash; server localhost:8080; server localhost:8081; } |
équitable (tiers) | Les requêtes sont allouées en fonction du temps de réponse du serveur backend, la priorité étant donnée à celles dont les temps de réponse sont les plus courts. | upstream backend { fair; server localhost:8080; server localhost:8081; } |
url_hash (tiers) | Distribuez les requêtes en fonction du résultat de hachage de l'URL demandée pour garantir que les requêtes pour la même URL sont toujours envoyées au même serveur backend. | upstream backend { hash_method crc32; hash $request_uri; server localhost:8080; server localhost:8081; } |
Ces stratégies d'équilibrage de charge peuvent être sélectionnées et combinées en fonction des scénarios et des besoins réels de l'application.
Configurer la séparation dynamique et statique
La séparation dynamique et statique est une stratégie courante d'optimisation des serveurs Web, principalement pour améliorer la vitesse de réponse du serveur et réduire la pression sur le serveur. Dans Nginx, la séparation du dynamique et du statique est très simple à réaliser.
Concepts de base de la séparation dynamique et statique :
La séparation du contenu dynamique et du contenu statique fait référence au traitement séparé du contenu dynamique et du contenu statique. Le contenu statique comprend généralement : des images, des fichiers CSS, JavaScript, HTML, etc. Ces contenus n'ont pas besoin d'être modifiés fréquemment. Le contenu dynamique change fréquemment, comme le contenu généré par PHP, ASP, JSP, Servlet, etc.
Séparation dynamique et statique de la configuration Nginx
- Définissez un alias ou un répertoire racine directement pour le contenu statique :
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
root /path/to/static/files;
expires 30d; # 设置缓存时间
}
Dans la configuration ci-dessus, tous les fichiers statiques sont stockés dans /path/to/static/files
le répertoire. expires
La directive définit la durée du cache des fichiers statiques.
- Utiliser l'alias alias :
Si vos fichiers statiques ne se trouvent pas dans le répertoire principal du projet, vous pouvez utiliser alias
pour spécifier le chemin réel des fichiers statiques.
location /static/ {
alias /path/to/static/files/;
}
Dans cette configuration, les URL /static/
sont mappées au système de fichiers /path/to/static/files/
.
- Contenu dynamique des agents :
Pour le contenu dynamique, vous devrez peut-être transmettre la requête par proxy au serveur d'applications back-end, tel que Tomcat, uWSGI, etc.
location / {
proxy_pass http://backend_server_address;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Choses à noter :
- Assurez-vous que vos chemins de fichiers statiques sont correctement configurés pour éviter les erreurs 404.
- Utilisez
expires
des directives pour configurer la mise en cache du contenu statique, ce qui peut réduire la charge sur votre serveur et augmenter les vitesses de chargement des pages. - La séparation du dynamique et du statique peut non seulement améliorer la vitesse de réponse du serveur, mais également réduire la pression sur le serveur back-end, car les fichiers statiques sont généralement traités directement par Nginx sans qu'il soit nécessaire d'être proxy vers le serveur back-end. .
Optimisation des ressources statiques
Afin d'améliorer l'efficacité de la transmission des ressources statiques, Nginx fournit les trois instructions d'optimisation principales suivantes :
sendfile
tcp_nopush
tcp_nodelay
commande envoyer un fichier
sendfile
Utilisé pour activer un mode de transfert de fichiers efficace. Il est implémenté en appelant des fonctions du noyau système sendfile
, évitant ainsi plusieurs copies de fichiers, tout en réduisant la commutation entre le mode utilisateur et le mode noyau, améliorant ainsi l'efficacité de la transmission des fichiers statiques.
Processus traditionnel de demande de ressources statiques :
- Le client envoie une requête au serveur via l'interface réseau.
- Le système d'exploitation transmet ces requêtes à l'application côté serveur.
- L'application serveur gère la demande.
- Une fois le traitement terminé, le système d'exploitation transmet les résultats du traitement au client via la carte réseau.
projet | décrire | |
---|---|---|
grammaire | `envoyer le fichier le | éteint |
valeur par défaut | sendfile off |
|
Emplacement de configuration | http块 、server块 、location块 |
Instructions tcp_nopush et tcp_nodelay
tcp_nopush
Peut également être activé lorsque sendfile
est allumé . tcp_nopush
Son objectif principal est d'améliorer l'efficacité de la transmission des paquets de données du réseau.
projet | décrire | |
---|---|---|
grammaire | `tcp_nopush activé | éteint |
valeur par défaut | tcp_nopush off |
|
Emplacement de configuration | http块 、server块 、location块 |
tcp_nodelay
Cela ne prend effet keep-alive
que lorsque la connexion est ouverte . tcp_nodelay
Son objectif est d'améliorer les performances en temps réel des paquets de données réseau.
projet | décrire | |
---|---|---|
grammaire | `tcp_nodelay activé | éteint |
valeur par défaut | tcp_nodelay on |
|
Emplacement de configuration | http块 、server块 、location块 |
tcp_nopush
Le principe de fonctionnement consiste à configurer un tampon et à envoyer des données uniquement lorsque le tampon est plein, ce qui peut réduire considérablement la surcharge du réseau.
Compression des ressources statiques
Pendant le processus de transmission de données, afin d'optimiser davantage, Nginx introduit le module gzip pour compresser les ressources transmises, réduisant ainsi le volume de transmission de données et améliorant l'efficacité de la transmission.
La compression des ressources statiques dans Nginx peut être configurée dans le bloc http, le bloc serveur et le bloc d'emplacement. Les principaux modules concernés sont :
- Module ngx_http_gzip_module (intégré)
- module ngx_http_gzip_static_module
- module ngx_http_gunzip_module
Directives de configuration du module Gzip
-
gzip : Active ou désactive la fonction gzip.
- grammaire:
gzip on | off
- valeur par défaut:
gzip off
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- grammaire:
-
gzip_types : activez sélectivement la compression gzip en fonction du type MIME de la réponse.
- grammaire:
gzip_types mime-type
- valeur par défaut:
gzip_types text/html
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- Exemple:
gzip_types application/javascript
- grammaire:
-
gzip_comp_level : Définissez le degré de compression Gzip, le niveau est de 1 à 9.
- grammaire:
gzip_comp_level level
- valeur par défaut:
gzip_comp_level 1
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- grammaire:
-
gzip_vary : Définissez s'il faut porter l'en-tête de réponse "Vary:Accept-Encoding".
- grammaire:
gzip_vary on|off
- valeur par défaut:
gzip_vary off
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- grammaire:
-
gzip_buffers : Nombre et taille des tampons pour gérer la compression demandée.
- grammaire:
gzip buffers number size
- valeur par défaut:
gzip_buffer 32 4k | 16 8K
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- grammaire:
-
gzip_disable : activez et désactivez sélectivement la fonction gzip, en fonction de l'indicateur du navigateur du client.
- grammaire:
gzip_disable regex
- valeur par défaut:
gzip_disable -
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- Exemple:
gzip_disable "MSIE [1-6]."
- grammaire:
-
gzip_http_version : activez et désactivez sélectivement la fonction gzip pour différentes versions du protocole http.
- grammaire:
gzip_http_version 1.0 | 1.1
- valeur par défaut:
gzip_http_version 1.1
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- grammaire:
-
gzip_min_length : Déterminez s'il faut utiliser la fonction gzip en fonction de la taille du contenu de la réponse.
- grammaire:
gzip_min_length length
- valeur par défaut:
gzip_min_length 20
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- grammaire:
-
gzip_proxied : Définissez s'il faut compresser par gzip les résultats renvoyés par le serveur nginx au serveur d'arrière-plan.
- grammaire:
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any
- valeur par défaut:
gzip_proxied off
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- grammaire:
Problèmes de coexistence de Gzip et sendfile
Gzip effectue la compression au sein de l'application et sendfile peut envoyer des fichiers de ressources statiques directement via les périphériques réseau du système, en contournant le processus utilisateur de l'application. Pour résoudre le conflit entre les deux, Nginx fournit des directives ngx_http_gzip_static_module
de module gzip_static
.
- gzip_static : Compressez les fichiers statiques à l'avance.
- grammaire:
gzip_static on|off|always
- valeur par défaut:
gzip_static off
- Emplacement de configuration : bloc http, bloc serveur, bloc d'emplacement
- grammaire:
Grâce à la configuration ci-dessus, Nginx peut compresser efficacement les ressources statiques et améliorer l'efficacité de la transmission des données. En même temps, il coexiste avec la fonction sendfile pour assurer une transmission efficace des ressources.
Interdomaine
Le partage de ressources cross-origine (CORS) est une politique de sécurité qui contrôle quels sites Web peuvent accéder à vos ressources. Des problèmes inter-domaines sont souvent rencontrés lorsque votre application front-end et votre API back-end se trouvent sur des domaines différents. Nginx peut aider à résoudre ce problème en définissant des en-têtes de réponse.
location / {
# 其他配置...
# 设置允许来自所有域名请求。如果需要指定域名,将'*'替换为您的域名。
add_header 'Access-Control-Allow-Origin' '*';
# 允许的请求方法。
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
# 允许的请求头。
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
# 允许浏览器缓存预检请求的结果,单位为秒。
add_header 'Access-Control-Max-Age' 1728000;
# 允许浏览器在实际请求中携带用户凭证。
add_header 'Access-Control-Allow-Credentials' 'true';
# 设置响应类型为JSON。
add_header 'Content-Type' 'application/json charset=UTF-8';
# 针对OPTIONS请求单独处理,因为预检请求使用OPTIONS方法。
if ($request_method = 'OPTIONS') {
return 204;
}
}
Remarque : Dans un environnement de production, il est recommandé de ne pas l'utiliser pour des raisons de sécurité 'Access-Control-Allow-Origin' '*'
et de préciser plutôt le nom de domaine exact.
Anti-hotlinking
L'anti-hotlinking fait référence au fait d'empêcher d'autres sites Web de créer des liens directs vers les ressources de votre site Web (telles que des images, des vidéos, etc.), consommant ainsi la bande passante de votre serveur. Nginx fournit un module très pratique -
ngx_http_referer_module
, qui est utilisé pour implémenter la fonction anti-hotlinking.
Configuration anti-hotlink de base :
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked www.example.com example.com *.example.net;
if ($invalid_referer) {
return 403;
}
}
Dans la configuration ci-dessus :
-
valid_referers
Les pages sources légales sont définies.none
Indique un accès direct,blocked
indiquantReferer
un accès sans en-têtes,www.example.com
etexample.com
sont des noms de domaine source légaux, et tous les noms de sous-domaines*.example.net
représentésexample.net
sont des sources légales. -
$invalid_referer
La variablevalid_referers
deviendra "true" lorsque la source n'est pas dans la liste. -
Si la source est illégale, le serveur renverra un code d'état 403 Forbidden.
Utilisez la mauvaise image au lieu de l’image originale :
Si vous ne souhaitez pas afficher d'erreur 403, mais souhaitez afficher une image d'erreur (par exemple : une image "pas de liens externes"), vous pouvez le configurer comme ceci :
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked www.example.com example.com *.example.net;
if ($invalid_referer) {
rewrite ^/.*$ /path/to/error/image.jpg;
}
}
Dans la configuration ci-dessus, lorsqu'un lien hypertexte est détecté, Nginx réécrira l'URL demandée pour la pointer vers une image incorrecte.
Choses à noter :
-
La configuration anti-hotlinking peut affecter les robots des moteurs de recherche, alors soyez prudent lorsque vous mettez en œuvre une stratégie anti-hotlinking.
-
Si votre site Web utilise un CDN, assurez-vous que le serveur du CDN figure également
valid_referers
dans la liste, sinon le CDN risque de ne pas fonctionner correctement. -
Pour vous assurer que l'anti-hotlinking est correctement configuré, vous devez effectuer des tests adéquats dans un environnement de test avant de l'utiliser dans un environnement de production.
variables intégrées
Les variables intégrées pouvant être utilisées dans les fichiers de configuration nginx commencent par le signe dollar $. Parmi elles, les valeurs de la plupart des variables prédéfinies sont envoyées et portées par le client.
Nom de variable | décrire |
---|---|
$args |
Paramètres dans la ligne de requête, identiques à$query_string |
$content_length |
Champ de longueur de contenu dans l'en-tête de la requête |
$content_type |
Champ Content-Type dans l’en-tête de la demande |
$document_root |
La valeur spécifiée dans la directive racine pour la requête en cours |
$host |
Le nom d'hôte de la ligne de demande ou le nom d'hôte dans le champ d'en-tête de la demande Hôte |
$http_user_agent |
Informations sur l'agent client |
$http_cookie |
Informations sur les cookies des clients |
$limit_rate |
Variables pouvant limiter le taux de connexion |
$request_method |
L'action demandée par le client, telle que GET ou POST |
$remote_addr |
Adresse IP du client |
$remote_port |
port client |
$remote_user |
Nom d'utilisateur authentifié par le module Auth Basic |
$request_filename |
Chemin de fichier actuellement demandé |
$scheme |
Méthodes HTTP (telles que http, https) |
$server_protocol |
Le protocole utilisé par la requête, tel que HTTP/1.0 ou HTTP/1.1 |
$server_addr |
adresse du serveur |
$server_name |
nom du serveur |
$server_port |
Le numéro de port où la requête atteint le serveur |
$request_uri |
URI d'origine contenant les paramètres de la requête |
$uri |
L'URI actuel sans paramètres de requête |
$document_uri |
$uri Identique à |
Ces variables intégrées offrent une grande flexibilité dans la configuration de nginx, permettant à nginx de prendre des décisions et de traiter en fonction de divers attributs de la requête.