編譯安裝nginxjavascript
#安裝前須要先準備好編譯環境,和nginx須要的組件 [root@nginx ~]# yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y #下載須要安裝的版本號 https://nginx.org/en/download.html #解壓源碼包 [root@nginx ~]# tar -zxvf nginx-xxx.tar.gz #進入解壓目錄,簡單配置並安裝 [root@nginx ~]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module [root@nginx ~]# make && make install #啓動nginx [root@nginx ~]# /usr/local/nginx/sbin/nginx #重載配置 [root@nginx ~]# /usr/local/nginx/sbin/nginx -s reload #中止nginx [root@nginx ~]# /usr/local/nginx/sbin/nginx -s stop #檢查配置文件 [root@nginx ~]# /usr/local/nginx/sbin/nginx -t
yum安裝nginxphp
#配置nginx yum源,系統須要要換成對應的系統 [root@test ~]# vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 #安裝 [root@test ~]# yum install nginx
nginx目錄結構css
conf 存放nginx全部配置文件的目錄,主要nginx.conf html 存放nginx默認站點的目錄,如index.html、error.html等 logs 存放nginx默認日誌的目錄,如error.log access.log sbin 存放nginx主程序的目錄,sbin/nginx
總體配置文件html
#定義Nginx運行的用戶 user nobody; #nginx進程數,一般爲物理cpu核心數-1。 worker_processes 8; #全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ] error_log /usr/local/nginx/logs/error.log info; #進程pid文件 pid /usr/local/nginx/logs/nginx.pid; #指定進程能夠打開的最大描述符個數,一般爲ulimit -n的值 worker_rlimit_nofile 65535; events { #默認使用epoll模型 use epoll; #單個進程最大鏈接數(最大鏈接數=鏈接數*進程數) worker_connections 65535; #keepalive超時時間。 keepalive_timeout 60; #客戶端請求頭部的緩衝區大小。一般爲getconf PAGESIZE取得的結果 client_header_buffer_size 4k; #這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,inactive是指通過多長時間文件沒被請求後刪除緩存。 open_file_cache max=65535 inactive=60s; #這個是指多長時間檢查一次緩存的有效信息,默認60s open_file_cache_valid 60s; #指明緩存inactive時間沒有用過多少次就刪掉,默認1次 open_file_cache_min_uses 1; #這個指令指定是否在搜索一個文件是記錄cache錯誤,默認off open_file_cache_errors on; } http { #包含這個文件,文件擴展名與文件類型映射表 include mime.types; #默認文件類型 default_type application/octet-stream; #默認編碼 charset utf-8; #服務器名字的hash表大小 server_names_hash_bucket_size 128; #客戶端請求頭部的緩衝區大小。 client_header_buffer_size 32k; #客戶端請求頭緩衝大小。 large_client_header_buffers 4 64k; #限制經過nginx上傳文件的大小 client_max_body_size 8m; #開啓高效文件傳輸模式,同時開啓下面選項 sendfile on; tcp_nopush on; tcp_nodelay on; #開啓目錄列表訪問,合適下載服務器,默認off。 autoindex off; #長鏈接超時時間,單位是秒 keepalive_timeout 120; #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,前端若是是squid2.5請使用1.0) gzip_comp_level 2; #壓縮等級 gzip_types text/plain application/x-javascript text/css application/xml; #壓縮哪一種文件 gzip_vary on; #開啓限制IP鏈接數的時候須要使用 #limit_zone crawler $binary_remote_addr 10m; #負載均衡配置 upstream 負載組名1 { #輪詢機制,weight是權重,值越高負載概率越大 server 192.168.1.1:80 weight=3; server 192.168.1.2:80 weight=2; server 192.168.1.3:80 weight=3 down; #關閉狀態 server 192.168.1.4:80 weight=3; server 192.168.1.5:80 weight=3 backup;#當其餘服務器都壞掉才使用這個 } upstream 負載組名2 { #源地址hash機制,按照請求ip的hash結果分配,每一個訪客能夠固定訪問一個後端服務器 ip_hash; server 192.168.1.1:80; server 192.168.1.2:80; } upstream 負載組名3 { #響應時間機制,按後端服務器的響應時間來分配請求,響應時間短的優先分配。 server 192.168.1.1:80; server 192.168.1.2:80; fair; } upstream 負載組名4 { #訪問url hash機制,按照目標url的hash結果分配 server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; } server { #監聽端口 listen 80; #域名能夠有多個,用空格隔開 server_name www.a.cn b.cn; #網站默認首頁 index index.html index.htm index.php; #網站頁面存放路徑 root html; #圖片緩存時間設置 #日誌格式設定 #$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址; #$remote_user:用來記錄客戶端用戶名稱; #$time_local: 用來記錄訪問時間與時區; #$request: 用來記錄請求的url與http協議; #$status: 用來記錄請求狀態;成功是200, #$body_bytes_sent :記錄發送給客戶端文件主體內容大小; #$http_referer:用來記錄從那個頁面連接訪問過來的; #$http_user_agent:記錄客戶瀏覽器的相關信息; #一般web服務器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,經過$remote_add拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,能夠增長x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #定義本虛擬主機的訪問日誌 access_log /usr/local/nginx/logs/host.access.log main; access_log /usr/local/nginx/logs/host.access.404.log log404; #對 "/" 啓用反向代理 location / { #代理至http段的負載 proxy_pass http://負載組名; proxy_redirect off; proxy_set_header X-Real-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; #表示使nginx阻止HTTP應答代碼爲400或者更高的應答。 proxy_intercept_errors on; #nginx跟後端服務器鏈接超時時間(代理鏈接超時) proxy_connect_timeout 90; #後端服務器數據回傳時間_就是在規定時間以內後端服務器必須傳完全部的數據 proxy_send_timeout 90; #後端服務器處理請求的時間 proxy_read_timeout 90; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小 proxy_buffer_size 4k; #設置用於讀取應答(來自被代理服務器)的緩衝區數目和大小 proxy_buffers 4 32k; #高負荷下緩衝大小(proxy_buffers*2) proxy_busy_buffers_size 64k; } #設定查看Nginx狀態的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file confpasswd; #htpasswd文件的內容能夠用apache提供的htpasswd工具來產生。 } #本地動靜分離反向代理配置 #全部jsp的頁面均交由tomcat或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; } } }
主配置段指令前端
正常運行的必備配置
1.user USERNAME [GROUPNAME];指定運行worker進程的用戶和組,組省略表明跟用戶名同樣的組
2.pid /PATH/TO/PID_FILE;指定nginx守護進程的pid文件
3.worker_rlimit_nofile #;指定全部worker進程所能打開的最大文件數
性能優化的相關配置
1.worker_processes #; 指定worker進程的個數,一般爲cpu物理核心-1個
2.worker_cpu_affinity CPU掩碼 ;進程與cpu綁定,可以提高cpu緩存命中率
3.timer_resolution #; 計時器解析度,下降會提高性能
4.worker_priority #;指定worker進程的nice值
事件的相關配置
1.accept_mutex on|off;主進程調度用戶請求至各工做進程使用的負載均衡鎖,on表示能讓多個工做進程輪流、有序的響應新請求
2.lock_file /PATH/TO/FILE;上面那個鎖的路徑
3.use [epoll|rtsig|select|poll];知名使用的事件模型,建議讓nginx自行選擇
4.worker_connections #;設定單個工做進程所可以處理的併發鏈接數量
調試、定位問題
1.daemon [on|off];是否以守護進程方式來運行nginx,調試時設置爲off,會出現信息
2.master_process [on|off];是否以master/worker模型來運行nginx,調試時能夠設置爲off
3.error_log 記錄位置 級別;記錄日誌,若要使用debug級別,須要在編譯nginx時使用了--with-debug選項java
http配置段node
[root@test nginx]# grep -v "#" conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.a.com; location / { root /www; index index.html index.htm; } location /status { stub_status on; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
1.listen:監聽地址或端口python
2.sever_name:設置網站名,同時能夠設置網站別名,用空格隔開nginx
3.root:定義網頁目錄,能夠用於server,location字段,右側斜線"/"必須同時有或沒有
web
location /aaa/{ root /nginx/www/ #訪問aaa至關於/nginx/www/aaa }
4.alias:用於location配置段,定義路徑別名,右側斜線"/"必須同時有或沒有
location /bbb/{ alisa /nginx/www/ #訪問aaa至關於/nginx/www }
5.server_name匹配方法:
(1)先作精確匹配檢查
(2)左側通配符匹配檢查,*.a.com
(3)右側通配符匹配檢查,www.*
(4)正則表達式匹配檢查,
(5)默認虛擬主機
6.location [ = | ~ | ~* | ^~ ] URI { ... }:根據用戶請求的URI作處理
=:精確匹配檢查,最高優先級
^~:URI的前半部分匹配,不支持正則表達式
~:正則表達式模式匹配檢查,區分字符大小寫
~*:正則表達式模式匹配檢查,不區分字符大小寫
無符號:最低優先級
7.index:默認主頁面
index index.php index.html;
8.根據http響應的狀態碼來指定錯誤頁面:error_page # # [=#] /PATH/TO/FILE:
error_page 400 404 =100 100_error.html; 當http迴應400或404狀態碼時,將他重置爲100,並返回當前目錄下100_error.html頁面
9.基於ip的訪問控制
allow IP/NETWORK;
deny IP/NETWORK;
10.基於帳號的認證
auth_basic ""; 輸入密碼的提示
auth_basic_user_file "/PATH/TO/PASSWORD_FILE" 密碼文件可使用htpasswd建立
11.https服務
#server { listen 443 ssl; server_name localhost; ssl_certificate cert.pem; #指定證書 ssl_certificate_key cert.key; #指定證書私鑰 location / { root html; index index.html index.htm; } }
12.狀態信息
location /status { stub_status on; allow 172.17.148.112; deny all; }
13.狀態信息解釋
Active connections: 1 #當前全部處於打開狀態的鏈接數 server accepts handled requests 13 13 25 #已經接受過的鏈接數 #已經處理過的鏈接數 #已經處理過的請求數,keepalive模式下,請求數量會多於鏈接數量 Reading: 0 Writing: 1 Waiting: 0 #正處於接收請求狀態的鏈接數 #請求已經接收完成,正處於處理請求或發送響應的過程當中的鏈接數 #keepalive模式處於活動狀態的鏈接數
14.URL重寫rewrite 正則 替換內容 標誌
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
例:www.a.com/images/a/b.jpg就會換成www.a.com/imgs/a/b.jpg
標誌:
last:會在location內一直循環匹配,直到都匹配完成才結束
break:替換一次就不會再替換了
redirect:以302響應碼臨時重定向返回新的URL
permanent:以301響應碼永久重定向返回新的URL
15.if (表達式) {} 條件判斷能夠應用在srever、location
(1)變量名:變量名爲空或者爲0,則爲false;其餘的都爲true
(2)比較表達式:=,>,<,!=相似的比較字符串進行比較
(3)正則表達式:~區分大小寫,~*不區分大小寫
(4)是否爲文件:-f,!-f
(5)是否爲目錄:-d,!-d
(6)文件是否存在:-e,!-e
(7)文件是否有執行權限:-x,!-x
例:if ($http_usr_agent ~* MSIE){
rewrite ^(.*)$ /msie/$1 break; 假如瀏覽器類型爲微軟,就定向到msie目錄下
}
16.定製訪問日誌,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"'; access_log logs/access.log main; ##log_format:用來定義記錄日誌的格式,取不一樣名字便可 ##main:定義後面日誌的名字 ##access_log:用來指定日誌文件的路徑及使用哪一種格式進行記錄 ##$remote_addr:記錄訪問網站的客戶端地址 ##$remote_user:遠程客戶端用戶名稱 ##$time_local:用戶訪問時間與時區 ##$request:用戶的http請求起始行信息 ##$status:記錄請求返回的狀態碼 ##$body_bytes_sent:服務器發送給客戶端的響應主體字節數 ##$http_referer:記錄這次請求時由哪一個連接跳轉而來 ##$http_user_agent:用戶的瀏覽器類型 ##$http_x_forwarded_for:當前端是代理服務器時,記錄由哪一個代理轉發而來
16.1錯誤日誌
error_log /var/log/nginx/error.log warn; ##能夠配置在main,http,server,location段。 ##錯誤日誌級別有debug、info、notice、warn、error、crit、alert、emerg ##錯誤日誌默認級別爲error,配置較低等級會致使大量磁盤I/O
17.實現反向代理
location / { proxy_pass http://172.17.148.255/; #將訪問的全部數據都代理給後面的 proxy_set_header ahost $proxy_host; #傳送代理主機的ip,爲了記錄日誌 proxy_set_header bhost $http_host; #從哪一個代理過來的ip+端口 proxy_set_header Host $host; #當有多個虛擬主機時,代理服務器能夠識別訪問的是哪一個虛擬主機 proxy_set_header dhost $proxy_port; #從哪一個代理過來的端口 proxy_set_header X-Forwarded-For $remote_addr; #真實請求的主機ip } location /nginx.txt { proxy_pass http://172.17.148.255/nginx/nginx.txt; #將匹配到的內容定向後面 } location ~* \.(jpgg|pngg)$ { #假如這裏是根據正則匹配的↓ proxy_pass http://172.17.148.255; #下面這裏不能加任何路徑,由於會在路徑後面補全前面匹配到的內容 }
#######定義完傳送的日誌名稱後,需在在後端服務器上修改對應的日誌格式,之後端httpd爲例
LogFormat "%{ahost}i %{bhost}i %{chost}i %{dhost}i %{ehost}i" combined
18.定義緩存
http { proxy_cache_path /cache/nginx levels=1:1:1 keys_zone=mycache:10m; } #定義緩存必須在http段,/cache/nginx/目錄必須爲worker進程的屬主屬組 #levels表明有幾個層級目錄,最多3層,1:1:1表明有三層目錄,1表明目錄名最多一個字符 #keysz_zone表明緩存名稱,後面引用的時候會用,大小爲10M
19.使用緩存
location / { proxy_cache mycache; #定義使用的緩存空間 proxy_cache_valid 200 1m; #狀態碼爲200緩存1分鐘 proxy_cache_valid 301 302 10m; #狀態碼爲301 302 緩存10分鐘 proxy_cache_valid any 1m; #狀態碼爲其餘緩存1分鐘 proxy_cache_methods GET HEAD #設置http請求方法爲get或head時才使用緩存 proxy_cache_use_stale error timeout #當後方服務器爲何狀態時可使用過時的緩存 proxy_cache_min_uses 2; #同一資源使用幾回後才緩存 proxy_cache_bypass $ cookie_nocache $ arg_nocache $ arg_comment; #定義不從緩存中獲取響應的條件 proxy_set_header ehost $remote_addr; #真實請求的主機ip proxy_pass http://172.17.148.255/; }
20.負載均衡,服務器組
upstream backend { #定義服務器組,只能在http段定義 server 10.1.1.1 weight=2; #設置權重爲2,默認權重爲1 server 10.1.1.2:8080; #能夠加端口 server 10.1.1.3 fail_timeout=5s max_fails=3; #最多嘗試3次,超時後每5秒檢查一次 server 10.1.1.4 backup; #備份服務器,當其餘節點都不可用時,才用這個 server 10.1.1.5 down; #標緻服務器狀態爲不可用 server 10.1.1.6 weight=1 max_fails=1 fail_timeout=10s; #默認配置 server www.abc.com:8080; #同時可使用域名加端口的方式 } server { listen 80; server_name www.aaa.com; location / { proxy_pass http://backend; #當訪問www.aaa.com時,發送給上面定義的服務器組 } }
21.session保持
upstream keepsession{ ip_hash; server 10.1.1.1; server 10.1.1.2; } ##ip_hash,根據源ip進行會話保持,後端服務器在負載均衡調度中的狀態不能有weight和backup ##fair,根據後端服務器的響應時間 ##least_conn,根據後端服務器節點的鏈接數 ##hash $request_rui,根據訪問的URL ##consistent_hash $request_rui,一致性hash
網絡相關的配置
1.keepalive_timeout #; 長鏈接超時時長,默認75秒
2.keepalive_request #; 在一個長鏈接上所可以容許請求的最大資源數
3.keepalive_disables [msie6|safari|none]; 爲指定類型瀏覽器禁用長鏈接
4.tcp_nodelay on | off; 是否對長鏈接使用延遲功能
5.client_hearder_timeout #; 讀取http請求報文首部超時時長
6.client_body_timeout #;讀取http請求報文body部分超時時長
7.send_timeout #;發送響應報文的超時時長
fastcgi相關配置
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; }
相關優化
1.隱藏nginx的版本號信息
http { server_tokens off; #隱藏版本號 } ##能夠放置在http、server、location段中,默認配置爲on
2.進程數和cpu綁定
##假設單顆四核心cpu http{ worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; } ##配置4個工做進程,把這四個進程分別綁定到cpu的4個核心上 http{ worker_processes 2; worker_cpu_affinity 0101 1010; } ##配置2個工做進程,把第一個進程分配到一、3cpu上,把第二個進程分配到二、4cpu上
3.單個進程最大鏈接數
events { worker_connections 1024; } ##最大鏈接數=工做進程個數*單個進程作大鏈接數
4.鏈接超時設置
###均可以在http、server、location中作 keepalive_timeout 60; #長鏈接超時時間 client_header_timeout 60; #超過多長時間還沒收到客戶端的請求頭部就斷開 client_body_timeout 60; #超過多長時間還沒收到客戶端的請求主體就斷開 send_timeout 60; #客戶端若是超過多長時間沒有接收數據就斷開
5.上傳文件大小的限制
###能夠放置在http、server、location段 client_max_body_size 1m; #若是客戶端請求主體大小超過1m,就返回413錯誤
6.壓縮功能
#####壓縮文本文件,圖片和視頻不要壓縮 gzip on; #開啓壓縮功能 gzip_min_length 1k; #設置低於1k的文件不壓縮,若是壓縮低於1k的文件可能會變大 gzip_comp_level 2; #設置壓縮比,1壓縮比最小,壓縮速度最快;9壓縮比最大,壓縮速度最慢 gzip_types text/html text/css text/xml;設置哪些類型的文件被壓縮 gzip_vary on;
7.錯誤頁面優雅顯示
error_page 400 401 402 403 404 =200 /error.html ##當返回狀態碼爲40...時,重置爲200,並返回/error.html頁面 error_page 500 501 http://www.abc.com ##當返回狀態碼爲50..時,返回這個網頁
·