Nginx 原理解析和配置摘要

前言

Nginx 做爲高性能的 http 服務器,知名度沒必要多言,類似產品中無出其右。本篇隨筆記錄我認爲較爲重要的原理和配置。
html

1. 原理解析

1.1 結構


以上是 Nginx 的結構圖,其包含一個 master 和 n 個 worker,master_processes 用於外部通訊和統一管理其下 worker_processes ,所以能夠作到重啓時不中斷服務。另外,Nginx 採用了異步非阻塞的方式來處理請求,避免了 cpu 閒置,這是其高性能的主要起因。nginx

1.2 模塊

Nginx 從功能上可分爲如下三大類:web

  • Handlers(處理器模塊):用於直接處理請求,並進行輸出內容和修改 headers 信息等操做,通常只能有一個。後端

  • Filters(過濾器模塊):主要對處理器模塊輸出的內容進行修改操做,而後輸出。服務器

  • Proxies(代理模塊):主要是 upstream 模塊,與後端一些服務好比 FastCGI 等進行交互,實現服務代理和負載均衡等功能。app

1.3 工做流程


上圖是 Nginx 常規的 HTTP 請求和響應過程,當接到請求時,經過查找配置文件將其映射到一個 location block,並按照其中所配置的各個指令,啓動不一樣的模塊去完成工做。一般一個 location 中的指令會涉及一個
handler 模塊和多個 filter 模塊。另外,Nginx 的模塊屬於靜態編譯方式,在啓動後自動加載。負載均衡

2. 配置摘要

Nginx 對於我來講最常規的運用就是靜態資源處理和反向代理,所以我只記錄這些相關的配置。Nginx 配置通常分爲三部分:global、events 和 http,通用基本配置通常保存在 /etc/nginx/nginx.conf 文件中,具體的服務配置通常保存在 /etc/nginx/conf.d/ 文件夾下。異步

2.1 Global 和 Events 配置

通常在 nginx.conf 配置文件的開頭位置設置一些與具體業務無關的參數,以下:tcp

user  nginx; # 用戶或者用戶組
worker_processes  2; # worker 進程數,通常與服務器的虛擬內核數相等

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

Events 中須要自行調整的就一個必要參數:worker_connections,這個數值涉及到最大鏈接數的計算,即:性能

# nginx 做爲 http 服務器的時候:
max_clients = worker_processes * worker_connections

# nginx做爲反向代理服務器的時候:
max_clients = worker_processes * worker_connections/4

固然這個最大鏈接數還與系統可打開的最大文件數有關,max_clients 必需要小於 file-max(cat /proc/sys/fs/file-max),個人配置:

events {
    worker_connections  2048;
}

2.2 http 服務器配置

2.2.1 全局配置

通常狀況下虛擬主機之外的配置保持默認就好了,如:gzip 壓縮,ip 獲取等通常都交給雲服務器的負載均衡處理了,寫一下默認值吧:

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

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

2.2.2 server 虛擬主機配置

真正的與業務相關的配置都在這個小節,順着流程來說吧。如今不管是公司站仍是我的站都應該普及了 https 了吧(運營商的 http 劫持實在太流氓了,特別是手機端的 web,再強調一遍,流氓,流氓...),這裏面涉及到一個 https 強制跳轉問題,可讓負載均衡的 80 端口來監聽服務器的 81 端口進行重定向:

server {
    listen   81;
    return   301 https://$host$request_uri;
}

若是是靜態網頁相關的配置,能夠參考default.conf

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/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   /usr/share/nginx/html;
    }
}

Nginx 更多的狀況是用做反向代理:

server
{
    listen 80;
    server_name x.youclk.com;
    location / {
        proxy_pass http://x;
        # Proxy Settings
        # proxy_redirect     off;
        # proxy_set_header   Host             $host;
        # proxy_set_header   X-Real-IP        $remote_addr;
        # proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

server
{
    listen 80;
    server_name y.youclk.com;
    location / {
        proxy_pass http://y;
    }
}

3. 命令摘要

沒啥好說的,不作特殊用途的話如下命令可以知足操做了:

service nginx {start|stop|status|restart|reload|configtest}

結語

本篇隨筆能夠說是 Nginx 的一些基本摘要,使用和原理方面都沒有深刻探究,後續若是使用到更高級功能或者有新的應用場景,再來繼續補充內容。


個人公衆號《有刻》,咱們共同成長!

相關文章
相關標籤/搜索