01 . Nginx簡介及部署

Nginx簡介

Nginx(發音同engine x)是一個異步框架的 Web 服務器,也能夠用做反向代理,負載平衡器 和 HTTP 緩存。該軟件由 Igor Sysoev 建立,並於2004年首次公開發布。同名公司成立於2011年,以提供支持。Nginx 是一款免費的開源軟件,根據類 BSD 許可證的條款發佈。一大部分Web服務器使用 Nginx ,一般做爲負載均衡器。javascript

Nginx 的特色

  • 更快:
    • 單次請求會獲得更快的響應。
    • 在高併發環境下,Nginx 比其餘 WEB 服務器有更快的響應。
  • 高擴展性:
    • Nginx 是基於模塊化設計,由多個耦合度極低的模塊組成,所以具備很高的擴展性。許多高流量的網站都傾向於開發符合本身業務特性的定製模塊。
  • 高可靠性:
    • Nginx 的可靠性來自於其核心框架代碼的優秀設計,模塊設計的簡單性。另外,官方提供的經常使用模塊都很是穩定,每一個 worker 進程相對獨立,master 進程在一個 worker 進程出錯時能夠快速拉起新的 worker 子進程提供服務。
  • 低內存消耗:
    • 通常狀況下,10000個非活躍的 HTTP Keep-Alive 鏈接在 Nginx 中僅消耗 2.5MB 的內存,這是 Nginx 支持高併發鏈接的基礎。
    • 單機支持10萬以上的併發鏈接:理論上,Nginx 支持的併發鏈接上限取決於內存,10萬遠未封頂。
  • 熱部署:
    • master 進程與 worker 進程的分離設計,使得 Nginx 可以提供熱部署功能,即在 7x24 小時不間斷服務的前提下,升級 Nginx 的可執行文件。固然,它也支持不中止服務就更新配置項,更換日誌文件等功能。
  • 最自由的 BSD 許可協議:
    • 這是 Nginx 能夠快速發展的強大動力。BSD 許可協議不僅是容許用戶無償使用 Nginx ,它還容許用戶在本身的項目中直接使用或修改 Nginx 源碼,而後發佈。
# 上面是官方對Nginx的特色介紹,下面是我我的加的,大體差很少:

# 1. apache 的功能 nginx 都具備,且配置簡單,但其穩定性沒有 apache 好
# 2. 高性能的反向代理服務器(負載均衡器),代理 Web 服務器(用的最多)
# 3. 輕量級、高性能的 HTTP Server:對 CPU 等硬件資源消耗小(在早期官網上測試:10000 個非活躍的 HTTP KEEPALIVE 鏈接僅佔用 2.5M 內存);taobao 和阿里曾對 nginx 作過測試,最多支持 5 萬個併發鏈接,能夠解決 C10k 的問題(apache 的併發量爲 200,到達 2000 就變得很慢,經過集羣,併發量能夠達到 2 萬左右))
# 4. 基於模塊化設計
# 5. 基於 EPOLL 事件驅動模型,因此是高性能
# 6. 從新加載配置及在線升級時,不須要中斷正在處理的請求(nginx 熱部署),能夠作到平滑升級
# 7. URL 重寫(rewrite)模塊
# 8. 支持驗證 HTTP referer,實現反盜鏈機制。所謂反盜鏈就是網站上的某一個頁面只容許在該網站上點擊此超連接跳轉,不容許別人仿照寫的頁面跳轉到咱們的超連接
# 9. 支持 sendfile,將數據在內核中直接封裝響應客戶端,不須要將數據複製到進程地址空間。sendfile 是 Linux 進程內核裏面的一種機制,這個機制也是爲了加快網站服務器的訪問速度。
# 10. 支持緩存功能

# 上面有一些概念,下面有解釋,大佬可跳過
C10K 概念

談到C10K,能夠講一下他的由來:php

最先的1990-2000年web1.0,互聯網大部分使用場景是下載一個html頁面,用戶在瀏覽器中查看網頁上信息。這個時期不存在C10K問題。css

2000-2010 年,web2.0 時代到來以後就不一樣了,一方面是普及率大大提升了,用戶羣體幾何倍數增加,另外一方面再也不是單純的瀏覽萬維網網頁,逐漸開始交互,並且應用程序的邏輯也變的更復雜,從簡單的表單提交,到即時通訊和在線實時互動。html

