Écrire un guide de configuration nginx

Configuration de nginx.conf

nginx.confRecherchez 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

image.png

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;          
        } 
    }
}

locationExplication 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é locationet l’expression régulière ne sera pas interrogée.
  • @:Spécifié nommé location, principalement utilisé pour les demandes de redirection internes, telles que error_pageet try_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. .

image.png

configuration de base

Pour configurer Nginx en proxy inverse, vous devez utiliser les directives locationdu 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ête Locationet 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.comles requêtes envoyées à seront transmises par proxy à localhost:8080.

Précautions

  1. Lorsque vous utilisez proxy_passla directive, assurez-vous que le serveur backend est disponible, sinon Nginx renverra une erreur.
  2. À utiliser proxy_set_headerpour garantir que le serveur principal reçoit les en-têtes de requête corrects.
  3. 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.

image.png

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.

image.png

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

  1. 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/filesle répertoire. expiresLa directive définit la durée du cache des fichiers statiques.

  1. Utiliser l'alias alias :

Si vos fichiers statiques ne se trouvent pas dans le répertoire principal du projet, vous pouvez utiliser aliaspour 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/.

  1. 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 expiresdes 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

sendfileUtilisé 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 :

  1. Le client envoie une requête au serveur via l'interface réseau.
  2. Le système d'exploitation transmet ces requêtes à l'application côté serveur.
  3. L'application serveur gère la demande.
  4. Une fois le traitement terminé, le système d'exploitation transmet les résultats du traitement au client via la carte réseau.

image.png

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 sendfileest allumé . tcp_nopushSon 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-aliveque lorsque la connexion est ouverte . tcp_nodelaySon 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_nopushLe 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.

image.png

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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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]."
  7. 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
  8. 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
  9. 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

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_modulede module gzip_static.

image.png

  • 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

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.

image.png

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

image.png

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_referersLes pages sources légales sont définies. noneIndique un accès direct, blockedindiquant Refererun accès sans en-têtes, www.example.comet example.comsont des noms de domaine source légaux, et tous les noms de sous-domaines *.example.netreprésentés example.netsont des sources légales.

  • $invalid_refererLa variable valid_referersdeviendra "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_referersdans 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 $uriIdentique à

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.

Je suppose que tu aimes

Origine blog.csdn.net/2301_76869453/article/details/132920627
conseillé
Classement