Nginx實戰之1.1-1.6 Nginx介紹,安裝及配置文件詳解

1.1 Nginx介紹javascript


HTTP協議發展簡史php

  •  https://coding.net/u/aminglinux/p/nginx/git/blob/master/http/version.mdcss

  •  1991年發佈0.9版,只有GET方法,僅支持html,一個鏈接一個請求html

  •  1996年5月發佈1.0版本,GET/POST/HEAD,HTTP Header,支持多種文件類型,一個鏈接一個請求前端

  •  1997年1月發佈1.1版本,更多方法(DELETE/PUT),一個鏈接多個請求,虛擬主機等java

  •  2015年發佈HTTP/2版本,二進制協議,多工,數據流,頭信息壓縮和索引,服務器推送node

HTTP協議相關概念linux

  •  https://coding.net/u/aminglinux/p/nginx/git/blob/master/http/http.mdnginx

  •  Request,Response,狀態碼,請求方法git

  •  HTTP工做原理

  •  URI,URL


Nginx介紹

常見WebServer(排行https://news.netcraft.com/archives/2018/, https://w3techs.com/technologies/overview/web_server/all )

  • 老牌:Httpd(早期叫Apache) ,開源,市場份額最高

  • 微軟:IIS

  • 輕量:Lighttpd,性能高,低耗能,功能欠缺

Nginx誕生

  • 2004年10月發佈,俄國人Igor Sysoev開發,rambler.ru

Nginx官網、版本

  • nginx.org  1.14.0穩定版

  • 國內分支Tengine(http://tengine.taobao.org/) 

Nginx功能介紹

  • Http服務、反向代理、負載均衡、郵件代理、緩存加速、SSL、flv/mp4流媒體


1.2 Nginx安裝(yum)


vi /etc/yum.repos.d/nginx.repo
 https://coding.net/u/aminglinux/p/nginx/git/blob/master/2z/nginx.repo
 [nginx] 
name=nginx repo 
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ 
gpgcheck=0 
enabled=1
yum install -y nginx
systemctl start/stop/restart/reload nginx

測試:瀏覽器訪問或者curl訪問

  •  檢查服務進程:ps aux |grep nginx

  •  檢查端口監聽:netstat -lnp |grep ‘:80’

  •  有防火牆,需加規則iptables -I INPUT -p tcp --dport 80 -j ACCEPT

nginx -V查看版本以及各個目錄、參數



1.3 源碼包安裝


cd /usr/local/src
wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar zxf nginx-1.14.0.tar.gz
cd nginx-1.14.0; ./configure --prefix=/usr/local/nginx
make && make install

服務啓動,關閉,加載等命令

/usr/local/nginx/sbin/nginx  //啓動
pkill nginx //殺死nginx進程,中止nginx服務
killall nginx //效果是同樣的
killall的安裝包以下:
# rpm -qf `which killall`
psmisc-22.20-15.el7.x86_64
/usr/local/nginx/sbin/nginx -t //檢測配置文件語法錯誤
/usr/local/nginx/sbin/nginx -s reload //重載配置


歡迎頁面加載信息修改

# vim /usr/local/nginx/html/index.html

服務管理腳本

腳本內容:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/etc_init.d_nginx 

操做方法:

vim /etc/init.d/nginx

將腳本內容複製以下

#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start() 
{
    echo -n $"Starting $prog: "
    mkdir -p /dev/shm/nginx_temp
    daemon $NGINX_SBIN -c $NGINX_CONF
    RETVAL=$?
    echo
    return $RETVAL
}
stop() 
{
    echo -n $"Stopping $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -TERM
    rm -rf /dev/shm/nginx_temp
    RETVAL=$?
    echo
    return $RETVAL
}
reload()
{
    echo -n $"Reloading $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -HUP
    RETVAL=$?
    echo
    return $RETVAL
}
restart()
{
    stop
    start
}
configtest()
{
    $NGINX_SBIN -c $NGINX_CONF -t
    return 0
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  reload)
        reload
        ;;
  restart)
        restart
        ;;
  configtest)
        configtest
        ;;
  *)
        echo $"Usage: $0 {start|stop|reload|restart|configtest}"
        RETVAL=1