C10K 的問題就出來了。每個用戶都必須與服務器保持 TCP 鏈接才能進行實時的數據交互。Facebook 這樣的網站同一時間的併發 TCP 鏈接可能會過億。前端

騰訊 QQ 當時也有 C10K 的問題,只不過他們用了 UDP 這種原始的包交換協議來實現的,繞開了這個難題。若是當時有 Epel 技術,他們確定會 TCP,後來手機 QQ,微信都採用 TCP 技術。java

問題來了,最初的服務器都是基於進程/線程模型的,新到來一個 TCP 鏈接,就須要分配一個進程(或者線程),而進程又是操做系統最昂貴的資源,一臺機器沒法建立不少進程。若是是 C10K 就要建立一萬個進程,那麼操做系統是沒法承受的。node

即便採用分佈式系統,維持一億用戶在線就須要十萬臺服務器,成本巨大,也只有 Facebook,Google,雅虎纔有財力購買如此多的服務器。這就是 C10K 的本質。python

Facebooke: (臉書) 美國的一個社交網絡服務網站,創辦者是哈佛大學的學生linux

截止在2013年天天上傳 3.5 億照片。也是世界領先的照片分享站點。nginx

截止 2012 年 5 月,Facebook 約有 9 億用戶,2018 年 9 月,遭受過一次黑客攻擊,涉及 5000 萬用戶,由於泄露,將面臨歐盟 16.3 億美圓的罰款。可是在 09 年一直被中國屏蔽。

2018 年世界品牌 500 強,Facebook 排在 11 位。

C10K解決方案

從網絡編程技術角度來講,主要思路
1. 每一個進程/線程處理一個鏈接

# 這一思路最爲直接。可是因爲申請進程/線程會佔用至關可觀的系統資源,同時對於多線程/進程的管理會給系統形成壓力,可擴展性差
# 在服務器資源尚未富裕到足夠程度的時候,是不可行的:即便資源足夠富裕,效率也不夠高。

2. 每一個進程/線程同時處理多個鏈接(IO多路複用)
1>傳統思路

# 最簡單方法是循環挨個挨個處理各個鏈接,每一個鏈接對應一個socket,當全部socket都有數據的時候,這種方法是可行的。

# 可是當應用讀取某個socket的文件數據沒準備好時候,整個應用就會阻塞在這裏等待文件句柄,即便別的文件句柄OK了,也沒法往下處理。

# 思路:直接循環處理多個鏈接

# 問題: 任一文件句柄的不成功會阻塞整個應用

2>select

# 要解決上面阻塞的問題,思路很簡單,若是我在讀取文件句柄以前,先查看他的狀態,準備好了就處理,不許備好就不處理,
# 因而有了select方案。用一個fd_set結構體來告訴內核同時監控多個文件句柄,當其中有文件句柄的狀態發生指定變化(例如某句柄由不可用變爲可用)或超時,則調用返回。以後應用可使用FD_ISSET來逐個查看是哪一個文件句柄的狀態發生了變化。
# 這樣作,小規模鏈接問題不大,但當鏈接數不少(文件句柄個數不少)的時候,逐個檢查狀態就很慢了,所以,select每每存在管理的句柄上限(FD——SETSIZE).同時,在使用上,由於只有一個字段記錄和發生事件,每次調用以前要從新初始化fd_sed結構體。

# 思路:有鏈接請求抵達了再檢查處理

# 問題:句柄上限+重複初始化+逐個排查全部文件句柄狀態效率不高。

3>poll

# poll主要解決select的前兩個問題:經過一個pollfd數組向內核傳遞須要關注的時間消除文件句柄上限,同時使用不一樣字段分別標註關注時間和發生事件,來避免重複初始化

# 思路:設計新的數據結構提供使用效率

# 問題:逐個排查全部文件句柄效率不高。

4>epoll

# 既然逐個排查全部文件句柄狀態效率不高,很天然的,若是調用返回的時候只給應用提供發生了狀態變化(極可能是數據ready)的文件句柄,進行排查的效率不久高多了麼。
# epoll採用了這種設計,使用與大規模的應用場景
# 試驗代表:當文件句柄數目超過10之後,epoll性能將優於select 和poll:
# 當文件句柄數目達到10K的時候,epoll已經超過select和poll兩個數量級。

# 思路:只返回狀態變化的文件句柄

