Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

Nginx基礎

前言

apache在設計的時候已經考慮了并發訪問模型,select()機制可以響應1024個訪問,但是當數量再大,千萬級別的時候http就響應不過來了。這個時候,nginx的出現解決了這一個問題。nginx是一個安裝簡單、配置文件簡單、占用內存少、穩定性高、處理并發能力非常強、靈活好用等有點聚集于一身的輕量級服務器。在Linux操作系統中,Nginx使用epoll事件模型,效率相當高,Nginx能夠支持高達5萬個并發連接數的響應,在高連接并發的情況下,Nginx是apache服務器不錯的替代品。

一、IO模型相關概念

1、同步模型:

一個任務的完成需要依賴另一個任務的時候,被依賴的完成后才能完成這個任務。

A依賴于B,B完成了,才能完成A。http進程去調用內核在那等著,內核去磁盤上加載資源,資源加載完了,返回給http進程,http進程才能進行下一步。

2、異步模型:

調用者無需等待被調用者完成,只是通知被依賴的任務,我要完成什么事,你來幫我完成,要依賴于通知,依賴于回調函數。

3、消息通知

被調用者

同步:等待對方返回消息

異步:被調用者通過消息通知或回調,狀態是調用者每隔一段時間要檢查一次,處于盲等狀態。通知是好了就來通知。

調用者

阻塞:block (盲等) 調用結果返回之前,調用者會被掛起

非阻塞:nonblock (非盲等)

4、IO模型

同步阻塞:同步掛起

同步非阻塞:同步沒掛起,它是怎么等待數據呢?數據準備好了,開始第二階段了怎么辦,所有那個去干別的事的進程要反復輪巡,過一會跑過來看看,數據加載完了沒有,非阻塞的也變成阻塞的了,性能極差。

IO復用:為了解決同步非阻塞的進程老來查詢數據,就準備了一個顯示器【seletc(),1024】,最多顯示1024個,你別來輪巡內核了,直接看輪巡屏幕就好了。

異步:不會阻塞,也可能會阻塞,在等待消息上。

5、IO分類

網絡IO:本質是socket讀取

磁盤IO:流

6、每次IO經過的兩個階段

數據首先會從磁盤或網絡先加載到內核內存(緩沖區),等待數據準備完成

數據從內核緩沖區復制到用戶空間的進程的內存中去,數據從內核復制到進程中去。

7、區別

同步阻塞:第一二階段全部掛起

異步非阻塞:第一階段沒掛起,盲等,第二階段掛起

IO復用:第一階段阻塞,到大屏幕上,而不是內核上,第二階段也阻塞。

二、Nginx概念

1、Nginx特性:

(1)模塊化設計,較好的擴展性;

(2)高可靠性,master/worker

(3)支持熱部署:不停更新配置文件、更換日志文件更新服務程序版本;

(4)低內存消耗:10000個keep-alive連接模式下的非活動連接僅消耗2.5M內存

(5)基本功能:靜態資源的web服務器,可為http做反向代理。還有POP3limap4協議的反向代理服務器,郵件,FASTCGI等協議;lnmp。模塊化(非DSO),編譯時確定:著名的有zip,ssl,……;與web服務器相關的功能:虛擬主機,keepalive,訪問日志,url,rewrite,路勁別名,基于ip及用戶的訪問控制,速率限制及并發數限制。

2、Nginx的程序架構

master\worker架構:一個master進程,可生成一個或多個work進程;

master:加載配置文件,管理worker進程,平滑升級……

worker:http服務,http代理,fastcgi代理

3、Nginx的模塊類型

(1)核心模塊:core module (2)標準模塊:httpd模塊(標準的httpd模塊和可選的httpd模塊) (3)3rd party modules

4、nginx的安裝epel源(下面用編譯的方法安裝)

1、安裝編譯環境:

yum groupinstall "Development Tools" "Server Platform Development" -y

2、安裝可能要啟用的東西:openssl、pcre、zlib等等

yum -y install openssl-devel pcre-devel zlib-devel

3、創建nginx系統用戶

useradd -r nginx

4、在nginx官網下載nginx,解壓縮,次版本號是雙數則是穩定版

wget http://nginx.org/download/nginx-1.8.1.tar.gz

5、根據需要configure

./configure --prefix=/usr/local/nginx  --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module  --with-debug --with-http_stub_status_module  --with-http_gzip_static_module