esac
exit $RETVAL

賦予755權限

chmod 755 !$

之後啓動,關閉nginx的命令就是:

/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx restart


開機啓動自動nginx

chkconfig --add nginx
chkconfig nginx on


1.4 nginx配置文件詳解1


Nginx配置文件

位置:

yum安裝:

/etc/nginx/nginx.conf

源碼包編譯:

/usr/local/nginx/conf/nginx.conf

配置文件內容:

user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events
{
    use epoll;
    worker_connections 6000;
}

http
{
    include mime.types;
    default_type application/octet-stream;
    server_names_hash_bucket_size 3526;
    server_names_hash_max_size 4096;
    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
    ' $host "$request_uri" $status'
    ' "$http_referer" "$http_user_agent"';
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 30;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 8 4k;
    request_pool_size 4k;
    output_buffers 4 32k;
    postpone_output 1460;
    client_max_body_size 10m;
    client_body_buffer_size 256k;
    client_body_temp_path /usr/local/nginx/client_body_temp;
    proxy_temp_path /usr/local/nginx/proxy_temp;
    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
    fastcgi_intercept_errors on;
    tcp_nodelay on;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 8k;
    gzip_comp_level 5;
    gzip_http_version 1.1;
    gzip_types text/plain application/x-javascript text/css text/htm 
    application/xml;

    server
    {
        listen 80;
        server_name localhost;
        index index.html index.htm index.php;
        root /usr/local/nginx/html;

        location ~ \.php$ 
        {
            include fastcgi_params;
            fastcgi_pass unix:/tmp/php-fcgi.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
        }    
    }
}


配置文件結構分解:

  • 全局配置(user、worker_processes、error_log、pid)

  • events(網絡鏈接相關,worker_connections)

  • http(最重要的部分,大部分功能都放這裏)

  • server(虛擬主機相關)

  • location(server裏面)


解釋:

全局配置項結構

https://coding.net/u/aminglinux/p/nginx/git/blob/master/3z/global.md 

nginx.conf全局配置

user nobody;

定義運行nginx服務的用戶,還能夠加上組,如 user nobody nobody;

worker_processes 1;

定義nginx子進程數量,即提供服務的進程數量,該數值建議和服務cpu核數保持一致。
除了能夠定義數字外,還能夠定義爲auto,表示讓系統自動調整。

error_log logs/error.log;

定義錯誤日誌的路徑,能夠是相對路徑(相對prefix路徑的),也能夠是絕對路徑。
該配置能夠在此處定義,也能夠定義到http、server、location裏

error_log logs/error.log notice;

定義錯誤日誌路徑以及日誌級別.
錯誤日誌級別:常見的錯誤日誌級別有[debug|info|notice|warn|error|crit|alert|emerg],級別越高記錄的信息越少。
若是不定義默認是error

pid logs/nginx.pid;

定義nginx進程pid文件所在路徑,能夠是相對路徑,也能夠是絕對路徑。

worker_rlimit_nofile 100000;

定義nginx最多打開文件數限制。若是沒設置的話,這個值爲操做系統(ulimit -n)的限制保持一致。
把這個值設高,nginx就不會有「too many open files」問題了。

events配置項結構

https://coding.net/u/aminglinux/p/nginx/git/blob/master/3z/events.md 

events配置部分

worker_connections 1024;

定義每一個work_process同時開啓的最大鏈接數,即容許最多隻能有這麼多鏈接。
若是是2個wokr_process的話,那麼就是1024*2=2048個鏈接數。鏈接數根據實際來定義,例如高併發的網站,例如淘寶網這參數就會設定幾萬了。

accept_mutex on;

當某一個時刻只有一個網絡鏈接請求服務器時,服務器上有多個睡眠的進程會被同時叫醒,這樣會損耗必定的服務器性能。
Nginx中的accept_mutex設置爲on,將會對多個Nginx進程(worker processer)接收鏈接時進行序列化,防止多個進程爭搶資源。
默認就是on。

