小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

nginx作為web服務(wù)以及nginx.conf詳解

 一本正經(jīng)地胡鬧 2019-07-25

轉(zhuǎn)載請(qǐng)務(wù)必在文章最開頭標(biāo)明原文地址
本文原創(chuàng)地址:博客園駿馬金龍https://www.cnblogs.com/f-ck-need-u/p/7683027.html

強(qiáng)烈譴責(zé)大量盜文狗:波波說運(yùn)維,說不定你們的文章也已被抄襲

 

Nginx系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html


1.nginx簡介

nginx是一個(gè)優(yōu)秀的web服務(wù)程序、反向代理程序。它采用非阻塞異步的套接字,使用epoll方式實(shí)現(xiàn)事件驅(qū)動(dòng),同時(shí)采用一個(gè)master+N個(gè)worker進(jìn)程(默認(rèn))的方式處理請(qǐng)求,這種架構(gòu)使得它在并發(fā)的處理能力上極其出色,可以比較輕松地解決C10K問題。

2.nginx處理請(qǐng)求的過程簡單說明

master進(jìn)程用于管理worker進(jìn)程,例如接收外界信號(hào)、向worker進(jìn)程發(fā)送信號(hào)、銷毀worker進(jìn)程、啟動(dòng)worker進(jìn)程等等。

nginx之所以性能良好,完全是由它的架構(gòu)決定的。每個(gè)worker進(jìn)程是業(yè)務(wù)處理進(jìn)程,負(fù)責(zé)監(jiān)聽套接字、處理請(qǐng)求、響應(yīng)請(qǐng)求、代理請(qǐng)求至后端服務(wù)器等。

作為web server處理靜態(tài)資源時(shí)每個(gè)worker進(jìn)程的大致流程:

(1).監(jiān)聽套接字。
(2).與客戶端建立連接。
(3).處理監(jiān)聽到的連接請(qǐng)求(加載靜態(tài)文件)。
(4).響應(yīng)數(shù)據(jù)。
(5).斷開連接。

這幾個(gè)過程是每個(gè)web server都具備的能力,但對(duì)于nginx來說,由于它的異步非阻塞,每個(gè)過程都不會(huì)阻塞(有些小過程必須阻塞的時(shí)候還是會(huì)阻塞),使得并發(fā)處理能力很好。

從監(jiān)聽套接字開始說。每個(gè)worker進(jìn)程都是平等的,它們都可以去監(jiān)聽套接字,正常情況下不可避免地會(huì)造成爭搶和"驚群問題",而nginx采用"爭搶"accept互斥鎖的方式,只有持有accept互斥鎖的worker進(jìn)程才有資格將連接請(qǐng)求接到自己的隊(duì)列中并完成TCP連接的建立。但每個(gè)進(jìn)程是相互獨(dú)立而平等的,誰有資格去"爭搶"互斥鎖且有更大幾率爭搶成功?只要worker進(jìn)程當(dāng)前建立的連接數(shù)小于worker_connections指令指定的值(實(shí)際上源碼中設(shè)置的是該值的7/8),就允許爭搶互斥鎖,因?yàn)檫B接數(shù)超過了該值的7/8表示已經(jīng)非常繁忙。除了繁忙程度限制資格,還有epoll_wait的timeout的指標(biāo),等待越久的worker進(jìn)程爭搶能力越強(qiáng)。總之,在某一時(shí)刻,一定只有一個(gè)worker進(jìn)程監(jiān)聽并accept新的連接請(qǐng)求。

當(dāng)已經(jīng)監(jiān)聽到連接請(qǐng)求時(shí),worker進(jìn)程與它進(jìn)行三次握手,并最終accpet到自己的內(nèi)存池中,并和客戶端交互數(shù)據(jù),處理客戶端發(fā)送的http請(qǐng)求并響應(yīng)數(shù)據(jù)給客戶端。但是,nginx的高效就在于它的異步非阻塞,無論是在TCP連接進(jìn)入ESTABLISHED之前,還是等待客戶端發(fā)送請(qǐng)求,亦或者是等待加載本地靜態(tài)資源的I/O,以及響應(yīng)數(shù)據(jù)給客戶端的任意一個(gè)過程中,nginx都是非阻塞的,在任意等待發(fā)生時(shí)都可以去處理其它事情。當(dāng)?shù)却哪硞€(gè)資源已經(jīng)準(zhǔn)備成功時(shí)將產(chǎn)生事件通知worker進(jìn)程,worker進(jìn)程可隨后去處理。在此過程中,由于worker進(jìn)程綁定在一個(gè)CPU核心上(推薦如此做),所有的連接都放在內(nèi)存池中,這使得上下文切換時(shí)是極其輕量的,極大地減輕了CPU消耗。從理論上來說,當(dāng)每個(gè)worker綁定了一個(gè)CPU核心時(shí),它的并發(fā)處理能力主要依賴于內(nèi)存的大小。

實(shí)際上apache httpd的event MPM也是異步非阻塞的,也可以采用epoll,但它采用的是多線程方式,雖然異步,但它的異步似乎不體現(xiàn)在并發(fā)能力上,而僅僅只是一些具有特殊狀態(tài)的連接(如長連接)的異步處理,在處理過程中cpu還是不斷地需要在各線程之間大量切換,并發(fā)能力并不比worker MPM強(qiáng)多少,相比nginx更是遠(yuǎn)遠(yuǎn)不如。

3.nginx命令

[root@xuexi nginx]# nginx -h
nginx version: nginx/1.12.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : 輸出版本號(hào)
  -V            : 輸出版本號(hào)以及編譯選項(xiàng)
  -t            : 檢查配置文件的語法
  -T            : 檢查配置文件的語法并輸出配置的內(nèi)容
  -q            : 靜默模式,不輸出任何信息
  -s signal     : 向主進(jìn)程發(fā)送信號(hào):stop, quit, reopen, reload
  -p prefix     : 設(shè)置nginx的basedir(默認(rèn)為編譯時(shí)的prefix)
  -c filename   : 指定配置文件
  -g directives : 提前設(shè)置全局指令