# 問題:依賴特定平臺(Linux).
	# 由於 Linux 是互聯網企業中使用率最高的操做系統,Epoll 就成爲 C10K  killer,高併發,高性能,異步非阻塞這些技術的代名詞了。FreeBSD 推出了 kqueue,linux 推出了 epoll,windows 推出了 IOCP,Solaris 推出了/dev/poll.
	# 這些操做系統提供的功能就是爲了解決 C10K 的問題。epoll 技術的編程模型就是異步非阻塞回調,也能夠叫作 Reactor,事件驅動,事件輪詢。
    # Nginx,libenent,Node.js 這些就是 epoll 時代的產物。
事件驅動模型

在說事件驅動模型以前先了解如下幾個概念: 同步和異步,阻塞和非阻塞**
同步機制和異步機制

用於描述網絡中主機通訊的模式:

同步機制

發送方發送請求後,須要等待接 收方迴應,纔會繼續發送下一個請求,效率不高

異步機制

發送發發送請求後,不等待接收方迴應,

阻塞和非阻塞

用於描述進程處理 IO 調用的方式(和磁盤打一次交道就是一次 IO)

阻塞機制

調用結果返回前,進程會從運行狀態切換到掛起狀態,待調用結果返回後,進程再次進入就緒狀態,獲取 CPU 後繼續執行:

非阻塞機制

調用結果若是不能及時返回,進程也 不會進入掛起狀態,而是開始處理下一個請求,待調用結果返回時,進程暫停運行該任務,開始繼續處理上一個任務

Nginx上面的某一個進程收到客戶端的一個訪問請求,不管客戶端訪問的是哪一個頁面,進程都要去本地的磁盤找到網頁文件,找到以後給客戶端響應,可是nginx進程沒有權限操縱硬件尋找網頁,因此進程要先將請求轉交給內核,由kernel去磁盤中搜索這個文件,找到文件將文件返回給進程,再由進程返回給客戶端,
所謂阻塞指的是:
進程將請求轉交給內核以後進程會一直等待內核返回給它結果纔會接收其餘的訪問請求,而這段期間進程就處於sleeping的狀態;
而非阻塞指的是:
進程不會等待內核,而是能夠繼續接收下一個請求,當內核將第一個請求的結果返回給進程以後,進程會暫停當前正在接收的請求,來響應內核返回給它的結果。

####  Nginx 經常使用架構
# 1. client  nginx  PHP            # nginx 和 PHP 結合解析靜態頁面和 PHP 頁面
# 2. client 訪問靜態頁面,由 nginx 解析: 動態頁面,nginx 代理到後端的 Web 上解析
# 3. nginx 自己不負責任何頁面的相應,client 不管訪問靜態仍是動態都代理到後端的服務器上:
#	Nginx 對操做系統自己的性能消耗很是小的,故由 nginx 來接收客戶端鏈接,能夠增長客戶端訪問速度.另 nginx 支持緩存功能,也能夠加快客戶端的訪問速度(沒有緩存會增長 nginx 代理和 Web 的交互)。
#	大多數加快網站的訪問速度的方法都是緩存,固然緩存不只僅可使用 nginx 服務器,還能夠專門搭建一個緩存服務器
HTTP 的請求報文和響應報文

HTTP 請求報文語法

<method><request-URL><version>
<headers>
<entity-body>
method:              # 客戶端請求網站資源的方法:GET、PUT、POST、Delete、HEAD
request-URL:         # 請求的地址,就是網址(F12---&gt;Network---&gt;Header)
version:             # 請求 http 的版本
headers:             # 報文頭
entity-body:         # 請求的實體

HTTP 響應報文語法

<version><status><reason-phrase>
<headers>
<entity-body>
響應報文示例
HTTP/1.1 200 OK
X-Powerd=By: PHP/5.2.17                   # 頁面的結果是 PHP 應用程序返回來的
Vary: Accept-Encoding,Cookie,User-Agent
Cache-Control: max-age=3,must-revalidate  # 緩存
Content-Encoding: gzip                    # 內容的編碼採用壓縮
Content-Length: 6931                      # 內容的長度

Nginx 軟件下載:

http://nginx.org/

Nginx 版本類型
Mainline version:      #主線版,即開發版
Stable version:        # 最新穩定版,生產環境上建議使用的版本
Legacy versions:       #  遺留的老版本的穩定版

yum 部署 Nginx

cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF

yum -y install nginx
systemctl start nginx && systemctl enable nginx
# 查看nginx軟件版本
nginx -v
# nginx version: nginx/1.16.1