multi_accept on;

nginx worker processer能夠作到同時接收多個新到達的網絡鏈接,前提是把該參數設置爲on。
默認爲off,即每一個worker process一次只能接收一個新到達的網絡鏈接。

use epoll;

Nginx服務器提供了多個事件驅動器模型來處理網絡消息。
其支持的類型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。

* select:只能在Windows下使用,這個事件模型不建議在高負載的系統使用
* poll:Nginx默認首選,但不是在全部系統下均可用
* kqueue:這種方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系統中是最高效的
* epoll: 這種方式是在Linux 2.6+內核中最高效的方式(Nginx上使用的就是Epoll)
* rtsig:實時信號,可用在Linux 2.2.19的內核中,但不適用在高流量的系統中
* /dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操做系統最高效的方式
* eventport: Solaris 10最高效的方式

http配置項

https://coding.net/u/aminglinux/p/nginx/git/blob/master/3z/http.md


http配置部分

官方文檔 http://nginx.org/en/docs/
參考連接: http://www.javashuo.com/article/p-ndibbnll-gs.html
參考連接: http://www.javashuo.com/article/p-yheskdoy-ha.html
參考連接:http的header https://kb.cnblogs.com/page/92320/

MIME-Type

include       mime.types;  //cat conf/mime.types定義nginx能識別的網絡資源媒體類型(如,文本、html、js、css、流媒體等)

default_type  application/octet-stream;
定義默認的type,若是不定義改行,默認爲text/plain.

log_format

log_format main  '$remote_addr - $remote_user [$time_local] "$request" '
                 '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" "$http_x_forwarded_for"';其中main爲日誌格式的名字,後面的爲nginx的內部變量組成的一串字符串。

access_log logs/access.log main;

定義日誌的路徑以及採用的日誌格式,該參數能夠在server配置塊中定義。

sendfile on;

是否調用sendfile函數傳輸文件,默認爲off,使用sendfile函數傳輸,能夠減小user mode和kernel mode的切換,從而提高服務器性能。
對於普通應用設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,下降系統的負載。

sendfile_max_chunk 128k;

該參數限定Nginx worker process每次調用sendfile()函數傳輸數據的最大值,默認值爲0,若是設置爲0則無限制。

tcp_nopush on;

當tcp_nopush設置爲on時,會調用tcp_cork方法進行數據傳輸。
使用該方法會產生這樣的效果:當應用程序產生數據時,內核不會立馬封裝包,而是當數據量積累到必定量時纔會封裝,而後傳輸。這樣有助於解決網絡堵塞問題。
默認值爲on。舉例:快遞員收快遞、發快遞,包裹累積到必定量纔會發,節省運輸成本。

keepalive_timeout 65 60;

該參數有兩個值,第一個值設置nginx服務器與客戶端會話結束後仍舊保持鏈接的最長時間,單位是秒,默認爲75s。
第二個值能夠省略,它是針對客戶端的瀏覽器來設置的,能夠經過curl -I看到header信息中有一項Keep-Alive: timeout=60,若是不設置就沒有這一項。
第二個數值設置後,瀏覽器就會根據這個數值決定什麼時候主動關閉鏈接,Nginx服務器就不操心了。但有的瀏覽器並不承認該參數。

send_timeout

這個超時時間是發送響應的超時時間,即Nginx服務器向客戶端發送了數據包,但客戶端一直沒有去接收這個數據包。
若是某個鏈接超過send_timeout定義的超時時間,那麼Nginx將會關閉這個鏈接。

client_max_body_size 10m;

瀏覽器在發送含有較大HTTP包體的請求時,其頭部會有一個Content-Length字段,client_max_body_size是用來限制Content-Length所示值的大小的。
這個限制包體的配置不用等Nginx接收完全部的HTTP包體,就能夠告訴用戶請求過大不被接受。會返回413狀態碼。
例如,用戶試圖上傳一個1GB的文件,Nginx在收完包頭後,發現Content-Length超過client_max_body_size定義的值,
就直接發送413(Request Entity Too Large)響應給客戶端。