-V選項(xiàng)輸出編譯選項(xiàng)。

[root@xuexi nginx]# nginx -V
nginx version: nginx/1.12.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx-1.12.0 --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/subsys/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre

(1).使用默認(rèn)配置文件直接啟動(dòng)nginx和指定配置文件啟動(dòng)nginx

nginx -c /usr/local/nginx/conf/nginx.conf

(2).運(yùn)行時(shí)重載配置文件。當(dāng)nginx主進(jìn)程接收到重載配置文件的命令后,它會(huì)先檢查新配置文件語法,然后載入該配置文件到內(nèi)存中并解析。然后,主進(jìn)程fork一系列新的worker進(jìn)程,并發(fā)送QUIT信號(hào)給舊的worker進(jìn)程(graceful stop)。舊的工作進(jìn)程接收到QUIT信號(hào)后,會(huì)停止接受新的連接請(qǐng)求,并繼續(xù)處理舊的連接直到請(qǐng)求處理完成后才退出。

nginx -s reload

(3).運(yùn)行時(shí)快速關(guān)閉nginx。

nginx -s stop

(4).運(yùn)行時(shí)優(yōu)雅關(guān)閉nginx。所有的工作進(jìn)程會(huì)停止接受新的連接,并繼續(xù)服務(wù)舊的連接請(qǐng)求直到所有的請(qǐng)求完成后才退出。

nginx -s quit

(5).運(yùn)行時(shí)重新打開日志文件。

ngnix -s reopen

4.nginx模塊及http功能速覽

Nginx的代碼由一個(gè)核心和一系列的模塊組成。

核心(core functionality)主要用于提供全局應(yīng)用的基本功能,創(chuàng)建必要的運(yùn)行時(shí)環(huán)境及確保不同模塊之間平滑地進(jìn)行交互等,對(duì)應(yīng)于配置文件的main段和event段。核心涉及的指令官方文檔:http:///en/docs/ngx_core_module.html。

還有很多功能都通過模塊實(shí)現(xiàn),nginx是高度模塊化程序。如web相關(guān)的功能模塊有"ngx_http_*_module",和mail相關(guān)的功能模塊有"ngx_mail_*_module",和tcp代理、負(fù)載均衡相關(guān)的功能模塊有"ngx_stream_*_module",這些類別的模塊中又分為很多類別的模塊,如http類別的模塊中有基本核心模塊、事件類模塊、緩存類模塊、SSL相關(guān)模塊、負(fù)載均衡類模塊upstream等等。

以下是http功能模塊類中常見的模塊。

http類模塊名模塊功能說明
ngx_http_core_module http核心模塊,對(duì)應(yīng)配置文件中的http段,包含很多指令,如location指令
ngx_http_access_module 訪問控制模塊,控制網(wǎng)站用戶對(duì)nginx的訪問,對(duì)應(yīng)于配置文件中的allow和deny等指令
ngx_http_auth_basic_module 通過用戶名和密碼認(rèn)證的訪問控制,如訪問站點(diǎn)時(shí)需要數(shù)據(jù)用戶名和密碼,指令包括auth_basic和auth_basic_user_file
ngx_http_charset_module 設(shè)置網(wǎng)頁顯示字符集。指令之一為charset,如charset utf-8
ngx_http_fastcgi_module fastcgi模塊,和動(dòng)態(tài)應(yīng)用相關(guān)。該模塊下有非常多的子模塊。
ngx_http_flv_module 支持flv視頻流的模塊,如邊下邊播
ngx_http_mp4_module 同flv模塊
ngx_http_gzip_module 壓縮模塊,用來壓縮nginx返回的響應(yīng)報(bào)文。一般只壓縮純文本內(nèi)容,因?yàn)閴嚎s比例非常大,而圖片等不會(huì)去壓縮
ngx_http_image_filter_module 和圖片裁剪、縮略圖相關(guān)模塊,需要安裝gd-devel才能編譯該模塊
ngx_http_index_module 定義將要被作為默認(rèn)主頁的文件,對(duì)應(yīng)指令為index。"index index.html,index.php"
ngx_http_autoindex_module 當(dāng)index指令指定的主頁文件不存在時(shí),交給autoindex指令,將自動(dòng)列出目錄中的文件autoindex {on/off}  
ngx_http_log_module 和訪問日志相關(guān)的模塊,指令包括log_format和access_log
ngx_http_memcached_module 和memcached相關(guān)的模塊,用于從memcached服務(wù)器中獲取相應(yīng)響應(yīng)數(shù)據(jù)
ngx_http_proxy_module 和代理相關(guān),允許傳送請(qǐng)求到其它服務(wù)器
ngx_http_realip_module 當(dāng)nginx在反向代理的后端提供服務(wù)時(shí),獲取到真正的客戶端地址,否則獲取的是反向代理的IP地址
ngx_http_referer_module 實(shí)現(xiàn)防盜鏈功能的模塊
ngx_http_rewrite_module 和URL地址重寫相關(guān)的模塊,需要安裝pcre-devel才能編譯安裝該模塊
ngx_http_scgi_module simple cgi,是cgi的替代品,和fastcgi類似,但更簡單
ngx_http_ssl_module 提供ssl功能的模塊,即實(shí)現(xiàn)HTTPS
ngx_http_stub_status_module 獲取nginx運(yùn)行狀態(tài)信息
ngx_http_upstream 和負(fù)載均衡相關(guān)模塊

這些模塊共同組成了nginx的http功能。

5.nginx配置文件簡單說明

nginx的配置文件有很多個(gè),如下。其中主配置文件為nginx.conf,其他配置文件在需要的時(shí)候使用include指令將其包含到主配置文件中。

[root@xuexi ~]# ls /usr/local/nginx/conf/
fastcgi.conf  fastcgi_params  koi-utf  mime.types  nginx.conf  scgi_params  uwsgi_params  win-utf
fastcgi.conf.default  fastcgi_params.default  koi-win  mime.types.default  nginx.conf.default  scgi_params.default  uwsgi_params.default

