Vorwort

Nginx wurde von Igor Sysoev für rambler.ru entworfen und entwickelt, die am zweithäufigsten besuchte Website in Russland. Seit seiner Veröffentlichung im Jahr 2004 ist es mit der Kraft von Open Source ausgereift und vollständig geworden.

Nginx ist funktionsreich; es kann als HTTP-Server, Reverse-Proxy-Server oder Mailserver verwendet werden. Es unterstützt FastCGI, SSL, Virtual Host, URL Rewrite, Gzip und weitere Funktionen. Außerdem unterstützt es viele Erweiterungen von Drittanbieter-Modulen.

Die Stabilität, der Funktionsumfang, die Beispielkonfigurationsdateien und der geringe Systemressourcenverbrauch von Nginx haben es ermöglicht, von hinten aufzuholen. Es hat eine Nutzungsrate von 12.18% unter den weltweit aktiven Websites, etwa 22.2 Millionen Websites.

Wir haben genug geprahlt. Wenn du immer noch nicht zufrieden bist, findest du solches Lob überall in Baidu Baike oder in einigen Büchern.


Gängige Nginx-Funktionen

1. HTTP-Proxy, Reverse-Proxy: eine der am häufigsten verwendeten Funktionen eines Webservers, insbesondere Reverse-Proxy.

Hier stelle ich zwei Diagramme bereit, um Forward-Proxy und Reverse-Proxy zu veranschaulichen. Für spezifische Details kannst du in Referenzmaterialien nachschlagen.

Wenn Nginx als Reverse-Proxy fungiert, bietet es stabile Leistung und eine flexible Weiterleitungskonfiguration. Nginx kann je nach unterschiedlichen Übereinstimmungen mit regulären Ausdrücken verschiedene Weiterleitungsstrategien anwenden – zum Beispiel gehen Anfragen, die mit Bilddateien enden, an einen Dateiserver, dynamische Seiten gehen an einen Webserver. Solange dein Regex korrekt ist und du die entsprechenden Serverlösungen hast, kannst du tun, was du willst. Nginx führt außerdem Fehlerseiten-Weiterleitungen und Ausnahmebeurteilung für zurückgegebene Ergebnisse durch. Wenn ein verteilter Server eine Ausnahme hat, kann es die Anfrage an einen anderen Server weiterleiten und den fehlerhaften Server automatisch entfernen.


2. Lastverteilung

Nginx bietet zwei Arten von Lastverteilungsstrategien: integrierte Strategien und erweiterte Strategien. Die integrierten Strategien sind Round Robin, gewichtetes Round Robin und IP-Hash. Erweiterte Strategien sind grenzenlos fantasievoll – es gibt nichts, was dir einfällt, das es nicht kann. Du kannst alle Lastverteilungsalgorithmen heranziehen und sie nacheinander implementieren.

Hier sind drei Diagramme, um die Implementierung dieser drei Lastverteilungsalgorithmen zu verstehen.

Der IP-Hash-Algorithmus führt eine Hash-Operation auf der IP von Client-Anfragen durch und leitet dann basierend auf dem Hash-Ergebnis Anfragen derselben Client-IP an denselben Server zur Verarbeitung weiter, was das Problem nicht gemeinsam genutzter Sitzungen lösen kann.


3. Web-Caching

Nginx kann verschiedene Caching-Richtlinien auf verschiedene Dateien anwenden, mit flexibler Konfiguration, und unterstützt FastCGI_Cache, das hauptsächlich zum Caching dynamischer FastCGI-Programme verwendet wird. Zusammen mit dem Drittanbieter ngx_cache_purge kann es das Hinzufügen und Löschen für den angegebenen URL-Cache-Inhalt verwalten.


4. Nginx-bezogene Adressen

Quellcode:https://trac.nginx.org/nginx/browser

Offizielle Website:http://www.nginx.org/


Struktur der Nginx-Konfigurationsdatei

Wenn Sie Ihre Installationsdateien heruntergeladen haben, können Sie genauso gut die Datei nginx.conf im Ordner conf öffnen. Hier ist die grundlegende Konfiguration des Nginx-Servers, einschließlich der Standardkonfiguration, gespeichert.

Das Kommentarsymbol in nginx.conf ist:#

Die standardmäßige Nginx-Konfigurationsdatei nginx.conf sieht wie folgt aus:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

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

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

}

Nginx-Dateistruktur

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}
  • 1, Globaler Block: Konfiguriert Anweisungen, die sich global auf Nginx auswirken. Im Allgemeinen umfasst er die Benutzergruppe, die den Nginx-Server ausführt, den PID-Speicherpfad für Nginx-Prozesse, den Log-Speicherpfad, Konfigurationsdatei-Includes, die Anzahl der erlaubten Worker-Prozesse usw.
  • 2, events-Block: Konfiguriert Anweisungen, die den Nginx-Server oder seine Netzwerkverbindungen mit Benutzern betreffen. Umfasst die maximale Anzahl von Verbindungen pro Prozess, welches ereignisgesteuerte Modell zur Behandlung von Verbindungsanfragen gewählt werden soll, ob das gleichzeitige Annehmen mehrerer Netzwerkverbindungen erlaubt ist, die Serialisierung mehrerer Netzwerkverbindungen aktiviert wird usw.
  • 3, http-Block: Kann mehrere Server-Blöcke verschachteln und konfiguriert die meisten Funktionen wie Proxy, Cache, Protokolldefinitionen sowie Konfigurationen von Drittanbietermodulen. Zum Beispiel Datei-Includes, MIME-Typ-Definitionen, benutzerdefinierte Logs, ob sendfile zum Übertragen von Dateien verwendet werden soll, Verbindungszeitüberschreitung, Anzahl der Anfragen pro Verbindung usw.
  • 4, Server-Block: Konfiguriert Parameter im Zusammenhang mit virtuellen Hosts. In einem http-Block können mehrere Server-Blöcke vorhanden sein.
  • 5, location-Block: Konfiguriert das Routing von Anfragen und die Behandlung verschiedener Seiten.

Nachfolgend sehen Sie eine Konfigurationsdatei zum Verständnis.

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody.
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    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;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    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  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

Das Obige ist die grundlegende Konfiguration von Nginx. Zu beachtende Punkte sind wie folgt:

1. Einige häufige Konfigurationselemente:

  • 1. $remote_addr und $http_x_forwarded_for werden verwendet, um die IP-Adresse des Clients aufzuzeichnen;
  • 2. $remote_user: wird verwendet, um den Benutzernamen des Clients aufzuzeichnen;
  • 3. $time_local: wird verwendet, um die Zugriffszeit und Zeitzone aufzuzeichnen;
  • 4. $request: wird verwendet, um die angeforderte URL und das HTTP-Protokoll aufzuzeichnen;
  • 5. $status: wird verwendet, um den Anforderungsstatus aufzuzeichnen; Erfolg ist 200;
  • 6. $body_bytes_sent: zeichnet die Größe des an den Client gesendeten Datei-Body-Inhalts auf;
  • 7. $http_referer: wird verwendet, um aufzuzeichnen, von welchem Seitenlink der Besuch kam;
  • 8. $http_user_agent: zeichnet relevante Informationen über den Client-Browser auf;

2. Thundering-Herd-Phänomen: Wenn eine Netzwerkverbindung eintrifft, werden mehrere schlafende Prozesse gleichzeitig aufgeweckt, aber nur ein Prozess kann die Verbindung erhalten, was die Systemleistung beeinträchtigt.

3. Jede Direktive muss mit einem Semikolon enden.

Adresse des Originalartikels: https://www.cnblogs.com/knowledgesea/p/5175711.html