【介紹】 html
nginx是如今互聯上很是流行的高性能的 Web 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。 前端
如今不少互聯網應用都使用nginx來做爲負載均衡的使用,再高併發的狀況下,使用Nginx來代替Apache是一種很不錯的選擇。 nginx
【安裝】 c++
·安裝編譯工具以及庫文件· web
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel正則表達式 |
·安裝PCRE· vim
PCRE的做用是爲了Nginx支持Rewrite功能。 後端
1. 下載PCRE安裝包瀏覽器
cd /usr/local/src/ |
2. 解壓
tar zxvf pcre-8.35.tar.gz |
3. 進入安裝包目錄,編譯安裝
cd pcre-8.35 |
4. 查看版本
pcre-config --version |
·安裝nginx·
1. 下載安裝包
cd /usr/local/src/ |
2. 解壓
tar zxvf nginx-1.6.2.tar.gz |
3. 進入安裝包目錄,編譯安裝
cd nginx-1.6.2 make && make install |
4. 查看nginx版本
/usr/local/webserver/nginx/sbin/nginx -v |
5. 將nginx命令設置爲全局
cp /usr/local/webserver/nginx/sbin/nginx /usr/bin |
【配置】
vim /usr/local/webserver/nginx/conf/nginx.conf
worker_processes 2; #設置值和CPU核心數一致 server { listen 80; #監聽端口 } |
【啓動】
修改完成配置以後,使用如下命令檢查一下配置:
nginx -c /usr/local/webserver/nginx/conf/nginx.conf nginx -t |
使用如下命令加載配置文件並重啓:
nginx -s reload |
查看一下防火牆是否關閉,若是未關閉須要關閉,不然從瀏覽器訪問80端口可能受阻。
systemctl status firewalld |
在瀏覽器頁面上輸入IP加端口,能夠顯示出如下頁面即爲安裝成功(可能須要等待幾分鐘)
【配置優化】
以上的配置只是最最基本的配置,只能讓nginx簡單得跑起來,咱們依然須要如下配置使nginx實現反向代理或者負載均衡。
設置用戶 #user nobody;
工做進程數,通常設置爲cpu核心數 worker_processes 1;
pid文件(保證進程只有一個) pid /run/nginx.pid;
events { 最大鏈接數,通常設置爲cpu*2048 worker_connections 1024; }
http { 開啓gzip壓縮(提升傳輸速率)(須要客戶端瀏覽器和nginx服務器同時支持) gzip on;
壓縮最小文件大小 gzip_min_lenth 1k;
壓縮申請內存(4個16k的數據流) gzip_buffers 4 16k;
http協議版本號(不對應的話是不支持壓縮的) gzip_http_version 1.1;
若是客戶端瀏覽器不支持,則不進行壓縮 gzip_vary on;
日誌格式 log_format main
客戶端IP 客戶端用戶名 請求URL '$remote_addr - $remote_user [$time_local] "$request" '
請求狀態 返回給客戶端的字節數 源網頁(百度->百度貼吧) '$status $body_bytes_sent "$http_referer" '
客戶端瀏覽器信息 客戶端IP地址(和$remote_addr差很少) '"$http_user_agent" "$http_x_forwarded_for"';
日誌路徑 off表明不存儲日誌,後面跟着日誌的位置,main表明使用的日誌格式 access_log off access_log logs/access.log main;
客戶端連接超時時間(有長鏈接的時候,這個字段須要設置大一點) keepalive_timeout 65;
當配置多個server節點時,默認server names的緩存區大小就不夠了,須要手動設置大一點 server_names_hash_bucket_size 512;
server表示虛擬主機能夠理解爲一個站點,能夠配置多個server節點搭建多個站點 每個請求進來由server_name肯定使用哪一個server server {
站點監聽端口 listen 8800;
站點訪問域名,能夠經過此字段判斷使用哪一個server server_name localhost;
編碼格式,避免url參數亂碼 charset utf-8;
location用來匹配同一域名下多個URI的訪問規則好比動態資源如何跳轉,靜態資源如何跳轉等location後面跟着的/表明匹配規則 location / {
站點根目錄,能夠是相對路徑,也能夠是絕對路徑 root html;
默認主頁 index index.html;
轉發後端站點地址,通常用於作軟負載,輪詢後端服務器 proxy_pass http://10.11.12.237:8080;
拒絕請求,返回403,通常用於某些目錄禁止訪問 #deny all;
容許請求 #allow all;
給請求頭中添加客戶請求主機名 proxy_set_header Host $host;
給請求頭中添加客戶端IP proxy_set_header X-Real-IP $remote_addr;
將$remote_addr變量值添加在客戶端"X-Forwarded-For"請求頭的後面,並以逗號分隔。 若是客戶端請求未攜帶"X-Forwarded-For"請求頭,$proxy_add_x_forwarded_for變量值將與$remote_addr變量相同 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
給請求頭中添加客戶端的Cookie proxy_set_header Cookie $http_cookie;
修改從被代理服務器傳來的應答頭中的"Location"和"Refresh"字段。 proxy_redirect [ default | off | redirect replacement ]
若是使用"default"參數,將根據location和proxy_pass參數的設置來決定。 location /one/ { proxy_pass http://upstream:port/two/; proxy_redirect default; }
location /one/ { proxy_pass http://upstream:port/two/; proxy_redirect http://upstream:port/two/ /one/; }
參數off將在這個字段中禁止全部的proxy_redirect指令 proxy_redirect off;
被代理服務器返回Location字段爲: http://localhost:8000/two/some/uri/ 將Location字段重寫爲 http://frontend/one/some/uri/。 proxy_redirect http://localhost:8000/two/ http://frontend/one/;
使用服務器的基本名稱和端口,即便它來自非80端口 proxy_redirect http://localhost:8000/two/ /;
瀏覽器對 Cookie 有不少限制,若是 Cookie 的 Domain 部分與當前頁面的 Domain 不匹配就沒法寫入。 因此若是請求 A 域名,服務器 proxy_pass 到 B 域名,而後 B 服務器輸出 Domian=B 的 Cookie, 前端的頁面依然停留在 A 域名上,因而瀏覽器就沒法將 Cookie 寫入。
不只是域名,瀏覽器對 Path 也有限制。 咱們常常會 proxy_pass 到目標服務器的某個 Path 下,不把這個 Path 暴露給瀏覽器。 這時候若是目標服務器的 Cookie 寫死了 Path 也會出現 Cookie 沒法寫入的問題。
設置"Set-Cookie"響應頭中的domain屬性的替換文本,其值能夠爲一個字符串、正則表達式的模式或一個引用的變量 轉發後端服務器若是須要Cookie則須要將cookie domain也進行轉換,不然前端域名與後端域名不一致cookie就會沒法存取 配置規則。 proxy_cookie_domain serverDomain(後端服務器域) nginxDomain(nginx服務器域) proxy_cookie_domain localhost .testcaigou800.com;
取消當前配置級別的全部proxy_cookie_domain指令 proxy_cookie_domain off;
與後端服務器創建鏈接的超時時間。通常不可能大於75秒;(只是通常狀況,有些長處理可能超時時間較長) proxy_connect_timeout 30; }
後端服務器返回404時顯示的頁面 error_page 404 /404.html;
後端服務器返回500等錯誤的時候顯示的頁面 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
}
當須要對同一端口監聽多個域名時,使用以下配置,端口相同域名不一樣,server_name也能夠使用正則進行配置 但要注意server過多須要手動擴大server_names_hash_bucket_size緩存區大小 server { listen 80; server_name bbb.abc.com; charset utf-8; location / { proxy_pass http://localhost:10001; } } server { listen 80; server_name aaa.abc.com; charset utf-8; location / { proxy_pass http://localhost:20002; } } } |