# -V顯示nginx編譯參數
# nginx -V
# nginx version: nginx/1.16.1
# built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
# built with OpenSSL 1.0.2k-fips  26 Jan 2017
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

# 檢測配置文件語法(-c 能夠指定非默認配置文件)
# nginx -t    # 測試默認配置文件
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

# nginx -s stop            # 中止nginx
# nginx -s reload          # 從新加載配置文件

源碼部署 Nginx

#!/usr/bin/env bash
# Author: ZhouJian
# Mail: 18621048481@163.com
# Time: 2019-9-3
# Describe: CentOS 7 Install Nginx Source Code Script

version="nginx-1.14.2.tar.gz"
user="nginx"
nginx=${version%.tar*}
path=/usr/local/src/$nginx
echo $path
if ! ping -c2 www.baidu.com &>/dev/null
then
	echo "網絡不通,沒法安裝"
	exit
fi

yum install -y gcc gcc-c++ openssl-devel pcre-devel make zlib-devel wget psmisc
#if [ ! -e $version ];then
#	wget http://nginx.org/download/$version
#fi
if ! id $user &>/dev/null
then
	useradd $user -M -s /sbin/nologin
fi

if [ ! -d /var/tmp/nginx ];then
	mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
fi
tar xf $version -C /usr/local/src
cd $path
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_realip_module \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre \
--with-file-aio \
--with-http_secure_link_module && make && make install
if [ $? -ne 0 ];then
	echo "nginx未安裝成功"
	exit
fi

killall nginx
/usr/local/nginx/sbin/nginx
#echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
#chmod +x /etc/rc.local
#systemctl start rc-local
#systemctl enable rc-local
ss -antp |grep nginx

編譯參數介紹

--with-http_ssl_module \                    	        ---# 支持 https 加密傳輸
--with-http_flv_module \                  	        	---# 支持流媒體功能,視頻等
--with-http_stub_status_module \      	                ---# 支持子狀態模塊,顯示 nginx 的狀態
--with-http_sub_module \              	                ---# nginx 替換網站響應內容
--with-http_gzip_static_module \       	                ---# 支持壓縮功能,將數據壓縮以後給客戶端響應,客戶端收到數據,瀏覽器調用相應的程序自動解壓,主要爲了節省中間的寬度
--with-http_auth_request_module \       	        	---# 認證模塊
--with-http_random_index_module \         	        	---# 隨機顯示首頁模塊
--with-http_realip_module \                   	        ---# Nginx 獲取真實 IP 模塊
--http-client-body-temp-path=/var/tmp/nginx/client \    ---# 存取客戶端臨時數據
--http-proxy-temp-path=/var/tmp/nginx/proxy \           ---# 存取代理臨時數據
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \       ---# 讓 nginx 以 fastcgi 的機制和後端的應用程序通信
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \           ---# 和 python 相關的文件
--http-scgi-temp-path=/var/tmp/nginx/scgi \             ---# 安全的後端通信方式
--with-pcre \                                           ---# 支持 pcre 正則表達式
--with-file-aio \                                       ---# 支持文件的異步 IO,就是異步非阻塞
--with-http_secure_link_module &amp;&amp; make &amp;&amp; make install  ---# secure_link_module 支持安全連接

Nginx基本配置

大的層面分紅三個模塊

CoreModule             # 全局配置  核心模塊
EventsModule           # 事件驅動模塊
HttpCoreModule         # http內核模塊(做爲網站服務器的模塊)

Nginx配置文件

yum安裝nginx經過rpm -ql nginx查看
源碼安裝nginx去到安裝目錄conf/目錄下便可看到

/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params	 #fastcgi的參數
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types 		#存放非文本傳輸所支持的格式
/etc/nginx/modules 			#模塊已經被編譯到了nginx程序中了
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params 	#和python作結合用的配置文件
/etc/nginx/win-utf
/etc/nginx/fastcgi.conf:	# nginx經過fastcgi的機制調用後端的應用程序解析動態頁面
		#CGI:能提供和開發程序通訊的接口,是一個交流程序,調用開發的程序能夠在網頁上面是內容
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service 	#調試模式
/usr/lib/systemd/system/nginx.service 			#systemd的啓動腳本
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.12.1
/usr/share/doc/nginx-1.12.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx 	#nginx的各類臨時緩存信息
/var/log/nginx