其中".default"后綴的是對(duì)應(yīng)前綴配置文件的備份配置文件,".params"是對(duì)應(yīng)前綴的參數(shù)文件。如fastcgi.conf是和fastcgi相關(guān)參數(shù)的配置文件,fastcgi.params是fastcgi的參數(shù)文件,fastcgi.conf.default是fastcgi.conf的備份文件。

關(guān)于主配置文件nginx.conf,由于Nginx高度模塊化,所以它是分段配置的,核心模塊為core,對(duì)應(yīng)配置文件中的Main和Events段。此外還有其他一些模塊。配置文件中每一個(gè)指令必須以分號(hào)";"結(jié)束,否則語法錯(cuò)誤。

5.1 main和events段

Main用于配置錯(cuò)誤日志、進(jìn)程及權(quán)限等相關(guān)的參數(shù),Events用于配置IO模型,如epoll、kqueue、select或poll等,它們是必備模塊。如下配置:

#user  nobody;        # worker進(jìn)程身份,默認(rèn)使用編譯時(shí)指定值.語法為"user user_name [group_name]"
worker_processes  4;  # worker進(jìn)程數(shù)量,該指令值依賴因素較多,例如是否CPU密集型、是否IO密集型。
                      # 在初始時(shí)設(shè)置為cpu的總核數(shù)是一個(gè)不錯(cuò)的選擇。

#error_log logs/error.log;         # 錯(cuò)誤日志文件,禁用錯(cuò)誤日志"error_log /dev/null LEVEL;"
#error_log logs/error.log notice;  # 級(jí)別:debug|info|notice|warn|error|crit|alert|emerg,默認(rèn)為error
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
#lock_file  logs/nginx.lock;

events {
    worker_connections  1024;   # 每個(gè)worker進(jìn)程的最大連接數(shù)
    multi_accept on;            # 是否一次性將監(jiān)聽到的連接全接收進(jìn)來,默認(rèn)為off,關(guān)閉時(shí)一次接收一條連接
    accept_mutex on             # 默認(rèn)為on,開啟時(shí)表示以串行方式接入新連接,否則將通報(bào)給所有worker。
                                # 這可能會(huì)浪費(fèi)資源并產(chǎn)生不可預(yù)計(jì)的后果,例如驚群問題
}

如果某個(gè)文件采用了相對(duì)路徑,則其相對(duì)的基準(zhǔn)為basedir。例如編譯時(shí)--prefix指定為/usr/local/nginx,則指定pid為logs/nginx.pid時(shí),其實(shí)際路徑為/usr/local/nginx/logs/nginx.pid。

worker_processes的值和work_connections的值決定了最大并發(fā)數(shù)量。例如上面的配置中,每個(gè)worker進(jìn)程最大允許1024個(gè)連接,配置了4個(gè)worker進(jìn)程,所以并發(fā)數(shù)量為1024*4=4096。但在反向代理場景中計(jì)算方法不同,因?yàn)閚ginx既要維持和客戶端的連接,又要維持和后端服務(wù)器的連接,因此處理一次連接要占用2個(gè)連接,所以最大并發(fā)數(shù)計(jì)算方式為:worker_processes*worker_connections/2。此外還需注意,除了和客戶端的連接、與后端服務(wù)器的連接,nginx可能還會(huì)打開其他的連接,這些都會(huì)占用文件描述符,從而影響并發(fā)數(shù)量的計(jì)算。最后還需注意,最大并發(fā)數(shù)量還受"允許打開的最大文件描述符數(shù)量"限制,可以使用"worker_rlimit_nofile"指令修改或直接修改操作系統(tǒng)的對(duì)應(yīng)內(nèi)核參數(shù)。

可以在main段使用worker_cpu_affinity指令綁定CPU核心。nginx通過位數(shù)識(shí)別CPU核心以及核心數(shù),指定位數(shù)上占位符為1表示使用該核心,占位符為0表示不使用該核心。例如2核cpu的位數(shù)分別為01和10,4核的位數(shù)分別為1000,0100,0010以及0001,同理8核和16核。在結(jié)合worker_processes指令一起使用時(shí),要注意worker進(jìn)程和核心的對(duì)應(yīng)方式,例如:

# 每個(gè)worker分別對(duì)應(yīng)cpu0/cpu1/cpu2/cpu3
worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;

# 有4核心,但只有兩worker,第一個(gè)worker對(duì)應(yīng)cpu0/cpu2,第二個(gè)worker對(duì)應(yīng)cpu1/cpu3
worker_processes    2;
worker_cpu_affinity 0101 1010;

在events段,可以使用"use"指令可以指定使用哪種I/O模型,Linux上默認(rèn)是epoll,通常可以不用手動(dòng)去設(shè)置,因?yàn)閚ginx默認(rèn)會(huì)采用最佳配置。

以下是main段和events段的配置示例,大多數(shù)采用的默認(rèn)值,需要修改的大致就是worker數(shù)量、每個(gè)worker最大連接數(shù)以及進(jìn)程綁定cpu。

worker_processes  4;
events {
    worker_connections  1024;
}

5.2 http段

5.2.1 配置文件概覽

http段是由http相關(guān)模塊支持的。以下是默認(rèn)配置項(xiàng)。注意,http根段下使用相對(duì)路徑是相對(duì)conf目錄的,如"include extra/.conf"表示的是conf/extra/.conf;非根段內(nèi)的相對(duì)路徑如server段內(nèi)使用相對(duì)路徑是相對(duì)于的安裝目錄<prefix>的,例如nginx安裝在/usr/local/nginx下,當(dāng)location中的root設(shè)置為html時(shí),它表示的路徑是/usr/local/nginx/html/。

