Tutoriel minimaliste pratique de Nginx, couvrant des scénarios courants

Aperçu

Qu'est-ce que Nginx?

Nginx (moteur x) est un serveur Web léger, un serveur proxy inverse et un serveur proxy de messagerie (IMAP / POP3).

Qu'est-ce qu'un proxy inverse?

Le proxy inverse fait référence à l'utilisation d'un serveur proxy pour accepter les demandes de connexion sur Internet, puis transférer la demande à un serveur du réseau interne et renvoyer le résultat du serveur au client demandant la connexion sur Internet. temps, le serveur proxy agit comme un serveur proxy inverse en externe.

Insérez la description de l'image ici

utilisation

L'utilisation de nginx est relativement simple, juste quelques commandes.

Les commandes couramment utilisées sont les suivantes:

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen     重新打开日志文件。
nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t            不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v            显示 nginx 的版本。
nginx -V            显示 nginx 的版本,编译器版本和配置参数。

Si vous ne souhaitez pas taper la commande à chaque fois, vous pouvez ajouter un nouveau fichier de commandes de démarrage startup.bat dans le répertoire d'installation de nginx et double-cliquer pour l'exécuter. Le contenu est le suivant:

@echo off
rem 如果启动前已经启动nginx并记录下pid文件,会kill指定进程
nginx.exe -s stop

rem 测试配置文件语法正确性
nginx.exe -t -c conf/nginx.conf

rem 显示版本信息
nginx.exe -v

rem 按照指定配置去启动nginx
nginx.exe -c conf/nginx.conf

S'il fonctionne sous Linux, l'écriture d'un script shell est similaire.

Combat de configuration Nginx

Je pense toujours que la configuration des différents outils de développement doit être décrite en combinaison avec le combat réel, ce qui facilitera la compréhension des gens.

Réalisons d'abord un petit objectif: quelle que soit la configuration complexe, remplissez simplement un proxy inverse http.

Le fichier de configuration nginx.conf est le suivant:

Remarque: conf / nginx.conf est le fichier de configuration par défaut de nginx. Vous pouvez également utiliser nginx -c pour spécifier votre fichier de configuration

#运行用户
#user somebody;

#启动进程,通常设置成和cpu的数量相等
worker_processes  1;

#全局错误日志
error_log  D:/Tools/nginx-1.10.1/logs/error.log;
error_log  D:/Tools/nginx-1.10.1/logs/notice.log  notice;
error_log  D:/Tools/nginx-1.10.1/logs/info.log  info;

#PID文件,记录当前启动的nginx的进程ID
pid        D:/Tools/nginx-1.10.1/logs/nginx.pid;

#工作模式及连接数上限
events {
    
    
    worker_connections 1024;    #单个后台worker process进程的最大并发链接数
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    
    
    #设定mime类型(邮件支持类型),类型由mime.types文件定义
    include       D:/Tools/nginx-1.10.1/conf/mime.types;
    default_type  application/octet-stream;

    #设定日志
    log_format  main  '[$remote_addr] - [$remote_user] [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log    D:/Tools/nginx-1.10.1/logs/access.log main;
    rewrite_log     on;

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
    #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;
    #tcp_nopush     on;

    #连接超时时间
    keepalive_timeout  120;
    tcp_nodelay        on;

    #gzip压缩开关
    #gzip  on;

    #设定实际的服务器列表
    upstream zp_server1{
    
    
        server 127.0.0.1:8089;
    }

    #HTTP服务器
    server {
    
    
        #监听80端口,80端口是知名端口号,用于HTTP协议
        listen       80;

        #定义使用www.xx.com访问
        server_name  www.helloworld.com;

        #首页
        index index.html

        #指向webapp的目录
        root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp;

        #编码格式
        charset utf-8;

        #代理配置参数
        proxy_connect_timeout 180;
        proxy_send_timeout 180;
        proxy_read_timeout 180;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarder-For $remote_addr;

        #反向代理的路径(和upstream绑定),location 后面设置映射的路径
        location / {
    
    
            proxy_pass http://zp_server1;
        }

        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    
    
            root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
            #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
            expires 30d;
        }

        #设定查看Nginx状态的地址
        location /NginxStatus {
    
    
            stub_status           on;
            access_log            on;
            auth_basic            "NginxStatus";
            auth_basic_user_file  conf/htpasswd;
        }

        #禁止访问 .htxxx 文件
        location ~ /\.ht {
    
    
            deny all;
        }

        #错误处理页面(可选择性配置)
        #error_page   404              /404.html;
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
    
    
        #    root   html;
        #}
    }
}

Eh bien, essayons-le:

Démarrez l'application Web, faites attention à démarrer la fin de la liaison
Eh bien, essayons-le:

Démarrez l'application web et notez que le port pour démarrer la liaison doit être cohérent avec le port défini par l'amont dans nginx.
Changer d'hôte: ajoutez un enregistrement DNS dans le fichier hôte sous C: \ Windows \ System32 \ drivers \ etc