Nginx配置語法

  1. 配置文件由指令與指令塊構成
  2. 每條指令以;分號結尾,指令與參數間以空格符號分隔
  3. 指令塊以{}大括號將多條指令組織在一塊兒
  4. include語句容許組合多個配置文件以提高可維護性
  5. 使用# 符號添加註釋,提升可讀性
  6. 使用$符號可使用變量
  7. 部分指令參數支持正則表達式

Nginx工做原理

Nginx做爲WEB服務器?

Nginx是基於http協議實現的web服務器,經過epoll技術實現I/O多路複用,採用異步非阻塞實現高併發請求,高度的模塊化設計;

異步非阻塞: 1個master 2個work進程

每進來一個request,會有一個work進程去處理,但不是全程處理,處理到可能發生堵塞的地方,好比後端服務器轉發request,並等待請求返回,那麼,這個處理的work不會這麼一直這麼等着,發送請求後,註冊一個事件「若是upstream返回了,告訴我一聲,我再接着幹」,因而他就休息去了,這就是異步,若是再有request進來,他就能夠很快按照這種方式處理

Nginx做爲代理服務器?

代理服務器來接受Internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給Internet上鍊接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器;

Nginx做爲內容服務器的負載均衡器?

當客戶機向站點提出請求時候,請求轉向負載均衡服務器,而後,負載均衡服務器經過防火牆特定通路,將客戶機的請求按照必定規則發送到後端內容服務器,後端內容服務器再經過該通道將結果回傳給負載均衡器,負載均衡服務器將檢索的信息發給客戶機,好像負載均衡器就是實際的內容服務器;

nginx.conf配置文件解讀


cat /etc/nginx/nginx.conf
user  nginx;                        # 定義Nginx運行的用戶或用戶組
worker_processes  1;                # 啓動的worker進程數量,若是是CPU密集型,如作加密網站或啓用壓縮功能,worker數量.
                                    # 若是是CPU密集型,如作加密網站或啓用壓縮功能,worker數量與CPU個數一致
                                    # 若是是IO密集型,如響應大量客戶端,worker進程個數爲CPU個數的兩倍,或者直接設置爲auto便可

error_log  /var/log/nginx/error.log warn;    # 全局錯誤日誌定義類型,[debug |info |notice |warn |error |crit]

pid        /var/run/nginx.pid;      # 進程文件

worker_rlimit_nofile 65535;                       # 一個nginx進程打開的最多文件描述符數,理論值應該是最多打開文件數(系統值ulimit -n)與nginx進程數相除,可是nginx分配請求並不均勻,因此建議與ulimit -n的值保持一致.

#工做模式與鏈接數上限
events {
    use epoll;                      # 事件驅動模型epoll [默認就是epool],use [kqueue | rtsig |epoll |/dev/poll |select |poll]; epoll是linux2.6以上版本內核中的高性能網絡I/O模型,若是跑在FreeBSD上面,就用kqueue模型.

    worker_connections  1024;       # 每一個worker進程容許處理的最大鏈接數,標準值10240,服務器配置高能夠調成65535,具體性須要對網站作壓力測試得到,服務器可以接受的最大的鏈接數是:worker_connection * work_processors
}