6、啟動:/usr/local/nginx/sbin/nginx

7、報錯如下:

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

問題是,錯誤的原因是沒有創建nginx這個用戶,應該在服務器系統中添加nginx用戶組和用戶nginx,方法如下:

/usr/sbin/groupadd -f nginx
/usr/sbin/useradd -g nginx nginx

ps aux 可以看到進程

8、然后可以啟動了,命令太長了怎么辦,修改一下

vim /etc/profile.d/nginx.sh

export PATH=/usr/local/nginx/sbin:$PATH

exec bash /etc/profile.d/nginx.sh (立即生效)

nginx -t 是檢測配置文件是否正確的

nginx -s reload 重載nginx

nginx -s stop 停止啟動

nginx 啟動

9、配置文件(主配置文件/etc/nginx下的nginx.conf)

主要配置文件是:nginx.conf

可以自定義 conf.f/*.conf

還有facsgi、scgi、uwscgi的相關配置

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

配置指令(必須以分號結尾);

支持使用變量:內置變量(由模塊引入,可以直接使用),自定義變量(set variablename value),引入變量($variablename)

三、配置文件結構(三大塊)

main block :全局配置,對http及mail模塊均有效;

worker-processes 1;表示有幾個worker進程
worker-connectios 1024;表示每個worker進程同時可以響應多少個進程

event 部分:事件驅動的相關配置

http部分:http協議相關配置,web相關的都放在這里面

http {
    …… 公共配置
        server {
            ……虛擬主機自己的配置
        }
        server{
            ……
            server_name 主機名
            root -->DocumentRoot
            alias-->http alias
            location /url/{
                    ……
                            }
            }
    }

1、main配置段:全局配置

官網可以看具體使用方法:http://nginx.org/en/docs/ngxcoremodule.html

配置指令的類別:正常運行必備的配置;優化性能的配置;用于調試、定位問題的配置

(1)正常運行必備的配置

1、user USERNAME [GROUPNAME];
    指定用戶運行work進程的用戶和組;
例如:user nginx nginx;

2、pid /PAEH/TO/PID_FILE;指明運行時的pid文件在哪,指定nginx進程的pid文件路徑:
    pid /var/run/nginx.pid;

3、worker_rlimit_nofile number:單個work進程可以打開的最大文件數,默認是1024個,如果有很多,可以調大一點

(2)性能優化相關配置:

1、worker_processes number |auto;自動設定,1.8以后才支持
用來指明work作進程的進程數
通常應該為cpu的核心數減1,可以是auto

16核服務器,14個隔離出來,2個運行,剩下14個每個綁一個work,不這樣做,每個cpu核心都需要被work進程去調度的,不斷的被進程切換著,nginx被切換出去以后,下次再切換過來就不一定是原來那個核了,cpu本地緩存就不能應用了,性能得不到提升,nginx性能很重要。

ps aux 有幾個worker process
lscpu 看cpu有幾個  可以相同,也可以-1.

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)


2、work_cpu_affinity cpumask ...;
  worker_cpu_affinity auto [cpumask],auto是自動綁定,也可能不支持

  work_processes 2;
  work_cpu_affinity 0010 0100;  
  含義就是選的兩個work_process,綁定在哪兩個cpu上

(3)指明進程優先級,nice越小,優先級越高

1、worker_priority number;優先級
nice:[-20,19]
ps axo command,pid,psr,ni

例子:worker_priority -5;檢測,重載

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

(4)調試定位問題:

1、daemon on |off;
是否以守護進程方式啟動Nginx,默認是

2、master——process on|off;
是否以master|work 模式啟動,正常都應該啟動

3、error_log 錯誤日志文件記錄方式及日志級別
    debug要使用,在編譯時--with要加上

方式:
    file /PATH/TO/SOME_LOG_FILE;
    stderr:發送到錯誤輸出,在當前終端
    syslog:server=address[parameter=value]:發送到syslog服務器;
    memory:size,記錄內存中,已關機就沒了

日志級別:
    debug依賴于configure  --with-debug選項

2、event配置段

官方文檔:http://nginx.org/en/docs/ngxcoremodule.html

1、worker_connections number;最大并發響應數
    每個work進程所能夠打開的最大連接數;默認是512個

最大連接數=work_process*work_connections

2、use method;
    指明并發連接請求處理時使用的方法;

3、accept_mutex on
    讓work processes輪流的接受新的連接,一般都啟用,啟用時表示用于讓多個work輪流地序列化地響應請求

4、lock_file file;
    nginx使用鎖機制去管理互斥

3、http配置段(重點)

官方參考:http://nginx.org/en/docs/http/ngxhttpcore_module.html

五大塊:定義套接字相關功能,定義路徑相關配置,定義客戶端請求的相關配置,對客戶的請求進行限制的相關配置,文件操作優先的配置。

(1)定義套接字相關功能

1、server{……} 定義虛擬主機的
    對于nginx,基于ip與主機名沒什么區分


server { 很容易
    listen port;
    server_name HOSTNAME;(主機名,可以使用正則表達式的模式)
    root /PATH/TO/DOCUMENTROOT;
    ……
    }

2、listen  監聽在哪個端口,格式如下:
    listen address
    listen port
    listen unix

例如:
    listen 127.0.0.1:8000;
    listen 127.0.0.1;
    listen 8000;
    listen *:8000;
    listen localhost:8000;

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

    default_server :設置默認虛擬主機
    ssl:限制通過ssl連接提供服務
    backlog:后緩隊列的長度
    rcvbuf:接收緩沖大小
    sndbuf:發送緩沖區大小

3、server_name  name ...;
指明當前server的主機名;后可跟一個或空白字符分隔的多個主機,支持使用*,任意長度的任意字符

例如:www.magedu.com   支持~起始的正則表達式模塊字符串

server_name www.magedu.com;
server_name *.magedu.com;
server_name www.magedu.*;
server_name -^.*\.magedu\.*$;

mail.magedu.com 2,4  優先是2
www.magedu.com  1,2,3,4  優先是1
越精確,優先級越高

(2)定義路徑相關配置:

1、root path:設置web資源路徑映射,用于指明用戶請求的url所對應的本地文件系統的文檔目錄路徑;可用上下文有:http,server,location,if

例子:把location的root注釋掉,自己在server下面加,http下也可以加,可以對多個server生效

root /web/html/;

測試如下:(果然比http簡單多了)

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

vim nginx.conf,再加個server
    server {
        listen 80;
        server_name www.cwj.com www.a.com;
        root /web/html2;
        }

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

為了便于管理,我們也可以令創建一個文件,專門編輯這些主機文件,如下,在/etc/nginx 下創建一餓個conf.d的目錄,然后編輯host2.conf:

vim conf.d/host2.conf
vim nginx.conf
include conf.d/*.conf;

注意事項:

(1)基于port的虛擬主機:listen指令要使用不同的端口
(2)基于hostname的虛擬主機:server_name指令指向不同的主機名
(3)基于ip的虛擬主機:listen ip:port;

2、tcp_nodelay on|off
    對keepalived模式下的連接是否啟用TCP_NODELAY選項

3、tcp_nopush on|off ;默認的選off

4、sendfile:在內核封裝后直接發送給客戶端,不反回httpd或者nginx,默認是off,要on起來

5、location 很有用,根據用戶請求的url來匹配定義的location,匹配到時,請求將被相應的location塊中的配置所處理;

例如:
    root /web/host1;
    路徑是:/web/host1/images/1.jpg
    主機名是:www.cwj.com
    網址應該是:http://www.cwj.com/images/1.jpg

location 含有if之意,引入一個新的上下文,里面如果可以匹配到,則執行
location ~*\.txt {
    gzip on ;
                }

server {可以多個,嵌套
    ……
    location {
            }
    location {
            }
        ……
        }

=:url精確匹配,用戶使用的與這里完全不差
~:正則表達式模式匹配,區分大小寫
~*:正則表達式模式匹配,不區分大小寫
^~:牟定行首的,url左半部分進行匹配
優先級:越精確,越優先:=   ^~   ~|~*   不帶符號的


6、alias 同http alias  ,路徑別名
alias path;定義路徑別名,文檔映射的一種機制,僅能用于location上下文

例如:
alias /bbs/  /web/forum/    ,既是  /bbs/  = /web/forum/

http://www.magedu.com/bbs/a.jpg
    /web/forum/a.jpg


location /bbs/ {
    alias /web/forum/;
            }

    /web/forum/a.jpg



location /bbs/ {
    root /web/forum/;
            }

    /web/forum/bbs/a.jpg

root指令:給定的路徑對于location中的/url/最左側的/

7、index:
可用的位置:http,server,location,默認主頁

8、error_page:自定義錯誤頁面,基本能力
    根據用戶請求的http響應狀態碼實現錯誤重定向
例如:
    error_page 404             /404.html;
    error_page 500 502 503 504 /50x.html;

9、try_files  嘗試文件  查找頁面不在時

(3)定義客戶端請求的相關配置

1、keepalive
設定保持連接的超時時長,0表示禁止啟用長連接,默認是75s

2、keepalive_requests number
在一次長連接上所允許請求的資源的最大數量,默認是100

3、keepalive_disable name|browser ...
說明對哪種瀏覽器禁用

4、send_timeout time:向客戶端發送響應報文的超時時長,默認是60s

5、client_body_buffer_size size;
用于接受客戶請求報文body部分的緩沖區大小;
默認是16K;超出此大小時,其將被暫存到磁盤上

6、client_body_temp_path path [level1 |level2 ……];
設定用于存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;

(4)客戶端請求進行限制的相關匹配

1、limit_rate (限制速率)默認為0,限制每秒鐘響應給客戶端的傳輸速率,字節/秒

    location /download/ {
        limit_rate 20480;
            }
2、limit_except method 限制請求方法
    限制對指定的請求方法之外的其他方法的使用客戶端

    limit_except GET POST {
        allow 192.168.1.109;
        deny all;
            }
    表示除了GET和POST之外的其他方法,僅允許172.18.0.0/16中的主機使用

3、密鑰訪問:
    htpasswd -c -m /etc/nginx/.ngxpasswd tom
    htpasswd  -m /etc/nginx/.ngxpasswd jerry

    location /admin/ {
        auth _basic "Admin Area";
        auth_basic_user_file /etc/nginx/.ngxpasswd;
            }
    mkdir /web/html2/admin
    vim /web/html2/admin/index.html

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

    nginx -t
    nginx -s reload

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

輸入密碼

Nginx 基礎 (IO模型、編譯安裝、幾大塊配置文件詳解)

原創文章,作者:N24_yezi,如若轉載,請注明出處:http://www.www58058.com/64591

(1)
N24_yeziN24_yezi
上一篇 2016-12-23
下一篇 2016-12-24

相關推薦

  • iptables

    一、前言 什么是iptables?當我們啟動iptables時,使用service命令可以啟動iptables。但是并非使用service啟動的iptables就能說明其是一個服務。Iptables是一個便以我們寫規則的工具,真正起作用的是內核中的netfilter一個框架。Netfilter內置了5個hook函數,當一個數據包交由此機器時,經過這5個hoo…

    Linux干貨 2015-10-27
  • date用法心得

    Linux時間格式極大程度的遵循了人類習慣,以下為部分常見時間。
    date命令本身提供了日期的加減運算,shell編程時靈活運用

    2017-11-09
  • Homework Week-4 grep用法

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 cp -r /etc/skel /home/tuser1 chmod  -R g=,o= /home/tuser1 2、編輯/etc/group文件,添加…

    Linux干貨 2016-09-06
  • 軟件安裝包的管理

    rpm安裝包的管理 rpm的數據庫( 公共) :/var/lib/rpm 程序包名稱及版本 依賴關系 功能說明 包安裝后生成的各文件路徑及校驗碼信息 安裝 rpm:{-i} -v:顯示詳細信息 -h:以#顯示程序包管理執行進度 rpm -ivh PACKAGE_FILE … [install-options] –test :測試安裝,但不真正執行安裝過程 –…

    Linux干貨 2017-04-23
  • 網絡N23期第一周(計算機的組成及功能及Linux的發行版等)

    一. 描述計算機的組成及功能 計算機由五大硬件組成:” 運算器 + 控制器 + 儲存器 + 輸入設備 + 輸出設備” 。 運算器(Datapath):運算器的功能是對數據進行各種算術運算和邏輯運算,即對數據進行加工處理。 控制器(Control):是整個計算機的中樞神經,其功能是對程序規定的控制信息進行解釋,根據其要求進行控制,調度程序、數據、地址,協調計算…

    Linux干貨 2016-09-22
  • nginx學習

    nginx    nginx的核心配置項:        Core functionality:核心配置,Glob配置段            daemon:是否開啟為守護進程        &nbs…

    2017-05-08
欧美性久久久久