nginx 篇
nginx
安裝
下載必要組件
-
nginx下載地址
http://nginx.org/en/download.html -
pcre庫下載地址,nginx需要
http://sourceforge.net/projects/pcre/files/pcre/ -
zlib下載地址,nginx需要
http://www.zlib.net/ -
openssl下載地址,nginx需要
https://github.com/openssl/openssl
在同級目錄下,解壓安裝zlib、openssl、pcre
創建 /usr/local/zlib? ? ?/usr/local/openssl ? ? /usr/local/pcre ? ? /usr/local/nginx? ?四個文件夾。為以防萬一,都給足權限 chmod 777?
1、因為是零初始環境,所以要安裝一些基本的文件,否則后面會狂報錯
1)安裝GCC軟件套件::yum install gcc ? ?否則會報錯?configure: error: no acceptable C compiler found in $PATH
2)安裝解壓縮:?yum install -y unzip zip ? ?否則會報錯?unzip: command not found
3)安裝c++編譯環境:yum groupinstall "Development Tools" ? ? ?因后面的pcre需要用C++編譯。注意(Debian系統使用命令apt-get,對應工具包為build-essential,命令使用方法:apt-get install build-essential)
4)?安裝解壓縮:?yum install -y unzip zip ? ?否則會報錯?unzip: command not found
5)安裝pcre-devel解決問題? ?yum -y install pcre-devel
6)安裝?openssl-devel ? ? ??yum -y install openssl openssl-devel
2、安裝過程
第一步:j進入建立的文件夾 /usr/local/nginx
第二步:解壓?tar -zxvf nginx-*.*.tar.gz ?并進入解壓之后的目錄
第三步:設置一下配置信息??
進入nginx目錄,進行配置安裝
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre=/usr/local/pcre --with-zlib=/usr/local/zlib --with-openssl=/usr/local/openssl?
第四步:
make?編譯 (make的過程是把各種語言寫的源碼文件,變成可執行文件和各種庫文件)
make install?安裝 (make install是把這些編譯出來的可執行文件和庫文件復制到合適的地方
3、nginx的啟動
Nginx會被安裝在/usr/local/nginx目錄下(也可以使用參數--prefix=指定自己需要的位置), 安裝成功后 /usr/local/nginx 目錄下有四個子目錄分別是:conf、html、logs、sbin 。 其中 Nginx 的配置文件存放于 conf/nginx.conf, bin文件是位于 sbin 目錄下的 nginx 文件。 確保系統的 80 端口沒被其他程序占用,運行 sbin/nginx 命令來啟動 Nginx,啟動nginx
sudo /usr/local/nginx/sbin/nginx#netstat -ano|grep 80tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 關閉 (0.00/0/0) unix 17 [ ] 數據報 10801 /dev/log關閉nginx服務
若要關閉Nginx,則在終端中 ps aux | grep nginx? ,然后kill 掉相關進程即可。或者輸入?usr/local/nginx/sbin/nginx -s stop來停止,該命令 -s 表示將signal 發送到nginx主進程中。
?
打開瀏覽器訪問此機器的 IP,如果瀏覽器出現 Welcome to nginx! 則表示 Nginx 已經安裝并運行成功
# 檢查配置文件是否正確# /usr/local/sbin/nginx -t # 可以看到編譯選項# /usr/local/sbin/nginx -V#重啟Nginx#sudo /usr/local/sbin/nginx -s reload #關閉Nginx #sudo /usr/local/sbin/nginx -s stop #優雅停止服務 #sudo /usr/local/sbin/nginx -s quit #kill -s SIGQUIT pid_master #kill -s SIGWINCH pid_master配置
nginx.conf配置文件,基本就分為以下幾塊:
main events {.... } http {....upstream myproject {.....}server { .... location { .... } } server { .... location { .... } } .... }nginx配置文件主要分為六個區域:
- main(全局設置)
- events(nginx工作模式)
- http(http設置)
- sever(主機設置)
- location(URL匹配)
- upstream(負載均衡服務器設置)
下面依次來看下具體內容
- main模塊
下面時一個main區域,他是一個全局的設置:
user nobody nobody; worker_processes 2; error_log /usr/local/var/log/nginx/error.log notice; pid /usr/local/var/run/nginx/nginx.pid; worker_rlimit_nofile 1024;user 來指定Nginx Worker進程運行用戶以及用戶組,默認由nobody賬號運行。
worker_processes來指定了Nginx要開啟的子進程數。每個Nginx進程平均耗費10M~12M內存。根據經驗,一般指定1個進程就足夠了,如果是多核CPU,建議指定和CPU的數量一樣的進程數即可。我這里寫2,那么就會開啟2個子進程,總共3個進程。
error_log用來定義全局錯誤日志文件。日志輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日志最為最詳細,而crit輸出日志最少。
pid用來指定進程id的存儲文件位置。
worker_rlimit_nofile用于指定一個nginx進程可以打開的最多文件描述符數目,這里是65535,需要使用命令“ulimit -n 65535”來設置。
- events 模塊
events模塊來用指定nginx的工作模式和工作模式及連接數上限,一般是這樣:
events {use epoll; #Linux平臺worker_connections 1024; }use用來指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中,對于Linux系統,epoll工作模式是首選。
worker_connections用于定義Nginx每個進程的最大連接數,即接收前端的最大請求數,默認是1024。最大客戶端連接數由worker_processes和worker_connections決定,即Max_clients=worker_processes*worker_connections,在作為反向代理時,Max_clients變為:Max_clients = worker_processes * worker_connections/4。 進程的最大連接數受Linux系統進程的最大打開文件數限制,在執行操作系統命令“ulimit -n 65536”后worker_connections的設置才能生效。
- http 模塊
http模塊可以說是最核心的模塊了,它負責HTTP服務器相關屬性的配置,它里面的server和upstream子模塊,至關重要,等到反向代理和負載均衡以及虛擬目錄等會仔細說。
http{include mime.types;default_type application/octet-stream;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 /usr/local/var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 10; #gzip on; upstream myproject { ..... } server { .... } }下面詳細介紹下這段代碼中每個配置選項的含義。
include 來用設定文件的mime類型,類型在配置文件目錄下的mime.type文件定義,來告訴nginx來識別文件類型。
default_type設定了默認的類型為二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置asp 的locate 環境時,Nginx是不予解析的,此時,用瀏覽器訪問asp文件就會出現下載了。
log_format用于設置日志的格式,和記錄哪些參數,這里設置為main,剛好用于access_log來紀錄這種類型。
main的類型日志如下:也可以增刪部分參數。
127.0.0.1 - - [21/Apr/2015:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"access_log
用來紀錄每次的訪問日志的文件地址,后面的main是日志的格式樣式,對應于log_format的main。
sendfile參數用于開啟高效文件傳輸模式。將tcp_nopush和tcp_nodelay兩個指令設置為on用于防止網絡阻塞。
keepalive_timeout設置客戶端連接保持活動的超時時間。在超過這個時間之后,服務器會關閉該連接。
- server 模塊
sever 模塊是http的子模塊,它用來定一個虛擬主機,我們先講最基本的配置,這些在后面再講。
我們看一下一個簡單的server 是如何做的?
server {listen 8080;server_name localhost 192.168.12.10 www.yangyi.com;# 全局定義,如果都是這一個目錄,這樣定義最簡單。root /Users/yangyi/www;index index.php index.html index.htm; charset utf-8; access_log usr/local/var/log/host.access.log main; aerror_log usr/local/var/log/host.error.log error; .... }server標志定義虛擬主機開始。
listen用于指定虛擬主機的服務端口。
server_name用來指定IP地址或者域名,多個域名之間用空格分開。
root 表示在這整個server虛擬主機內,全部的root web根目錄。注意要和locate {}下面定義的區分開來。
index 全局定義訪問的默認首頁地址。注意要和locate {}下面定義的區分開來。
charset用于設置網頁的默認編碼格式。
access_log用來指定此虛擬主機的訪問日志存放路徑,最后的main用于指定訪問日志的輸出格式。
- location 模塊
location模塊是nginx中用的最多的,也是最重要的模塊了,什么負載均衡啊、反向代理啊、虛擬域名啊都與它相關。慢慢來講:
location 根據它字面意思就知道是來定位的,定位URL,解析URL,所以,它也提供了強大的正則匹配功能,也支持條件判斷匹配,用戶可以通過location指令實現Nginx對動、靜態網頁進行過濾處理。像我們的php環境搭建就是用到了它。
我們先來看這個,設定默認首頁和虛擬機目錄。
location / {root /Users/yangyi/www;index index.php index.html index.htm;}location /表示匹配訪問根目錄。
root指令用于指定訪問根目錄時,虛擬主機的web目錄,這個目錄可以是相對路徑(相對路徑是相對于nginx的安裝目錄)。也可以是絕對路徑。
#反向代理配置location /itcast/ {proxy_pass http://127.0.0.1:12345;proxy_set_header X-real-ip $remote_addr;proxy_set_header Host $http_host; } #采用uwsgi方式 location /python/ { include uwsgi_params; uwsgi_pass 127.0.0.1:33333; } #訪問nginx本機目錄的文件 location / { root /home/itcast/xwp/itcast/; index index.html index.htm; } location /static/ { alias /var/static/; }- upstram 模塊
upstream 模塊負債負載均衡模塊,通過一個簡單的調度算法來實現客戶端IP到后端服務器的負載均衡。我先學習怎么用,具體的使用實例以后再說。
upstream test.com{ip_hash;server 192.168.123.1:80;server 192.168.123.2:80 down;server 192.168.123.3:8080 max_fails=3 fail_timeout=20s; server 192.168.123.4:8080; }在上面的例子中,通過upstream指令指定了一個負載均衡器的名稱test.com。這個名稱可以任意指定,在后面需要的地方直接調用即可。
里面是ip_hash這是其中的一種負載均衡調度算法。
Nginx的負載均衡模塊目前支持4種調度算法:
- weight 輪詢(默認)。每個請求按時間順序逐一分配到不同的后端服務器,如果后端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。weight。指定輪詢權值,weight值越大,分配到的訪問機率越高,主要用于后端每個服務器性能不均的情況下。
- ip_hash。每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個后端服務器,有效解決了動態網頁存在的session共享問題。
- fair。比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據后端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支持fair的,如果需要使用這種調度算法,必須下載Nginx的upstream_fair模塊。
- url_hash。按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,可以進一步提高后端緩存服務器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調度算法,必須安裝Nginx 的hash軟件包。
在HTTP Upstream模塊中,可以通過server指令指定后端服務器的IP地址和端口,同時還可以設定每個后端服務器在負載均衡調度中的狀態。常用的狀態有:
down,表示當前的server暫時不參與負載均衡。
backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這臺機器的壓力最輕。
max_fails,允許請求失敗的次數,默認為1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。
fail_timeout,在經歷了max_fails次失敗后,暫停服務的時間。max_fails可以和fail_timeout一起使用。
注意 當負載調度算法為ip_hash時,后端服務器在負載均衡調度中的狀態不能是weight和backup。
備注: nginx的worker_rlimit_nofile達到上限時,再有客戶端鏈接報502錯誤. 用了log_format指令設置了日志格式之后,需要用access_log指令指定日志文件的存放路徑.
反向代理
正向代理,也就是傳說中的代理,他的工作原理就像一個跳板,簡單的說,我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器,這個代理服務器呢,他能訪問那個我不能訪問的網站,于是我先連上代理服務器,告訴他我需要那個無法訪問網站的內容,代理服務器去取回來,然后返回給我。 從網站的角度,只在代理服務器來取內容的時候有一次記錄,有時候并不知道是用戶的請求,也隱藏了用戶的資料,這取決于代理告不告訴網站。結論就是,正向代理 是一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器),然后代理向原始服務器轉交請求并將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。
從用途上來講:
正向代理的典型用途是為在防火墻內的局域網客戶端提供訪問Internet的途徑。正向代理還可以使用緩沖特性減少網絡使用率。反向代理的典型用途是將防火墻后面的服務器提供給Internet用戶訪問。反向代理還可以為后端的多臺服務器提供負載平衡,或為后端較慢的服務器提供緩沖服務。另外,反向代理還可以啟用高級URL策略和管理技術,從而使處于不同web服務器系統的web頁面同時存在于同一個URL空間下。反向代理服務器的基本配置
proxy_pass
proxy_pass URL;配置塊 location if此配置將當前請求代理到URL參數指定的服務器上,URL可以是主機名或者IP地址加PORT的形式proxy_pass http://localhost:8000;也可以結合負載均衡實用<負載均衡會說明這種情況>也可以吧HTTP轉換成HTTPSproxy_pass http://192.168.0.1;默認情況反向代理不轉發請求中的Host頭部,如果需呀設置抓發頭部則 proxy_set_header Host $host;proxy_method
proxy_method method_name;配置塊 http server location此配置項表示轉發時的協議方法名:proxy_method POST;那么客戶端發來的GET請求在轉發時方法改為POST;proxy_hide_header
proxy_hide_header header1;配置塊 http server location;Nginx會將上游服務器的響應轉發給客戶端,但默認不轉發HTTP頭部字段(Date Server X-Pad X-Accel-* )使用proxy_hide_header可以指定任意頭部不能被轉發proxy_hide_header Cache-Control;proxy_hide_header MicrosoftOfficeWebServer;proxy_pass_header
proxy_pass_header header1;配置塊 http server location功能與 proxy_hide_header相反,是設置哪些頭部允許轉發.proxy_pass_header X-Accel-Redirect;proxy_pass_request_body
proxy_pass_request_body off|on;默認 on配置塊 http server location;確定上游服務器是否向上游服務器轉發HTTP包體proxy_pass_request_header
proxy_pass_request_header on | off;默認on配置塊 http server location確定是否轉發HTTP頭部proxy_redirect
proxy_redirect [default | off |redirect |replacement]默認default配置塊 http server location當上游服務響應時重定向或刷新(HTTP 301 302),proxy_redirect可以重設HTTP頭部的location或refresh字段proxy_redirect http://locahost:8000/two/ http://frontend/one/;上游響應302,location是URI是http://locahost:8000/two/some/uri/那是實際轉發給客戶端的是 http://frontend/one/some/uri/;可以使用前面提到的ngx_http_core_module模塊提供的變量 proxy_redirect http://locahost:8000/two/ http://$host:server_port/;可以省略replacement參數的主機名部分,這時候用虛擬主機名填充proxy_redirect http://locahost:8000/two/ /one/;使用off參數的時候,將使location和refresh的字段維持不變proxy_redirect off;如果使用的 proxy_redirect default;下面兩種配置是等效的location /{proxy_pass http://upstream:port/two/;proxy_redirect default;}location /{proxy_pass http://upstream:port/two/;proxy_redirect http://upstream:port/two/ /one/;}proxy_next_upstream
proxy_next_upstream [error |timeout |invalid_header |http_500 |http_502~504 |http_404 | off]默認 proxy_next_upstream error timeout;配置塊 http server location此配置表示上游一臺服務器轉發請求出現錯誤時,繼續換一套服務器處理這個請求其參數用來說明在那些情況下繼續選擇下一臺上游服務器轉發請求.error 向上游發起連接 發送請求 讀取響應時出錯timeout 發送請求或讀取響應時出錯invalid_header 上游服務器發送的響應時不合法http_500 上游響應500http_502 上游響應502http_503 上游響應503http_504 上游響應504http_404 上游響應404off 關閉proxy_next_upstream功能 只要一出錯就選擇另外一臺上游再次出發 Nginx反向代理模塊中還提供很多配置,如設置連接的超時時間,臨時文件如何存儲,如何緩存上游服務器響應等功能.可以通過閱讀 ngx_http_proxy_module了解更多詳細情況
#sudo vim /usr/local/nginx/conf/nginx.conf server {listen 80;server_name localhost;location / {#保證代理機器能訪問到 下面的機器并裝有nginx 在主機號為100的機器上有響應網頁 proxy_pass http://192.168.1.100; root html; index index.html index.htm; } } sudo /usr/local/nginx/sbin/nginx -s reload加一些判斷條件 獲取到 對方請求的主機 防止別人代理到自己的主機上
負載均衡
負載均衡是由多臺服務器以對稱的方式組成一個服務器集合,每臺服務器都具有等價的地位,都可以單獨對外提供服務而無須其他服務器的輔助。通過某種負載分擔技術,將外部發送來的請求按照事先設定分配算法分配到對稱結構中的某一臺服務器上,而接收到請求的服務器獨立地回應客戶的請求。
均衡負載能夠平均分配客戶請求到服務器列陣,籍此提供快速獲取重要數據,解決大量并發訪問服務問題。
upstream塊
upstream name {...} 配置塊 http upstream塊定義一個上游服務器的集群,便于反向代理中的proxy_pass使用upstream mynet{server www.wopai1.com;server www.wopai2.com;server www.wopai3.com; } server {location /{proxy_pass http://mynet;} }server
server name [paramenters] 配置塊upstream server配置項指定了一臺上游服務器的名字,可以是域名 IP地址端口 UNIX句柄 weight= number;設置向這臺服務器轉發的權重,默認為1 max_fails=number;該選項域fail_timeout配合使用指在fail_timeout時間段內如果轉發上游失敗超過number次就認為當前的fail_timeout時間內這臺服務器不可用,max_fails默認為1 如果設置為0 表示不檢查失敗次數 fail_timeout=time; fail_timeout表示該時間內轉發多少次失敗后就認為上游不可用.默認10s down 表示上游服務器永久下線,只能在ip_hash配置時才有效 backup 在ip_hash配置時無效.只有所有非備份機都失敗,才向上游備份服務器轉發請求. upstream mynet{server www.wopai1.com weight=5;server www.wopai2.com:8081 max_fails=3 fail_timeout=300s;server www.wopai2.com down; }ip_hash
配置塊 upstream 希望來自某一個用戶的請求始終落在固定的一臺服務器上進行處理. 根據客戶端的IP散列計算出一個key,將key按照upstream集群中的上游服務器進行取模,求得的值對應的主機接收轉發請求. ip_hash不可以與weight同時使用 如果upstream配置中有一臺服務器暫時不可用,不能直接刪除該配置,而應該使用down標識. upstream mynet{ip_hash;server www.wowpai1.top;server www.wowpai2.top; server www.wowpai3.top down; }例子,服務器負載均衡基本配置,nginx中可以進行負載均衡的相關設置:
upstream my.net{ #my.net是自定義的命名 在server結構中引用即可#代理服務器為 兩臺機器192.168.22.136 192.168.22.147做負載均衡操作 #兩臺機器上 可以跑apache負載功能更為強大的網頁相關任務#max_fails 表示嘗試出錯最大次數 即可認為該服務器 在fail_timeout時間內不可用# server servername:port servername可以寫主機名 或者點分式IP server 192.168.22.136:80 max_fails=1 fail_timeout=300s; server 192.168.22.147:80 max_fails=1 fail_timeout=300s; } server { listen 80; server_name localhost; location / { #upstream 塊名 proxy_pass http://my.net; root html; index index.html index.htm; }動手開始配置才能慢慢上手nginx配置和使用。
淘寶團隊出品,高質量講nginx的電子書
http://tengine.taobao.org/book/轉載于:https://www.cnblogs.com/jackzz/p/10860409.html
總結
- 上一篇: 关于background-*的一些属性
- 下一篇: caxa自动保存的文件在哪里_CAXA2