1. 程式人生 > >學習nginx(三):nginx.conf配置

學習nginx(三):nginx.conf配置

1.基本配置(預設配置):

#user  nobody;          配置nginx worker程序所屬使用者及使用者組,如果沒有寫組名,則預設組名和使用者名稱一致,預設使用者為nobody
worker_processes  1;    配置nginx worker程序數量,一般和機器CPU數量一致

以下是錯誤日誌配置,logs/error.log是位置,notice、info是日誌級別,該配置可以配置到任意上下文中
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
以下是pid檔案配置,pid檔案記錄了master程序的PID
#pid        logs/nginx.pid;

以下是events上下文,記錄了網路事件相關配置
events {
    以下配置了每個worker能處理的連線數,注意不能超過作業系統最大限制
    nginx實際處理的連線數為 worker_processes*worker_connections 
    worker_connections  1024;
}

以下是http上下文,記錄了http事件相關配置
http {
    include       mime.types;   引入mime.types檔案內的配置
    default_type  application/octet-stream;   配置預設MIME型別
    
    以下配置是配置日誌格式
    #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;    是否允許呼叫sendfile函式
    #tcp_nopush     on;    是否允許TCP_NOPUSH型別的socket請求

    keepalive_timeout  65;   這兩條是長連線超時時間配置

    #gzip  on;      是否開啟gzip壓縮

    以下是server上下文,用於配置虛擬主機
    server {
        listen       80;                 監聽的埠,也可以配置為域名、檔案路徑等,可以同時監聽多個物件
        server_name  localhost;          主機名

        #charset koi8-r;                 編碼

        #access_log  logs/host.access.log  main;
        
        location上下文,用來配置特定uri的訪問規則,這裡的uri是根路徑,支援正則表示式
        location / {
            #root代表請求對映到哪個路徑,index代表頁面配置
            root   html;
            index  index.html index.htm;
        }
        
        錯誤頁面配置
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    HTTPS相關配置
    # 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的上下文主要有:

  • main:最外層,不像其它上下文需要顯式寫出名稱和大括號,主要是nginx的系統配置
  • events:網路處理相關配置
  • http:http請求配置
    • upstream:反向代理配置,在http中
  • mail:smtp/imap/pop3請求配置
    • server:在http、mail之中,定義虛擬主機
      • location:server之中,定義uri配置

各上下文下面的配置是由各個模組定義的,非常複雜,請查閱官網文件或者原始碼

例如http上下文的listen配置,官網顯示其定義在ngx_http_core_module模組,去nginx原始碼的src/http/ngx_http_core_module.c檔案,就能找到相關定義:

……
static ngx_command_t ngx_http_core_commands[] = {
……
{ ngx_string("listen"),
      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
      ngx_http_core_listen,
      NGX_HTTP_SRV_CONF_OFFSET,
      0,
      NULL },
……

ngx_command_t實際就是ngx_command_s結構體(ngx_command_t在ngx_core.h中使用typedef定義,ngx_command_s在ngx_conf_file.c中定義),具體結構如下:

struct ngx_command_s {
    ngx_str_t             name;
    ngx_uint_t            type;
    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
    ngx_uint_t            conf;
    ngx_uint_t            offset;
    void                 *post;
};

2.反向代理配置&重定向配置(以跳轉百度為例)

#效果:訪問伺服器自動跳轉百度首頁
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    #反向代理配置,這裡只配置了一項,如果有多個配置,就可以使用負載均衡
    upstream baidu {
        server www.baidu.com;
    }
    server {
        listen       80;
        server_name  localhost;
        #代理配置,主要是做跳轉
        location / {
            proxy_pass http://baidu;
            proxy_set_header Host www.baidu.com;   #這裡不能寫$host,會出現403 forbidden錯誤
            proxy_redirect     off;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_max_temp_file_size 0;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

}

主要是加了upstream上下文,修改了 location / 上下文

如果這樣修改效果一樣(原理不一樣):

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    
    server {
        listen       80;
        server_name  localhost;
        rewrite ^/ http://www.baidu.com;
        index index.html;
    }

}

rewrite配置是把指定uri的請求進行重定向,這裡是將根目錄的請求重定向到百度首頁。

如果