gzip on;

是否開啓gzip壓縮。

gzip_min_length 1k;

設置容許壓縮的頁面最小字節數,頁面字節數從header頭得content-length中進行獲取。默認值是20。建議設置成大於1k的字節數,小於1k可能會越壓越大。

gzip_buffers 4 16k;

設置系統獲取幾個單位的buffer用於存儲gzip的壓縮結果數據流。4 16k表明分配4個16k的buffer。

gzip_http_version 1.1;

用於識別 http 協議的版本,早期的瀏覽器不支持 Gzip 壓縮,用戶會看到亂碼,因此爲了支持前期版本加上了這個選項。
若是你用了Nginx反向代理並指望也啓用Gzip壓縮的話,因爲末端通訊是http/1.1,故請設置爲 1.1。

gzip_comp_level 6;

gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)

gzip_types mime-type ... ;

匹配mime類型進行壓縮,不管是否指定,」text/html」類型老是會被壓縮的。
在conf/mime.conf裏查看對應的type。

示例:gzip_types       text/plain application/x-javascript text/css text/html application/xml;

gzip_proxied any;

Nginx做爲反向代理的時候啓用,決定開啓或者關閉後端服務器返回的結果是否壓縮,匹配的前提是後端服務器必需要返回包含」Via」的 header頭。

如下爲可用的值:
off - 關閉全部的代理結果數據的壓縮
expired - 啓用壓縮,若是header頭中包含 "Expires" 頭信息
no-cache - 啓用壓縮,若是header頭中包含 "Cache-Control:no-cache" 頭信息
no-store - 啓用壓縮,若是header頭中包含 "Cache-Control:no-store" 頭信息private - 啓用壓縮,若是header頭中包含 "Cache-Control:private" 頭信息
no_last_modified - 啓用壓縮,若是header頭中不包含 "Last-Modified" 頭信息
no_etag - 啓用壓縮 ,若是header頭中不包含 "ETag" 頭信息
auth - 啓用壓縮 , 若是header頭中包含 "Authorization" 頭信息
any - 無條件啓用壓縮

gzip_vary on;

和http頭有關係,會在響應頭加個 Vary: Accept-Encoding ,可讓前端的緩存服務器緩存通過gzip壓縮的頁面,例如,用Squid緩存經


server配置項

https://coding.net/u/aminglinux/p/nginx/git/blob/master/3z/server.md



nginx.conf server部分配置


server{} 包含在http{}內部,每個server{}都是一個虛擬主機(站點)。


如下爲nginx.conf配置文件中server{}部分的內容。

