1、安裝nginxjavascript
一、安裝依賴包php
yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++,其中pcre庫是perl兼容正則表達式庫,用於支持rewrite模塊css
二、配置並安裝nginxhtml
安裝nginx版本爲1.6.3,配置選項以下:前端
./configure --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --prefix=/application/nginx-1.6.3/java
查看全部可用配置選項使用以下命令:node
./configure --helpnginx
編譯安裝nginx:make&&make installc++
三、建立鏈接web
ln -s /applicattion/nginx-1.6.3 /application/nginx
2、配置文件介紹
一、nginx經常使用模塊介紹
1)核心功能模塊
ngx_core_module 對應配置文件中爲main區塊和events區塊,是配置nginx全局參數的地方,其中main區塊指的就是配置文件最上面沒有被任何括號包裹的那些配置項。
2)標準http功能模塊
ngx_http_core_module 核心HTTP參數配置,對應http區塊
ngx_http_access_module 訪問控制模塊
ngx_http_gzip_module 壓縮模塊
ngx_http_fastcgi_module fastcgi模塊,與動態應用相關如PHP
ngx_http_proxy_module 代理模塊
ngx_http_upstream_module 負載均衡模塊,可實現網站負載均衡與健康檢查
ngx_http_rewrite_module URL地址重寫
ngx_http_limit_conn_module 限制用戶併發鏈接數與請求數
ngx_http_limit_req_module 根據定義的key限制nginx請求過程的速率
ngx_http_log_module 訪問日誌模塊,可自定義日誌格式
ngx_http_auth_basic_module web認證模塊,設置nginx用戶經過帳號密碼訪問
ngx_http_ssl_module ssl模塊,用於加密HTTP鏈接如https
ngx_http_stub_status_module 記錄nginx基本訪問狀態信息
二、主配置文件常規參數說明
main區塊,配置文件最開頭沒有大括號包裹的內容
user nginx運行用戶
worker_processes nginx開啓的worker進程數,通常設置爲與CPU內核數相等,worker進程用於創建鏈接
error_log 錯誤日誌的路徑
pid pid文件的路徑
include 用於加載配置文件,能夠用於其餘模塊中
events模塊
worker_connections 單個worker進程的最大鏈接數
http模塊
log_format 訪問日誌的記錄格式與記錄格式的名字
access_log 訪問日誌的路徑
types_hash_max_size hash表佔用的內存最大值
default_type 默認媒體類型
server模塊,配置在http模塊中,用於定義網站相關參數
listen nginx監聽的IP和端口
server_name 網站的域名
location 用於匹配訪問路徑作響應的處理
root 用於定義網站的根目錄
index 用於指定網站首頁路徑
error_page 用於指定http錯誤的錯誤頁路徑 ,能夠將多個http錯誤指定到同一個錯誤頁的路徑下
3、nginx配置虛擬主機
nginx配置虛擬主機有三種方法,依次以下:
一、基於域名,經常使用於外網網站
1)修改server模塊中的server_name參數爲網站對應的域名
2)在server模塊中添加一條location語句,指定網站的根目錄路徑,如location / { root html/blog },其中location匹配的/即表明nginx的安裝目錄路徑,root參數指定的路徑就是從nginx安裝路徑開始的網站的根目錄路徑,若是nginx安裝路徑爲/application/nginx/,則該網站的根目錄路徑爲/application/nginx/html/blog/
3)在公網DNS服務器添加該網站的域名解析記錄
二、基於端口,經常使用於內網網站或公網網站的後臺
1)修改server模塊的listen參數的端口設置,如listen 81;listen 172.16.1.41:81,不一樣的相同IP下的不一樣端口對應不一樣網站
2)添加location記錄,配置網站根目錄
三、基於IP,通常不用
1)修改server模塊的listen參數的IP設置,如listen 172.16.1.41:80;listen 172.16.1.31:80
2)添加location記錄,配置網站根目錄
注:一、企業中一般將全部server模塊配置在一個單獨的文件中,而後在主配置文件中用include參數加載,同時刪除主配置文件中的其餘的server模塊的配置
二、在配置基於域名的虛擬主機時還能夠配置別名,即在server_name參數中配置多個域名以空格分隔
三、在虛擬主機中啓用狀態模塊須要添加一條虛擬主機配置,添加以下的location語句:location / { stub_status on;access_log off; }
4、nginx日誌配置
一、錯誤日誌
錯誤日誌的配置遵循以下格式:error_log 錯誤日誌文件路徑 記錄的錯誤級別;,
錯誤級別通常設置爲error,錯誤日誌通常設置在main模塊中以統一記錄全部錯誤信息
二、訪問日誌
訪問日誌的配置遵循以下格式:access_log 訪問日誌路徑 日誌記錄格式的名字;
訪問日誌的記錄格式配置格式以下:log_format 名字 記錄格式
訪問日誌通常在server模塊中配置,訪問日誌記錄格式通常在http模塊配置
記錄格式中有以下參數可使用:
$remote_addr 訪問網站的客戶端IP
$http_x_forwarded_for 當web服務器前端有代理服務器時,讓web服務器記錄訪問的客戶端IP,該配置生效須要在代理服務器上作以下配置:proxy_set_header X-Forwarded-For $remote_addr;
$remote_user 客戶端用戶名稱
$time_local 記錄訪問時間與時區
$request 用戶的http請求起始行信息
$status http狀態碼,記錄請求返回的狀態
$body_bytes_sents 服務器發給客戶端的響應body字節數
$http_referer 記錄這次請求是從哪一個連接跳轉過來的
$http_user_agent 記錄客戶端訪問信息
5、nginx日誌輪詢切割
因爲nginx沒有現成的工具作日誌切割,所以須要編寫腳本並設置定時任務來完成這項工做,腳本編寫以下:
cat>>/server/scripts/cut_nginx_log.sh<<EOF
cd /application/nginx/logs/
#Cut access log
/bin/mv www_access.log www_access-$(date %F -d -1day).log
#Reload nginx
/application/nginx/sbin/nginx -s reload
#Push access log to the backup server
rsync -az /application/nginx/logs/ rsync_backup@172.16.1.41::nginxbackup --password-file=/etc/rsync.password &
#Delete more than seven days of log
find /application/nginx/logs/ -type f -mtime +7 -name 'www_access-*.log' -delete
EOF
定時任務編寫以下:
crontab -e
#cut nginx log write by liufeng 2018-3-16
00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh>/dev/null 2>&1
6、nginx的location寫法
格式:location uri { 處理動做 }
uri 訪問的資源路徑
location匹配uri時的特殊符號:
= 精確匹配
~ 區分大小寫
~* 不區分大小寫
^~ 不作正則匹配
@ 內部調用
location匹配uri時支持正則表達式,同時匹配有以下規律:
一、等號最優先匹配如location = /
二、其次匹配^~如location ^~ /image/
三、再匹配正則如location ~* \.(gif|jpg|jpeg)$
四、匹配常規字符串,有正則優先匹配正則如location /documents/
五、最後匹配默認location /
7、nginx的rewrite寫法
格式:rewrite 正則規則 替換內容 [標記]
例如:rewrite ^/(.*)$ http://www.baidu.com/$1 permanent
rewrite可用的標記有如下四種:
last 本規則匹配完成後,繼續向下匹配新的location URI規則
break 本條規則匹配完即停止,再也不匹配後面的任何規則
redirect 返回302臨時重定向
permanent 返回301永久重定向
8、nginx配置訪問認證
auth_basic ""; 彈窗上的提示信息
auth_basic_user_file /application/nginx/conf/htpasswd; 認證文件的路徑
htpasswd -cb /application/nginx/conf/htpasswd oldboy 123456 建立認證文件,用戶名old,密碼123456,htpasswd工具由httpd服務安裝產生
能夠配置在http區塊,server區塊或location語句中
9、nginx鏈接PHP配置
server { listen 80; server_name blog.etiantian.org; location ~ .*\.(php|php5)?$ { root html/blog; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
10、nginx反向代理
http { .... upstream 節點池名稱 { ip_hash; #會話保持,讓相同的客戶端始終訪問同一臺服務器 server 10.0.0.9:80 weight=1; #weight表示負載均衡中的權重 server 10.0.0.10:80 weight=1; server { .... location / { ..... proxy_pass http://節點池名稱; #將訪問請求轉發給節點池中的服務器 proxy_set_header Host $host; #使用客戶端訪問請求中的域名向後端web服務器發起請求 proxy_set_header X-Forwarded-For $remote_addr; #將客戶端的IP轉發給web服務器 } } } }
11、nginx優化
nginx的優化分爲性能優化和安全優化兩部分,優化操做以下:
一、性能優化
1)修改worker進程數量
worker進程是nginx用於創建與客戶端鏈接的,worker進程數量越多nginx能夠創建的鏈接越多,但也不是越多越好,通常設置爲與CPU核數相等便可,具體操做爲修改main區塊的worker_processes參數,將其設置爲與CPU核數相等。如:worker_process 4
查看CPU核數的方法有如下三種:
一、grep -c 'processor' /proc/cpuinfo
二、grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l,該方法看到的是CPU的顆數
三、在top命令界面下,按數字1便可看到CPU核數
2)將不一樣nginx進程綁定到不一樣CPU核心上,充分利用CPU資源
nginx運行中有時會將不少鏈接交給正在處理任務的CPU核心上而浪費CPU資源,所以以下作這步優化,下面是四核CPU的操做方法,核心更多的CPU方法相似:worker_cpu_affinity 0001 0010 0100 1000;
3)修改nginx事件處理模型
經常使用的TCP鏈接處理模型有select模型和epoll模型,這兩個都是I/O多路複用模型即軟件主程序不須要關心TCP鏈接是否就緒,只須要對就緒的鏈接進行相應的處理,而鏈接是否已就緒則有專門的監放任務去處理,監放任務會監測哪些TCP鏈接已經就緒能夠往該鏈接發送數據或接收該鏈接中的數據,而後將這樣的已就緒鏈接返回給軟件主程序處理。而epool模型比select模型高效的緣由就在與監測任務如何知道鏈接是否就緒的方式上epoll模型採用的是主動通知的方式,即系統內核會將已就緒的鏈接告訴epoll監測任務,而select模型則須要本身一個一個查看該鏈接是否已就緒。所以須要將nginx的事件處理模型修改成epoll模型,具體操做爲在events區塊中使用use參數指定事件模型爲epoll。如:events { use epoll; }
4)調整單個worker進程的最大鏈接數
該優化步驟的操做爲修改events區塊中的worker_connections參數,將該參數設置爲(nginx最大處理鏈接數/worker進程的數量)的結果。如:events { worker_connections 4096; }
5)調整worker進程最大可以使用的文件描述符數量
文件描述符是系統用於訪問文件的依據,每建立一個文件都要消耗一個文件描述符,而nginx運行過程當中須要建立不少文件,好比日誌文件、pid文件、socket文件等等,所以須要讓nginx可以儘量多的使用文件描述符,避免由於可用文件描述符不足而報錯,具體操做爲在main區塊中用worker_rlimit_nofile參數指定。如worker_rlimit_nofile 65535;
6)開啓文件高效傳輸模式
開啓nginx的sendfile參數可使文件傳輸更快,通常會配置tcp_nopush和tcp_nodelay參數一塊兒使用,tcp_nopush容許把http response header和文件的開始放在一個文件發佈,減小網絡報文段的數量,tcp_nodelay讓nginx在積累必定量的數據以後再發送。具體操做以下:
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
7)nginx超時相關設置
設置超時可以讓nginx適時的拋棄那些耗時過長的任務轉而處理新的任務,能夠提升任務處理效率。具體操做以下:
http {
keepalive_timeout 60; 鏈接超時時間,保持鏈接的最大時間
client_header_timeout 15; nginx讀取客戶端請求頭信息的超時時間
client_body_timeout 15; nginx讀取客戶端請求體信息的超時時間
send_timeout 25l nginx響應客戶端的超時時間
}
8)限制上傳文件大小
上傳文件太大會佔用過多的帶寬,延長傳輸時間,所以須要限制客戶端上傳文件的大小,具體操做以下:
http {
client_max_body_size 8m;
}
9)FastCGI相關優化
因爲nginx與php解釋程序經過FastCGI傳遞數據,所以須要優化相關的buffer和cache的設置,具體操做以下:
location / {
fastcgi_connect_timeout 240; nginx鏈接fastcgi的超時時間
fastcgi_send_timeout 240; fastcgi服務端返回數據的超時時間
fastcgi_read_timeout 240; nginx從fastcgi服務端讀取響應信息的超時時間
fastcgi_buffer_size 64K; nginx讀取從fastcgi服務端收到的第一部分響應信息的緩衝區大小
fastcgi_buffers 4 64K; 緩衝區數量與大小
fastcgi_busy_buffers_size 128K; fastcgi忙時buffer的大小
fastcgi_temp_file_write_size 128K; fastcgi臨時文件大小
fastcgi_cache oldboy_nginx; 開啓fastcgi緩存並指定名稱
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g fastcgi_cache緩存目錄
fastcgi_cache_valid 200 302 1h;(301 1d any 1m) 應答代碼緩存時間
fastcgi_cache_min_uses 1; 請求幾回後緩存
fastcgi_cache_use_stale error timeout invalid_header http_500; 哪些狀況使用過時緩存
fastcgi_cache_key http://$host$request_uri; 定義fastcgi_cache的key
}
10)壓縮優化
啓用gzip壓縮模塊對網頁元素進行壓縮,以加快用戶打開網頁的速度,同時減小帶寬消耗,具體操做以下:
http {
gzip on; 開啓gzip壓縮
gzip_min_length 1K; 啓用壓縮的文件最小大小
gzip_buffers 4 32K; gzip壓縮的buffer個數和大小
gzip_htto_version 1.1; 使用的gzip版本
gzip_comp_level 9; 壓縮的級別
gzip_types text/css text/xml application/javascript; 指定須要壓縮的文件類型
gzip_vary on; 容許緩存服務器緩存nginx壓縮後的頁面
}
11)緩存優化
企業網站的網頁元素可能很長時間都不會更換,所以當第一次客戶端從網站將這些元素下載下來以後應該將這些內容保存必定時間,這樣既能夠加快用戶打開網頁的速度,也能夠節省企業的帶寬,具體操做就是啓用nginx的expires緩存,如:location ~ .*\.(gif|jpg|jgeg|png|bmp|swf)$ {
expires 3650d; #將全部的圖片元素緩存10年
}
expires緩存雖然有不少好處,可是也有一個問題即當網站有更新而緩存沒有到期用戶就沒法獲取網站最新的內容,解決這個問題有兩個方法:
一、常常更新的元素將緩存時間設置的短一點
二、將更新的元素的名字修改成新的文件名
12)日誌優化
二、安全優化
1)隱藏nginx版本號
因爲軟件都會存在漏洞,而不一樣版本的nginx的漏洞是不一樣的,若是讓攻擊者知道了服務器上nginx的版本號就能利用特定的漏洞攻擊服務器,所以必須隱藏nginx的版本號,具體操做就是在http區塊中加上以下配置:server_tokens off;
2)更改默認用戶
nginx的運行用戶若是權限過大,當攻擊者取得nginx的控制權就會得到很大的服務器操做權限,所以運行nginx的用戶必須權限最小化,具體操做就是修改main區塊中user參數,將運行用戶設置爲普通用戶。如:user nginx;