http {
    include       mime.types;    # nginx支持的媒體文件類型。相對(duì)路徑為同目錄conf下的其他文件
    default_type  application/octet-stream;      # 默認(rèn)的媒體類型

    #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;   # 只在sendfile on時(shí)有效。讓數(shù)據(jù)包擠滿到一定程度才發(fā)送出去,擠滿之前被阻塞

    #keepalive_timeout  0;   # keepalive的超時(shí)時(shí)間
    keepalive_timeout  65;

    #gzip  on;               # 是否啟用gzip壓縮響應(yīng)報(bào)文

    server {                    # 定義虛擬主機(jī)
        listen       80;        # 定義監(jiān)聽套接字
        server_name  localhost; # 定義主機(jī)名加域名,即網(wǎng)站地址

        #charset koi8-r;        # 默認(rèn)字符集

        #access_log  logs/host.access.log  main;         # 訪問日志路徑

        location / {                        # location容器,即URI的根
            root   html;                    # 站點(diǎn)根目錄,即DocumentRoot,相對(duì)路徑時(shí)為<prefix>/html
            index  index.html index.htm;    # 站點(diǎn)主頁文件
        }

        #error_page  404    /404.html;      # 出現(xiàn)404 page not fount錯(cuò)誤時(shí),使用/404.html頁響應(yīng)客戶端

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;      # 出現(xiàn)50x錯(cuò)誤時(shí),使用/50x.html頁返回給客戶端
        location = /50x.html {                        # 定義手動(dòng)輸入包含/50x.html時(shí)的location
            root   html;
        }

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

5.2.2 root指令和alias指令

root指令設(shè)置站點(diǎn)根目錄,即httpd的documentroot,但又有所不同,因?yàn)閚ginx可以在多個(gè)上下文位置處使用root指令,例如Location容器中。

如果配置如下:

location /i/ {
    root /data/w3;
}

那么nginx將使用文件/data/w3/i/top.gif響應(yīng)請(qǐng)求"/i/top.gif"。

root指令僅僅只是將匹配的URI追加在root路徑后,如果要改變URI,應(yīng)該使用alias指令,它會(huì)對(duì)URI進(jìn)行替換。例如:

location /i/ {
    alias /data/w3/images/;
}

那么nginx將使用文件/data/w3/images/top.gif響應(yīng)請(qǐng)求/i/top.gif。因此,如果alias指令的路徑最后一部分包含了URI,則最好使用root指令,而非alias指令,雖然它們都能成功響應(yīng)。

location /images/ {
    alias /data/w3/images/;
}

location /images/ {
    root /data/w3/;
}

它們都能使用相對(duì)路徑,相對(duì)的是prefix。例如編譯路徑為/usr/local/nginx,則"root html"指的是"/usr/local/nginx/html"。

與root和alias指令相關(guān)的變量為$document_root、$realpath_root。其中$document_root的值即是root指令、alias指令的值,而$realpath_root的值是對(duì)root、alias指令進(jìn)行絕對(duì)路徑換算后的值。

5.2.3 location容器

該指令對(duì)規(guī)范化后的URI進(jìn)行匹配,并對(duì)匹配的路徑封裝一系列指令。 語法:

location [ = | ~ | ~* | ^~ ] uri { ... }

其中: location /uri/ {}:表示對(duì)/uri/目錄及其子目錄下的所有文件都匹配。所以"location / {}"的匹配范圍是最大的。
location = /uri/ {}:表示只對(duì)目錄或文件進(jìn)行匹配,不對(duì)目錄中的文件和子目錄進(jìn)行匹配。所以一般只用來做文件匹配
location ~ /uri/ {}:表示區(qū)分大小寫的正則匹配。
location ~* /uri/ {}:表示不區(qū)分大小寫的正則匹配。
location ^~ /uri/ {}:表示禁用正則匹配,即精確字符串匹配,此時(shí)正則中的元字符被解釋成普通字符。

它們的匹配優(yōu)先級(jí)規(guī)則為:nginx先檢查URI的前綴路徑,在這些路徑中找到最精確匹配請(qǐng)求URI的路徑。然后nginx按在配置文件中的出現(xiàn)順序檢查正則表達(dá)式路徑,匹配上某個(gè)路徑后即停止匹配并使用該路徑的配置,否則使用最大前綴匹配的路徑的配置

使用"="前綴可以定義URI和路徑的精確匹配。如果發(fā)現(xiàn)匹配,則終止路徑查找。例如請(qǐng)求"/"很頻繁,定義"location = /"可以提高這些請(qǐng)求的處理速度,因?yàn)椴檎疫^程在第一次比較以后即結(jié)束。

以下是一個(gè)優(yōu)先級(jí)的示例。

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ { 
    [ configuration E ] 
}

請(qǐng)求"/"能匹配A和B,但最精確匹配為A。
請(qǐng)求"/index.html"的前綴"/"能匹配A和B,但A只能匹配"/"自身,因此最終匹配配置B。(前綴也能匹配E,但文件名無法匹配)
請(qǐng)求"/documents/document.html"的前綴能匹配B和C,但C更精確,因此匹配配置C。(前綴也能匹配E,但文件名無法匹配)
請(qǐng)求"/images/1.gif"的前綴能匹配B、D和E,且D和E都是最長路徑匹配,但^~優(yōu)先級(jí)更高,因此匹配配置D。
請(qǐng)求"/documents/1.jpg"的前綴能匹配B、C,同樣也能匹配E,且E比B的匹配更精確,因此最終匹配配置E。

大致可以將規(guī)則簡化為如下優(yōu)先級(jí):

(location = uri ) > (location ^~ uri) > (location *~|~ uri) > (location uri)

等號(hào)優(yōu)先級(jí)最高,非正則匹配次之,再之后是正則匹配,它們之間有位置的先后順序,優(yōu)先級(jí)最低的是沒有使用任何符號(hào)的匹配。

由此也可以知道,"location / {}"這種方式是一種特殊的uri匹配,無論什么uri路徑,都能往這里面裝,可以認(rèn)為它是默認(rèn)匹配,當(dāng)其它location都匹配不上時(shí)就會(huì)匹配它。

5.2.4 error_page指令

當(dāng)出現(xiàn)對(duì)應(yīng)狀態(tài)碼的錯(cuò)誤時(shí),指定返回的URI路徑。語法為:

error_page code ... [=[response]] uri;

配置文件中的error_page部分默認(rèn)為:

location / {
    root   html;
    index  index.html index.htm;
}
#error_page  404              /404.html;
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   html;
}