#設定http服務器
http {
    include       /etc/nginx/mime.types;        # 文件擴展名與文件類型映射表
    default_type  application/octet-stream;     # 默認文件類型
    # charset utf-8;                            # 默認編碼
    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;
    server_names_hash_bucket_size 128;          # 服務器名字的hash表大小
    client_header_buffer_size 32k;              # 上傳文件大小限制
    large_client_header_buffers 4 64k;          # 設定請求緩存
    client_max_body_size 8m;                    # 設定請求緩存
    server_tokens off;                          # 隱藏版本號,apache是在配置文件加入一行serverSignature off
    sendfile        on;                         #開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲no,若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,下降系統的負載.注意: 若是圖片顯示不正常改爲off。
    autoindex on;                               #開啓目錄列表訪問,合適下載服務器,默認關閉
    #tcp_nopush on;                             #防止網絡堵塞
    #tcp_nodelay on;                            #防止網絡堵塞
    keepalive_timeout 65;                       #長鏈接超時時間,單位是秒

# Fastcgi相關參數是爲了改善網站的性能,減小資源佔用,提升訪問速度,下面參數看字面意思都能理解.
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

# gzip模塊設置
    gzip  on;                                      # 開啓gzip壓縮輸出
    gzip_min_length 1k;                            # 最小壓縮文件大小
    gzip_buffers 4 16k;                            # 壓縮緩衝區
    gzip_http_version 1.0;                         # 壓縮版本(默認1.1,前端若是squit2.5請使用1.0)
    gzip_comp_level 2;                             # 壓縮等級
    gzip_types text/plain application/x-javascript text/css application/xml;    # 壓縮類型,默認就已經包含text/html,因此下面就不用再寫了,寫上去也不會有問題,可是會有一個warn.
    gzip_vary on;
    #limit_zone crawler $binary_remote_addr 10m;   # 開啓限制Ip鏈接數的時候須要使用.
  upstream blog.ha97.com {
        server 192.168.122.3:80    weight=3;
        server 192.168.122.4:80    weight=4;
        server 192.168.122.5:80    weight=5;
    } 
    include /etc/nginx/conf.d/*.conf;
}

總體規劃:
http {
    server {
        location {}
        location {}
    }
}
server{  }        #一對server就是nginx的一個虛擬主機
location{}        #定義客戶端的URL地址,根據URL地址不一樣,給客戶端不一樣的響應,須要使用正則表達式

# 虛擬主機配置
cat /etc/nginx/conf.d/default.conf
server {
    listen       80;                                                # 監聽端口
    server_name  localhost;                                         # 虛擬主機的主機名,也能夠是域名,能夠有多個,用逗號隔開
    #charset koi8-r;                                                # 字符集
    #access_log  /var/log/nginx/host.access.log  main;              # 使用main這種日誌格式,nginx的日誌格式都須要先定義,而後才能使用,惟獨combined是nginx默認就是支持的日誌格式
    location / {                                                    # 網站根目錄,URI地址; 客戶端所訪問的URI地址實際上是location裏面root後面的目錄名+location後面的URI的組合
        root   /usr/share/nginx/html;                               # 網站的主目錄
        index  index.html index.htm;                                # 首頁文件
    }

# 圖片緩存時間設置
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 10d
    }

# JS和CSS緩存時間設置
    location ~ .*\.(js|css)?$
    {
        expires 1h;
    }
    #error_page  404              /404.html;                        # 當請求頁面不存在時,返回碼404顯示的頁面
    # redirect server error pages to the static page /50x.html      # 若是客戶端訪問nginx服務器,nginx服務器給客戶端返回500 502 503或者504的錯誤,那麼客戶端在瀏覽器裏面看到的就是50x.html頁面
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # 對"/"啓用反向代理
    location / {
        proxy_pass http://127.0.0.1:80;
        proxy_redirect off;
        proxy_set_header X-Read-IP $remote_addr;                    # 後端的web服務器能夠經過X-Forwarded-For獲取用戶真實IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 如下是一些反向代理的配置,可選
        proxy_set_header Host $host;
        client_max_body_size 10m;                                   # 容許客戶端請求的最大單文件字節數
        client_body_buffer_size 128k;                               # 緩衝區代理緩衝用戶端請求的最大字節數
        proxy_connect_timeout 90;                                   # nginx跟後端服務器鏈接超時時間(代理鏈接超時)
        proxy_send_timeout 90;                                      # 後端服務器數據回傳時間(代理髮送超時)
        proxy_read_time 90;                                         # 鏈接成功後,後端服務器的響應時間(代理接收超時)
        proxy_buffer_size 4k;                                       # 設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
        proxy_buffers 4 32k;                                        # proxy_buffers緩衝區,網頁平均在32k如下的設置
        proxy_busy_buffers_size 64k;                                # 高負荷下緩衝大小 (proxy_buffers*2)
        proxy_temp_file_write_size 64k;                             # 設定緩存文件夾大小,大於這個值,將從upstream服務器傳
    } 

    # 設定查看Nginx狀態的地址
    location /NginxStatus {
        stub_status on;
        access_log on;
        auth_basic "NginxStatus";
        auth_basic_user_file conf/htpasswd;
        # htpasswd文件的內容能夠用apache提供的htpasswd工具產生
    }

    # 本地動靜分離反向代理設置
    # 全部jsp的頁面均交由tomocat或resin處理
    location ~ .(jsp|jspx|do)?$ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8080;
    }
    # 全部靜態文件由nginx直接讀取不通過tomcat或resin
    location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
    { expires 15d; }
    location ~ .*.(js|css)?$
    { expires 1h; }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
    # 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_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
相關文章
相關標籤/搜索