server {
    listen       80;  //監聽端口爲80,能夠自定義其餘端口,也能夠加上IP地址,如,listen 127.0.0.1:8080;
    server_name  localhost; //定義網站域名,能夠寫多個,用空格分隔。
    #charset koi8-r; //定義網站的字符集,通常不設置,而是在網頁代碼中設置。
    #access_log  logs/host.access.log  main; //定義訪問日誌,能夠針對每個server(即每個站點)設置它們本身的訪問日誌。
    ##在server{}裏有不少location配置段
    location / {
        root   html;  //定義網站根目錄,目錄能夠是相對路徑也能夠是絕對路徑。
        index  index.html index.htm; //定義站點的默認頁。
    }
    #error_page  404              /404.html;  //定義404頁面
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;  //當狀態碼爲500、50二、50三、504時,則訪問50x.html
    location = /50x.html {
        root   html;  //定義50x.html所在路徑
    }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #定義訪問php腳本時,將會執行本location{}部分指令
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;  //proxy_pass後面指定要訪問的url連接,用proxy_pass實現代理。
    #}
    # 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服務器監聽端口與地址,支持兩種形式,1 IP:Port, 2 unix:/path/to/sockt
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  //定義SCRIPT_FILENAME變量,後面的路徑/scripts爲上面的root指定的目錄
    #    include        fastcgi_params; //引用prefix/conf/fastcgi_params文件,該文件定義了fastcgi相關的變量
    #}
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    # 
    #location ~ /\.ht {   //訪問的url中,以/.ht開頭的,如,www.example.com/.htaccess,會被拒絕,返回403狀態碼。
    #    deny  all;  //這裏的all指的是全部的請求。
    #}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#    listen       8000;  //監聽8000端口
#    listen       somename:8080;  //指定ip:port
#    server_name  somename  alias  another.alias;  //指定多個server_name
#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}
# HTTPS server
#
#server {
#    listen       443 ssl;  //監聽443端口,即ssl
#    server_name  localhost;
### 如下爲ssl相關配置
#    ssl_certificate      cert.pem;    //指定pem文件路徑
#    ssl_certificate_key  cert.key;  //指定key文件路徑
#    ssl_session_cache    shared:SSL:1m;  //指定session cache大小
#    ssl_session_timeout  5m;  //指定session超時時間
#    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   //指定ssl協議
#    ssl_ciphers  HIGH:!aNULL:!MD5;  //指定ssl算法
#    ssl_prefer_server_ciphers  on;  //優先採起服務器算法
#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}

server {
    listen       80;  //監聽端口爲80,能夠自定義其餘端口,也能夠加上IP地址,如,listen 127.0.0.1:8080;
    server_name  localhost; //定義網站域名,能夠寫多個,用空格分隔。
    #charset koi8-r; //定義網站的字符集,通常不設置,除非在網頁亂碼。而是在網頁代碼中設置,。
    #access_log  logs/host.access.log  main; //定義訪問日誌,能夠針對每個server(即每個站點)設置它們本身的訪問日誌。
    ##在server{}裏有不少location配置段
    location / {
        root   html;  //定義網站根目錄,目錄能夠是相對路徑也能夠是絕對路徑。
        index  index.html index.htm; //定義站點的默認頁,即索引頁。
    }
    #error_page  404              /404.html;  //定義404頁面
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;  //當狀態碼爲500、50二、50三、504時,則訪問50x.html
    location = /50x.html {
        root   html;  //定義50x.html所在路徑
    }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #定義訪問php腳本時,將會執行本location{}部分指令
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;  //proxy_pass後面指定要訪問的url連接,用proxy_pass實現代理。
    #}
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    !!!!proxy_pass代理web網站,fastcgi_pass後跟php-fpm地址。!!!!
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;  //定義FastCGI服務器監聽端口與地址,支持兩種形式,1 IP:Port, 2 unix:/path/to/sockt
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  //定義SCRIPT_FILENAME變量,後面的路徑/scripts爲上面的root指定的目錄
    #    include        fastcgi_params; //引用prefix/conf/fastcgi_params文件,該文件定義了fastcgi相關的變量
    #}
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    # 
    #location ~ /\.ht {   //訪問的url中,以/.ht開頭的,如,www.example.com/.htaccess,會被拒絕,返回403狀態碼。
    #    deny  all;  //這裏的all指的是全部的請求。
    #}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#    listen       8000;  //監聽8000端口,監聽不一樣的端口。
#    listen       somename:8080;  //指定ip:port
#    server_name  somename  alias  another.alias;  //指定多個server_name
#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}
# HTTPS server
#
#server {
#    listen       443 ssl;  //監聽443端口,即ssl
#    server_name  localhost;
### 如下爲ssl相關配置
#    ssl_certificate      cert.pem;    //指定pem文件路徑
#    ssl_certificate_key  cert.key;  //指定key文件路徑
#    ssl_session_cache    shared:SSL:1m;  //指定session cache大小
#    ssl_session_timeout  5m;  //指定session超時時間
#    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   //指定ssl協議
#    ssl_ciphers  HIGH:!aNULL:!MD5;  //指定ssl算法
#    ssl_prefer_server_ciphers  on;  //優先採起服務器算法
#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}
相關文章
相關標籤/搜索