上面的配置文件中,假如取消了404錯(cuò)誤的error_page行注釋,當(dāng)出現(xiàn)404錯(cuò)誤時(shí),其uri為/404.html,然后會(huì)對(duì)其進(jìn)行l(wèi)ocation的匹配,由于只有"location / {}"能匹配到,所以它的目錄為<prefix>/html/,即404.html文件路徑為<prefix>/html/404.html。對(duì)于50x的error_page,其uri為"/50x.html",所以會(huì)對(duì)其進(jìn)行l(wèi)ocation匹配,發(fā)現(xiàn)可以精確匹配到"location = /50x.html {}",當(dāng)然"location / {}"也能匹配到,但是它的優(yōu)先級(jí)更低,所以當(dāng)出現(xiàn)50x錯(cuò)誤時(shí),將從<prefix>/html目錄下尋找50x.html,這里正好和"location / {}"重復(fù)了,但它們的匹配過程是不一樣的。假如改為如下配置:

location / {                         
    root   html;                     
    index  index.html index.htm;     
}
#error_page  404              /404.html;
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /www/a.com/;
}

出現(xiàn)50x錯(cuò)誤時(shí),將返回/www/a.com/50x.html文件,而不再是<prefix>/html/50x.html。

5.2.5 allow和deny

這兩個(gè)指令由ngx_http_access_module模塊提供,用于允許或限制某些IP地址的客戶端訪問。nginx中的allow和deny規(guī)則很簡單,從上向下匹配,只要匹配到就停止。例如:

allow 10.0.0.8
allow 192.168.100.0/24
deny all

允許10.0.0.8和192.168.100網(wǎng)段的訪問,其他的都拒絕。

5.2.6 add_header添加相應(yīng)首部字段

用于在響應(yīng)首部中添加字段。例如:

server {
    add_header RealPath $realpath_root;
}

將添加一個(gè)名為RealPath的字段,值為變量realpath_root的值。

[root@xuexi ~]# curl -I http://localhost/
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Tue, 17 Oct 2017 08:10:14 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 17 Oct 2017 03:20:10 GMT
Connection: keep-alive
ETag: "59e576ea-264"
RealPath: /usr/local/nginx-1.12.1/html   # 此為自定義添加字段
Accept-Ranges: bytes

5.3 虛擬主機(jī)和server_name指令

nginx使用server容器定義一個(gè)虛擬主機(jī)。在nginx中,沒有嚴(yán)格區(qū)分基于IP和基于名稱的虛擬主機(jī),它們通過listen指令和server_name指令結(jié)合起來形成不同的虛擬主機(jī)。

例如:

# 基于IP地址的虛擬主機(jī)
server {
        listen 80;
        server_name 192.168.100.25;
        location / {
                root /www/longshuai/;
                index index.html index.htm;
        }
}
server {
        listen 80;
        server_name 192.168.100.26;
        location / {
                root /www/xiaofang/;
                index index.html index.htm;
        }
}

# 基于名稱的虛擬主機(jī)
server {
        listen 80;
        server_name www.;
        location / {
                root /www/longshuai/;
                index index.html index.htm;
        }
}
server {
        listen 80;
        server_name www.xiaofang.com;
        location / {
                root /www/xiaofang/;
                index index.html index.htm;
        }
}

# 基于端口的虛擬主機(jī)
server {
        listen 80;
        server_name 192.168.100.25;
        location / {
                root /www/longshuai/;
                index index.html index.htm;
        }
}
server {
        listen 8080;
        server_name 192.168.100.25;
        location / {
                root /www/xiaofang/;
                index index.html index.htm;
        }
}

其中server_name指令可以定義多個(gè)主機(jī)名,第一個(gè)名字為虛擬主機(jī)的首要主機(jī)名。例如:

server_name  example.com   www.example.com;

主機(jī)名中可以含有星號(hào)("*"),以替代名字的開始部分或結(jié)尾部分(只能是起始或結(jié)尾,如果要實(shí)現(xiàn)中間部分的通配,可以使用正則表達(dá)式)。例如"*.example.org"不僅匹配www.example.org,也匹配www.sub.example.org。下面兩條指令是等價(jià)的。

server_name    example.com   *.example.com   www.example.*;
server_name   .example.com   www.example.*;

也可以在主機(jī)名中使用正則表達(dá)式,就是在名字前面補(bǔ)一個(gè)波浪線("~"):

server_name   www.example.com   ~^www\d+\.example\.com$;

nginx允許定義空主機(jī)名:

server {
    listen       80;
    server_name  "";
    return       444;
}

這種主機(jī)名可以讓虛擬主機(jī)處理沒有"Host"首部的請(qǐng)求,而不是讓指定"地址:端口"的默認(rèn)虛擬主機(jī)來處理,而這正是本指令的默認(rèn)設(shè)置。即使用非默認(rèn)的虛擬主機(jī)處理請(qǐng)求頭中不含"Host"字段的請(qǐng)求。一般這樣的請(qǐng)求處理方式是直接丟棄請(qǐng)求,并返回一個(gè)非標(biāo)準(zhǔn)的狀態(tài)碼來立即關(guān)閉連接,例如上面的444。

如果server塊中沒有定義server_name,nginx使用空名字作為虛擬主機(jī)名。

5.4 虛擬主機(jī)的匹配規(guī)則

通過名字查找虛擬主機(jī)時(shí),如果一個(gè)名字可以匹配多個(gè)指定的配置,比如同時(shí)匹配上通配符和正則表達(dá)式,按下面優(yōu)先級(jí),使用先匹配上的虛擬主機(jī):

  1. 確定的名稱;
  2. 最長的以星號(hào)起始的通配符名字,比如"*.example.com";
  3. 最長的以星號(hào)結(jié)束的通配符名字,比如"mail.*";
  4. 第一個(gè)匹配的正則表達(dá)式名字(按在配置文件中出現(xiàn)的順序)。