127.0.0.1 www.helloworld.com

Lancez la commande startup.bat
dans l' article précédent. Visitez www.helloworld.com dans votre navigateur. Pas de surprise, vous pouvez déjà y accéder.

Configuration de l'équilibrage de charge

Dans l'exemple précédent, le proxy pointe uniquement vers un serveur.

Cependant, dans le fonctionnement réel du site Web, la plupart des serveurs exécutent la même application et un équilibrage de charge est nécessaire pour détourner le trafic.
Nginx peut également implémenter des fonctions d'équilibrage de charge simples.

Supposons un tel scénario d'application: déployez l'application sur trois serveurs d'environnement Linux, 192.168.1.11:80, 192.168.1.12:80 et 192.168.1.13:80. Le nom de domaine du site Web est www.helloworld.com et l'adresse IP publique est 192.168.1.11. Déployez nginx sur le serveur où se trouve l'adresse IP publique et équilibrez la charge de toutes les demandes.

La configuration nginx.conf est la suivante:

http {
    
    
     #设定mime类型,类型由mime.type文件定义
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    access_log    /var/log/nginx/access.log;

    #设定负载均衡的服务器列表
    upstream load_balance_server {
    
    
        #weigth参数表示权值,权值越高被分配到的几率越大
        server 192.168.1.11:80   weight=5;
        server 192.168.1.12:80   weight=1;
        server 192.168.1.13:80   weight=6;
    }

   #HTTP服务器
   server {
    
    
        #侦听80端口
        listen       80;

        #定义使用www.xx.com访问
        server_name  www.helloworld.com;

        #对所有请求进行负载均衡请求
        location / {
    
    
            root        /root;                 #定义服务器的默认网站根目录位置
            index       index.html index.htm;  #定义首页索引文件的名称
            proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表

            #以下是一些反向代理的配置(可选择性配置)
            #proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传

            client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

Le site Web a plusieurs configurations d'applications Web

Lorsqu'un site Web a de plus en plus de fonctions, certains modules avec des fonctions relativement indépendantes doivent être supprimés et maintenus indépendamment. Dans ce cas, il y aura généralement plusieurs applications Web.

Par exemple: s'il existe plusieurs sites sur www.helloworld.com

webapp, finance (finance), produit (produit), admin (centre utilisateur). La manière d'accéder à ces applications est différenciée par contexte:

www.helloworld.com/finance/
www.helloworld.com/product/
www.helloworld.com/admin/

Nous savons que le numéro de port par défaut de http est 80. Si vous démarrez ces trois applications webapp sur un serveur en même temps, toutes utilisent le port 80, ce qui n'est certainement pas possible. Par conséquent, ces trois applications doivent être liées à des numéros de port différents.

Alors, voici le problème: lorsque les utilisateurs visitent réellement le site www.helloworld.com et visitent différentes applications Web, ils ne visiteront jamais avec le numéro de port correspondant. Vous devez donc à nouveau utiliser un proxy inverse pour le traitement.

La configuration n'est pas difficile, voyons comment le faire:

http {
    
    
    #此处省略一些基本配置

    upstream product_server{
    
    
        server www.helloworld.com:8081;
    }

    upstream admin_server{
    
    
        server www.helloworld.com:8082;
    }

    upstream finance_server{
    
    
        server www.helloworld.com:8083;
    }

    server {
    
    
        #此处省略一些基本配置
        #默认指向product的server
        location / {
    
    
            proxy_pass http://product_server;
        }

        location /product/{
    
    
            proxy_pass http://product_server;
        }

        location /admin/ {
    
    
            proxy_pass http://admin_server;
        }

        location /finance/ {
    
    
            proxy_pass http://finance_server;
        }
    }
}

Configuration du proxy inverse https

Certains sites avec des exigences de sécurité élevées peuvent utiliser HTTPS (un protocole HTTP sécurisé qui utilise la norme de communication ssl).

Le protocole HTTP et les normes SSL ne sont pas populaires ici. Cependant, vous devez savoir quelques choses pour configurer https avec nginx:

Le numéro de port fixe de HTTPS est 443, ce qui est différent de la
norme SSL 80 ports HTTP , qui nécessite l’introduction d’un certificat de sécurité. Vous devez donc spécifier le certificat et sa clé correspondante dans nginx.conf. Les
autres sont fondamentalement les mêmes que proxy inverse http, mais configuré dans la partie Serveur légèrement différent.

 #HTTP服务器
  server {
    
    
      #监听443端口。443为知名端口号,主要用于HTTPS协议
      listen       443 ssl;

      #定义使用www.xx.com访问
      server_name  www.helloworld.com;

      #ssl证书文件位置(常见证书文件格式为:crt/pem)
      ssl_certificate      cert.pem;
      #ssl证书key位置
      ssl_certificate_key  cert.key;

      #ssl配置参数(选择性配置)
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
      #数字签名,此处使用MD5
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;

      location / {
    
    
          root   /root;
          index  index.html index.htm;
      }
  }

Configuration de site statique

Parfois, nous devons configurer des sites statiques (c'est-à-dire des fichiers html et un tas de ressources statiques).

Par exemple: si toutes les ressources statiques sont placées dans le répertoire / app / dist, il suffit de spécifier la page d'accueil et l'hôte de ce site dans nginx.conf.

La configuration est la suivante:

worker_processes  1;

events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    gzip on;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
    gzip_vary on;

    server {
    
    
        listen       80;
        server_name  static.zp.cn;

        location / {
    
    
            root /app/dist;
            index index.html;
            #转发任何请求到 index.html
        }
    }
}

Ensuite, ajoutez HOST:
127.0.0.1 static.zp.cn
À ce stade , visitez static.zp.cn dans le navigateur local, vous pouvez visiter le site statique.

Construire un serveur de fichiers

Parfois, l'équipe a besoin d'archiver certaines données ou informations, alors le serveur de fichiers est essentiel. L'utilisation de Nginx permet de créer rapidement et facilement un service de fichiers simple.

Principaux points de configuration dans Nginx:

Activez l'autoindex pour afficher le répertoire, qui est désactivé par défaut.
Activez autoindex_exact_size pour afficher la taille du fichier.
Activez autoindex_localtime pour afficher l'heure de modification du fichier.
root est utilisé pour définir le chemin racine ouvert pour le service de fichiers.
Charset est défini sur charset utf-8, gbk; pour éviter le problème des caractères chinois déformés (
après avoir défini sous le serveur Windows , les caractères déformés sont toujours là, et je n'ai pas trouvé de solution pour le moment).
La configuration la plus simplifiée est la suivante:

autoindex on;# 显示目录
autoindex_exact_size on;# 显示文件大小
autoindex_localtime on;# 显示文件时间

server {
    
    
    charset      utf-8,gbk; # windows 服务器下设置后,依然乱码,暂时无解
    listen       9050 default_server;
    listen       [::]:9050 default_server;
    server_name  _;
    root         /share/fs;
}

Solution inter-domaines

Dans le développement du domaine Web, le mode de séparation front-end et back-end est souvent utilisé. Dans ce mode, le frontal et le back-end sont des applications Web distinctes. Par exemple, le back-end est un programme Java et le front-end est une application React ou Vue.

Des applications Web distinctes sont vouées à rencontrer des problèmes inter-domaines lors de l'accès les unes aux autres. Il existe généralement deux façons de résoudre les problèmes interdomaines:

1 、 CORS

Définissez l'en-tête de réponse HTTP sur le serveur principal et ajoutez le nom de domaine auquel vous devez accéder dans Access-Control-Allow-Origin.

2 、 jsonp

Selon la demande, le serveur principal construit des données json et les renvoie. Le serveur frontal utilise jsonp pour traverser les domaines.
Ces deux idées ne seront pas abordées dans cet article.

Il convient de noter que nginx fournit également une solution inter-domaines basée sur la première idée.

Exemple: le site Web www.helloworld.com est composé d'une application frontale et d'une application back-end. Le numéro de port frontal est 9000 et le numéro de port principal est 8080.

Si le front-end et le back-end utilisent http pour interagir, la demande sera rejetée en raison de problèmes inter-domaines. Voyons comment nginx le résout:

Tout d'abord, définissez cors dans le fichier enable-cors.conf:

# allow origin list
set $ACAO '*';

# set single origin
if ($http_origin ~* (www.helloworld.com)$) {
    
    
  set $ACAO $http_origin;
}

if ($cors = "trueget") {
    
    
    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

if ($request_method = 'OPTIONS') {
    
    
  set $cors "${cors}options";
}

if ($request_method = 'GET') {
    
    
  set $cors "${cors}get";
}

if ($request_method = 'POST') {
    
    
  set $cors "${cors}post";
}

Ensuite, incluez enable-cors.conf dans votre serveur pour introduire la configuration interdomaine:

# ----------------------------------------------------
# 此文件为项目 nginx 配置片段
# 可以直接在 nginx config 中 include(推荐)
# 或者 copy 到现有 nginx 中,自行配置
# www.helloworld.com 域名需配合 dns hosts 进行配置
# 其中,api 开启了 cors,需配合本目录下另一份配置文件
# ----------------------------------------------------
upstream front_server{
    
    
  server www.helloworld.com:9000;
}
upstream api_server{
    
    
  server www.helloworld.com:8080;
}

server {
    
    
  listen       80;
  server_name  www.helloworld.com;

  location ~ ^/api/ {
    
    
    include enable-cors.conf;
    proxy_pass http://api_server;
    rewrite "^/api/(.*)$" /$1 break;
  }

  location ~ ^/ {
    
    
    proxy_pass http://front_server;
  }
}

À ce stade, il est terminé.

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/liuxingjiaoyu/article/details/112346773
conseillé
Classement