當(dāng)開始接入請(qǐng)求時(shí),(1)nginx首先判斷請(qǐng)求的套接字,即IP和端口號(hào);(2)然后在listen套接字中選擇一個(gè)能匹配名稱的虛擬主機(jī),如果沒有選出能匹配的名稱,則使用該套接字的默認(rèn)虛擬主機(jī)。默認(rèn)情況下,監(jiān)聽套接字的默認(rèn)虛擬主機(jī)為該套接字主機(jī)組中的第一個(gè)虛擬主機(jī),但可以通過listen指令的default_server屬性手動(dòng)指定。

例如下面定義了4個(gè)虛擬主機(jī):前3個(gè)都監(jiān)聽在192.168.100.1:80上,第四個(gè)監(jiān)聽在192.168.1.2:80上。

server {
    listen      192.168.100.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.100.1:80 default_server;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.100.1:80;
    server_name example.com www.example.com;
    ...
}

server {
    listen      192.168.1.2:80;
    server_name example.com www.example.com;
    ...
}

(1).從192.168.100.1:80上請(qǐng)求www.example.com,能匹配虛擬主機(jī)3,于是使用虛擬主機(jī)3的配置進(jìn)行響應(yīng);
(2).從192.168.100.1:80上請(qǐng)求www.時(shí),無法匹配任何虛擬主機(jī),于是使用默認(rèn)虛擬主機(jī)2的配置進(jìn)行響應(yīng)。如果將listen的屬性default_server去掉,則使用虛擬主機(jī)1進(jìn)行響應(yīng);
(3).從192.168.100.2:80上請(qǐng)求www.example.com時(shí),使用虛擬主機(jī)4進(jìn)行響應(yīng);
(4).從192.168.100.2:80上請(qǐng)求www.example.org時(shí),由于無法匹配該套接字上的任何主機(jī),于是使用默認(rèn)虛擬主機(jī)響應(yīng),即虛擬主機(jī)4。

5.5 stub_status指令獲取nginx狀態(tài)信息

使用ngx_http_stub_status_module模塊提供的功能可以獲取nginx運(yùn)行的狀態(tài)信息。對(duì)應(yīng)的指令只有一個(gè),即stub_status。

例如,在某一個(gè)server下加上如下配置獲取該server的狀態(tài)信息。

server {
    listen 80;
    server_name www.;
    location / {
        root /www/longshuai/;
        index index.html index.htm;
    }
    location /status {
        stub_status on;
    }
}

還可以明確指定訪問該信息不記錄日志,且提供訪問控制,不讓外界人隨意獲取信息。

location /status {
    stub_status on;
    access_log off;
    allow 192.168.100.0/24;
    deny all;
}

重載配置文件后,只需在瀏覽器中輸入"主機(jī)名/status"即可獲取信息。

Active connections: 291 
server accepts handled requests
 16630948 16630948 31070465 
Reading: 6 Writing: 179 Waiting: 106

狀態(tài)信息意義如下:

  • 第一行active connections:291表示當(dāng)前處于活動(dòng)狀態(tài)的客戶端連接數(shù),包括正處于等待狀態(tài)的連接。
  • 第四行reading數(shù)量為6,表示nginx正在讀取請(qǐng)求首部的數(shù)量,即正在從socket recv buffer中讀取數(shù)據(jù)的數(shù)量;writing數(shù)量為179表示nginx正在將響應(yīng)數(shù)據(jù)寫入socket send buffer以返回給客戶端的連接數(shù)量;waiting數(shù)量為106表示等待空閑客戶端發(fā)起請(qǐng)求的客戶端數(shù)量,包括長連接狀態(tài)的連接以及已接入但socket recv buffer還未產(chǎn)生可讀事件的連接,其值為active-reading-writing。
  • 第二行accepts的數(shù)量為16630948表示從服務(wù)啟動(dòng)開始到現(xiàn)在已經(jīng)接收進(jìn)來的總的客戶端連接數(shù);handled的數(shù)量為16630948表示從服務(wù)啟動(dòng)以來已經(jīng)處理過的連接數(shù),一般handled的值和accepts的值相等,除非作出了連接數(shù)限定;requests的數(shù)量為服務(wù)啟動(dòng)以來總的客戶端請(qǐng)求數(shù)。一個(gè)連接可以有多個(gè)請(qǐng)求,所以可以計(jì)算出平均每個(gè)連接發(fā)出多少個(gè)請(qǐng)求。
  • 以下是第二行幾個(gè)參數(shù)的官方原文:
    accepts:The total number of accepted client connections.
    handled:The total number of handled connections. Generally, the parameter value is the same as accepts unless some resource limits have been reached (for example, the worker_connections limit).
    requests:The total number of client requests.
    

6.訪問日志access_log

  1. nginx的訪問日志相關(guān)功能由ngx_http_log_module模塊提供,指令包括log_format、access_log和open_log_file_cache。
  2. nginx的日志可以先緩沖到buffer中,一定時(shí)間后再寫入到日志文件中。從buffer刷盤到本地日志文件中時(shí),可以進(jìn)行壓縮。
  3. nginx的worker進(jìn)程的運(yùn)行身份需要有日志創(chuàng)建的權(quán)限,即對(duì)日志所在目錄有寫權(quán)限。
  4. 可以在多種上下文中定義是否開啟日志以及日志的格式。最常見的三個(gè)上下文是http,server,location。
  5. open_log_file_cache指令存在的意義是為了緩存日志文件描述符。之所以提供這個(gè)指令,是因?yàn)閚ginx每次日志的寫入(從緩存中刷盤到本地日志文件中)都會(huì)打開、關(guān)閉一次日志文件。對(duì)于日志寫入極其頻繁的機(jī)器可以使用該指令緩存日志文件描述符,使得在緩存有效期內(nèi)都可以續(xù)寫到舊日志文件中。

6.1 log_format指令

log_format指定日志的格式,語法如下:log\_format name string...;。其中name指定日志格式名稱,配置文件中name名稱不能重復(fù)。

以下是默認(rèn)提供的main格式。

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

在main后面的是一堆變量,除了這些變量之外還有其他很多變量可用,但如非特殊需求,默認(rèn)的main格式就已經(jīng)夠完美了。以下是變量的意義:

$remote_addr:客戶端的地址。如果nginx提供的web服務(wù)在后端,如前面有代理服務(wù)器或負(fù)載均衡等設(shè)備時(shí),該變量只能獲取到前端的IP地址。此時(shí)要獲取到真正客戶端地址需要使用變量$http_x_forward_for,但要求前端服務(wù)器要開啟x_forward_for設(shè)置。
$http_x_forward_for:如上所述。
$remote_user:遠(yuǎn)程客戶端用戶名稱。
$time_local:記錄訪問時(shí)間和時(shí)區(qū)信息。
$request:記錄用戶訪問時(shí)的url和http協(xié)議信息。如:"GET /favicon.ico HTTP/1.1"。
$status:記錄客戶端請(qǐng)求時(shí)返回的狀態(tài)碼,如成功的狀態(tài)碼為200,page not found的狀態(tài)碼為404。
$body_bytes_sent:記錄服務(wù)器響應(yīng)給客戶端的主體大小。
$http_referer:記錄此次請(qǐng)求是從哪個(gè)鏈接過來的,需要模塊ngx_http_referer_module支持,默認(rèn)已裝,可以防止倒鏈問題。
$http_user_agent:記錄客戶端的瀏覽器信息。如使用什么瀏覽器發(fā)起的請(qǐng)求,是否是壓力測試工具在測試等。

例如,以下是默認(rèn)格式的日志信息。

192.168.100.27 - - [23/Apr/2017:23:08:56 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3"
192.168.100.27 - - [23/Apr/2017:23:08:56 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3"
192.168.100.27 - - [23/Apr/2017:23:08:56 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3"
192.168.100.27 - - [23/Apr/2017:23:08:56 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3"
192.168.100.1 - - [23/Apr/2017:23:08:56 +0800] "GET /status HTTP/1.1" 200 109 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.1 - - [23/Apr/2017:23:08:56 +0800] "GET /status HTTP/1.1" 200 109 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.1 - - [23/Apr/2017:23:08:56 +0800] "GET /status HTTP/1.1" 200 109 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.27 - - [23/Apr/2017:23:08:57 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3"
192.168.100.27 - - [23/Apr/2017:23:08:57 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3"
192.168.100.27 - - [23/Apr/2017:23:08:57 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3"

6.2 access_log指令

access_log主要用于定義使用什么格式的日志,日志存放路徑。語法如下:

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;

path指定路徑,path里可以使用變量。format指定日志格式,不寫時(shí)或者配置文件中未配置access_log指令時(shí),默認(rèn)為combined。buffer=size指定日志緩沖區(qū)大小(默認(rèn)64K),flush=time指定日志刷盤的時(shí)間,if=condition指定某些條件,gzip=level指定日志刷盤前先壓縮的壓縮級(jí)別(默認(rèn)gzip=1)。

當(dāng)指定了buffer或者gzip任意一個(gè)時(shí),都會(huì)使用buffer先緩沖日志,然后再刷盤。

例如

access_log /spool/logs/nginx-access.log gzip buffer=32k;

6.3 日志文件的分割

默認(rèn)nginx不會(huì)自動(dòng)分割日志,也不支持在配置文件中使用cronolog以及rotatelogs(apache支持,因?yàn)橹С止艿纻鬟f)。要實(shí)現(xiàn)nginx的日志分割,需要通過移動(dòng)舊日志、生成新日志來實(shí)現(xiàn)。

mv old_log new_log
# 然后
nginx -s reload
# 或者
nginx -s reopen
# 或者
kill -s USR1 master_pid

pid可以通過pid文件獲得。

kill -s USR1 $(cat /var/run/nginx/nginx.pid)

要實(shí)現(xiàn)自動(dòng)分割,需要使用腳本,并設(shè)置定時(shí)任務(wù)。

cat /usr/local/nginx/logs/cut_longhsuai.sh
#!/bin/bash

# cut the access log for www.

basedir=/usr/local/nginx
old_log_path=$basedir/logs/access.log
log_save_path=$basedir/logs
save_log_name=access_$(date -d "yesterday" +"%Y%m%d").log

[ -f "$old_log_path" ] || exit 1
/bin/mv $old_log_path $log_save_path/$save_log_name
$basedir/sbin/nginx -s reopen

再添加定時(shí)任務(wù)計(jì)劃。

chmod +x /usr/local/nginx/logs/cut_longshuai.sh

crontab -e
00 00 * * * /bin/sh /usr/local/nginx/logs/cut_longshuai.sh &>/dev/null

7.配置web身份認(rèn)證

需要輸入用戶名和密碼才能訪問站點(diǎn)的功能為web身份認(rèn)證功能。nginx中由ngx_http_auth_basic_module模塊提供該功能。指令包括auth_basic和auth_basic_user_file。這兩個(gè)指令可以在http根段、server段、location段使用。

auth_basic string | off
auth_basic_user_file path/to/user_passwd_file        # 密碼文件使用相對(duì)路徑時(shí)是相對(duì)conf目錄的

passwd_file的格式為:

user1:passwd1
user2:passwd2

需要注意的是,密碼文件不能使用明文密碼的方式。該類文件一般使用apache提供的工具h(yuǎn)tpasswd生成,該工具在httpd-tools包中,具體用法見htpasswd命令。也可以使用openssl passwd生成相關(guān)密碼然后復(fù)制到密碼文件中。以下是一個(gè)示例:

server {
    listen 80;
    server_name www.  www1.;
    location / {
        root /www/longshuai/;
        index index.html index.htm;
        auth_basic "Auth your name";
        auth_basic_user_file /usr/local/nginx/htpasswd;
    }
}

然后使用htpasswd生成密碼文件/usr/local/nginx/conf/htpasswd。

yum -y install httpd-tools
htpasswd -b -c -m /usr/local/nginx/conf/htpasswd Jim 123456
htpasswd -b -m /usr/local/nginx/conf/htpasswd Tom 123456

-b選項(xiàng)是表示batch模式,不用交互輸入密碼。-c表示創(chuàng)建密碼文件,只能為第一個(gè)用戶使用該選項(xiàng),否則后面使用會(huì)覆蓋前面已經(jīng)創(chuàng)建過的。-m表示強(qiáng)制使用md5。Jim和Tom是需要驗(yàn)證的用戶名,123456是密碼。查看生成的密碼文件。

[root@xuexi nginx]# cat htpasswd 
Jim:$apr1$URdS8lcY$GyghBlYInlqfkto0ndnH1.
Tom:$apr1$B/orDxHj$1jIWk1X5XabpH3hcFQzoN1

然后重載配置文件,在瀏覽器中測試。測試時(shí)最好不要用IE。

也可以使用openssl passwd生成,下面的"-apr1"(數(shù)值1而非字母L的小寫)選項(xiàng)是為apache密碼做相關(guān)支持的。

openssl passwd -apr1 123456
$apr1$rD/3/kFH$L8KYfzAWFtHO8mOiR9dci1
# 或者加點(diǎn)鹽
openssl passwd -apr1 -salt 'xyz' 123456
$apr1$xyz$j0n99G44SENB4NmJiwEfJ0

然后將得到的密碼復(fù)制到密碼文件中對(duì)應(yīng)的用戶名后面即可。如將得到的"$apr1$xyz$j0n99G44SENB4NmJiwEfJ0"作為"Admin"用戶的驗(yàn)證密碼。

Admin: $apr1$xyz$j0n99G44SENB4NmJiwEfJ0

8.配置https

https功能由ngx_http_ssl_module模塊提供。https連接的認(rèn)證過程見SSL握手機(jī)制。簡單版的過程如下:

  1. 客戶端say hello,并發(fā)送一個(gè)隨機(jī)數(shù)給服務(wù)端。
  2. 服務(wù)端say hello,并回復(fù)一個(gè)隨機(jī)數(shù)給客戶端。
  3. 服務(wù)端發(fā)送數(shù)字證書給客戶端。
  4. 客戶端使用信任的CA公鑰解密數(shù)字證書得到服務(wù)端的公鑰。
  5. 客戶端使用服務(wù)端的公鑰加密一個(gè)預(yù)備主密鑰并發(fā)送給服務(wù)端。
  6. 服務(wù)端使用自己的私鑰解密預(yù)備主密鑰。
  7. 雙方都得到了2個(gè)隨機(jī)數(shù)加一個(gè)預(yù)備主密鑰。通過這3個(gè)隨機(jī)數(shù)形成一個(gè)會(huì)話主密鑰,即session key。至此ssl握手結(jié)束,連接的認(rèn)證過程也完畢。

對(duì)于服務(wù)端而言,在配置https時(shí),需要提供自己的數(shù)字證書用于發(fā)送給客戶端,還要提供自己的私鑰用于解密客戶端發(fā)送的預(yù)備主密鑰。當(dāng)ssl連接建立完成后,后續(xù)連接要傳輸?shù)臄?shù)據(jù)都采用session key進(jìn)行加密,但注意session key是對(duì)稱加密,客戶端和服務(wù)端是一樣的。

還需注意,在創(chuàng)建證書請(qǐng)求時(shí),由于需要指定common name,這是需要使用https的站點(diǎn),因此每個(gè)ssl證書只能為一個(gè)server_name提供https服務(wù)。不過,通過特殊的配置方法,也能讓一個(gè)ssl證書服務(wù)于整個(gè)域名或域名內(nèi)的某些主機(jī)。例如,https://www.baidu.com使用的證書就是頒發(fā)給"baidu.com"的,而不是該域名下的某一臺(tái)主機(jī)。如何實(shí)現(xiàn)這樣的功能,可以網(wǎng)上搜索下關(guān)鍵字"ssl SubjectAltName",若有需要,我會(huì)另開一篇文章介紹實(shí)現(xiàn)方法。

以下是配置文件中默認(rèn)的關(guān)于SSL相關(guān)的指令設(shè)置。

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

以下是建立https的相關(guān)過程:

  1. 自建CA。
    cd /etc/pki/CA
    (umask 077;openssl genrsa -out private/cakey.pem 2048)
    openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
    
  2. 建立相關(guān)序列和索引文件。
    touch index.txt
    echo "01" > serial
    
  3. nginx端生成證書請(qǐng)求。
    (umask 077;openssl genrsa -out /usr/local/nginx/longshuai.key 2048)
    openssl req -new -key /usr/local/nginx/longshuai.key -out /usr/local/nginx/longshuai.csr
    
  4. CA為證書請(qǐng)求頒發(fā)證書。
    openssl ca -in /usr/local/nginx/longshuai.csr -out longshuai.crt
    
  5. 將頒發(fā)的證書發(fā)送給nginx端。這里由于CA和nginx在同一主機(jī)上,所以直接移動(dòng)即可。
    mv longshuai.crt /usr/local/nginx/
    
    此時(shí),在/usr/local/nginx/目錄下就有了nginx自己的私鑰文件和證書文件。
    [root@xuexi nginx]# ls longshuai*
    longshuai.crt  longshuai.csr  longshuai.key
    
  6. 修改配置文件,配置ssl相關(guān)選項(xiàng)。

    server {
    listen       443 ssl;
    server_name  www.;
    
    ssl_certificate      /usr/local/nginx/longshuai.crt;
    ssl_certificate_key  /usr/local/nginx/longshuai.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;
    }
    }
    
  7. 重載配置文件。
  8. 測試。在瀏覽器上輸入https://www.測試。將會(huì)提示證書安全存在問題,說明配置成功。以后只要在客戶端安裝證書即可正常訪問。測試時(shí),建議使用IE瀏覽器或使用IE內(nèi)核的瀏覽器測試,這樣比較直觀。使用firefox、chrome等瀏覽器可能會(huì)因?yàn)槭亲越ǖ腃A而出現(xiàn)一些問題。

 

轉(zhuǎn)載請(qǐng)務(wù)必在文章最開頭標(biāo)明原文地址
本文原創(chuàng)地址:博客園駿馬金龍https://www.cnblogs.com/f-ck-need-u/p/7683027.html

如果覺得文章不錯(cuò),不妨給個(gè)打賞,寫作不易,各位的支持,能激發(fā)和鼓勵(lì)我更大的寫作熱情。謝謝!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多