全局配置:進程數(shù) 日志 pid文件
events 事件模塊:每個進程的并發(fā)鏈接數(shù)
http:網(wǎng)站的配置鹉梨,每一個server是一個虛擬主機竞川,有一個默認的server负饲,其他的虛擬主機的配置,php的反向代理等.
nginx3個核心模塊:
CoreModule 核心模塊 (進程數(shù)等)
設(shè)置進程數(shù)量與CPU數(shù)相同
指出錯誤日志 的路徑
pid 指出其路徑
EventsModule 事件驅(qū)動模塊(工作模式等)
指出進程的最大連接數(shù)connection C10K
HttpCoreModule http內(nèi)核模塊(文檔程序類型耕魄,配置文件等)
http 指出訪問日志路徑
長連接 的時間
定義子配置文件路徑
centos6 源碼安裝 Nginx后做開機自啟:
方法一:
在 rc.local 中加入Nginx的啟動路徑:
echo “/usr/local/nginx/sbin/nginx –c /usr/local/nginx/conf/nginx.conf” >> /etc/rc.local
方法二:編寫啟動腳本并且加入chkconfig
#vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 99 20
# description: Oooo this is my nginx startup script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case $1 in
start)
$PROG
;;
stop)
kill -s QUIT `cat $PIDF`
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP `cat $PIDF`
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
;;
esac
exit 0
QUIT 從容關(guān)閉,關(guān)閉主進程順便關(guān)閉工作子進程
HUP 重載配置用新的配置開始新的工作進程從容關(guān)閉舊的工作進程
Apache和Nginx的區(qū)別:
Nginx
輕量級,采用 C 進行編寫彭谁,同樣的 web 服務(wù)吸奴,會占用更少的內(nèi)存及資源
抗并發(fā)
nginx 處理靜態(tài)文件好埋虹,靜態(tài)處理性能比 apache 高三倍以上
nginx 的設(shè)計高度模塊化心软,編寫模塊相對簡單
nginx 配置簡潔,正則配置讓很多事情變得簡單拥坛,而且改完配置能使用 -t 測試配
置有沒有問題狭园,apache 配置復雜 读处,重啟的時候發(fā)現(xiàn)配置出錯了,會很崩潰
nginx 作為負載均衡服務(wù)器唱矛,支持 7 層負載均衡
nginx 本身就是一個反向代理服務(wù)器罚舱,而且可以作為非常優(yōu)秀的郵件代理服務(wù)器
啟動特別容易, 并且?guī)缀蹩梢宰龅?7*24 不間斷運行
Apache
apache 的 rewrite 比 nginx 強大,在 rewrite 頻繁的情況下绎谦,用 apache
apache 發(fā)展到現(xiàn)在管闷,模塊超多,基本想到的都可以找到
apache 更為成熟燥滑,少 bug 渐北,nginx 的 bug 相對較多
apache 超穩(wěn)定
apache 對 PHP 支持比較簡單,nginx 需要配合其他后端用
apache 在處理動態(tài)請求有優(yōu)勢铭拧,nginx 在這方面是雞肋赃蛛,一般動態(tài)請求要
apache 去做,nginx 適合靜態(tài)和反向搀菩。
apache 仍然是目前的主流呕臂,擁有豐富的特性,成熟的技術(shù)和開發(fā)社區(qū)
總結(jié):
1.兩者最核心的區(qū)別在于 apache 是同步多進程模型肪跋,一個連接對應一個進程歧蒋,而 nginx 是異步的,多個連接(萬級別
)可以對應一個進程。最大的特點:并發(fā)量高apache最大2000 nginx官方50000
2.nginx配置簡單谜洽,本身就是一個反向代理服務(wù)器
虛擬主機:
基于 域名 IP 端口 但常用基于 域名
基于域名的虛擬主機: 域名不同萝映,端口相同,ip相同
server {
listen 80; 只監(jiān)聽這塊網(wǎng)卡的端口阐虚,前面加上ip的就是基于ip序臂,修改端口就是基于端口的
server_name www.blackmed.com; 訪問這個主機的域名,使用什么域名訪問就寫那個域名
charset utf-8; 字符集
location /{ 匹配 location后面的/相當于10.1.1.1的/ 也相當于 root 后面的網(wǎng)站發(fā)布目錄
root /yahoo/html; root:發(fā)布網(wǎng)站的默認目錄
index index.html index.htm;
}
}
server {
listen 80;
server_name web.wing.com;
location /{
root /wing/html;
index index.html index.htm;
}
}
1.location 配置
= 是精確匹配 , 是優(yōu)先級最高的
^~ 匹配一什么開頭的
~ 表示區(qū)分大小寫 的正則匹配
~* 表示不區(qū)分大小寫的正則匹配
!~ 表示區(qū)分大小寫不匹配的正則
!~* 表示 不區(qū)分大小寫不匹配的正則
/ 表示通配
注意:優(yōu)先級依次變小,如果有匹配成功就會立刻停止匹配
2.用戶訪問控制==連接頻率限制,請求頻率限制
連接頻率限制是指用同一個ip的連接數(shù)实束,并發(fā)數(shù)進行限制
設(shè)置一個緩存區(qū)保存不同的key奥秆,大小為10M,使用遠程ip作為key咸灿,依次來限制每個源ip的連接數(shù)
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
這個是一個變量构订,獲取ip addr是zone的名字 后面大小是10m
limit_req_zone $binary_remote_addr zone=reqps:10m rate=5r/s;
//定義每個IP的每秒請求數(shù)量,限制每秒5個連接請求,不延遲
}
server {
location / {
……
limit_conn addr 1; //定義同一個ip的并發(fā)最大連接數(shù) 這里最大限制到1;高了無效
limit_req zone=reqps nodelay;
//限制每IP的每秒的PHP頁面請求次數(shù)為上面定義的rate的值:每秒5個請求,不延遲
}
}
3.用戶訪問控制:就是通過使用用戶和密碼才能訪問
4.主機訪問控制:就是允許某些主機訪問避矢,限制某些主機訪問或者限制用戶訪問某些文件
location ~* \.(txt|doc)$ {
root html/test;
deny all;
}
rewirte 地址重寫 URL 重寫
作用:
1.可以轉(zhuǎn)換端口悼瘾,例如80-443的轉(zhuǎn)換
2.可以隱藏地址,保證地址的安全性
location ~* \.(mp3|mp4)$ {
proxy_pass http://localhost:8080 //轉(zhuǎn)發(fā)到本機8080端口
}
- rewrite /正則/替換后的內(nèi)容/flags
rewrit一般在server和location里使用谷异,在location里使用的較多
last: 停止當前這個請求分尸,并根據(jù)rewrite匹配的規(guī)則重新發(fā)起一個請求。新請求又從第一階段開始執(zhí)行…
break:相對last歹嘹,break并不會重新發(fā)起一個請求箩绍,只是跳過當前的rewrite階段,并執(zhí)行本請求后續(xù)的執(zhí)行階段
flags標簽:
last:相當于apache里的[L]標記尺上,表示完成rewrite
break:本條規(guī)則匹配完成后材蛛,終止匹配,不在匹配后面的規(guī)則
redrite:返回302臨時重定向怎抛,瀏覽器會顯示調(diào)轉(zhuǎn)后面界面
permenant:返回301永久重定向卑吭,留瀏覽器會顯示調(diào)轉(zhuǎn)后的界面
在server塊下,會優(yōu)先執(zhí)行rewrite部分马绝,然后才會去匹配location塊
1. rewrite break - url重寫后豆赏,直接使用當前資源,不再執(zhí)行l(wèi)ocation里余下的語
句富稻,完成本次請求掷邦,地址欄url不變
2. rewrite last - url重寫后,馬上發(fā)起一個新的請求椭赋,再次進入server塊抚岗,重試
location匹配,超過10次匹配不到報500錯誤哪怔,地址欄url不變
3. rewrite redirect – 返回302臨時重定向宣蔚,地址欄顯示重定向后的url向抢,爬蟲不會更
新url(因為是臨時)
4. rewrite permanent – 返回301永久重定向, 地址欄顯示重定向后的url,爬蟲更新url
- if的語法應用到server或者location中
if(condition){if條件表達式}
if可以支持的條件判斷匹配符號
~區(qū)分大小寫 ~*不區(qū)分大小寫
!~區(qū)分大小寫不匹配 !~*不區(qū)分大小寫不匹配
-f !-f用來判斷是否存在文件
-d!-d用來判斷是否存在目錄
-x!-x用來判斷文件是否可執(zhí)行
3.return 指令
用于返回代碼給客戶端胚委,應用于server或者location環(huán)境
如果訪問.sh 結(jié)尾的網(wǎng)站返回403操作拒絕
location ~* .*/.sh$ {
return 403;
}
4.set 指令
用于定義一個變量挟鸠,并且賦值。應用于server,location,if環(huán)境篷扩。
語法格式為: set $變量名 變量值
例:
當訪問任意目錄下的whoami.html 都重定向到 /who.html
location ~* .*/whoami\.html$ {
set $who 'who.html';
rewrite .* /$who break;
}
apache:
vim /etc/httpd/conf.d/web.conf
< VirtualHost *:80 >
Servername www.blackmed.cn
serverAlias blackmed.cn
DocumentRoot /web1
< /VirtualHost >
< Directory "/wed1" >
Require all granted
< /Directory >
基于主機的訪問控制
代理對象不同:
正向代理 是為客戶端做代理
反向代理 是為服務(wù)器做代理
location / {
proxy_pass http://192.168.20.10:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; 只記錄上一層
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 記錄所有層
}
一般來說兄猩,X-Forwarded-For是用于記錄代理信息的茉盏,每經(jīng)過一級代理(匿名代理除外)鉴未,代理服務(wù)器都會把這次請求的
來源IP追加在X-Forwarded-For中
來自4.4.4.4的一個請求,header包含這樣一行
X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
代表 請求由1.1.1.1發(fā)出鸠姨,經(jīng)過三層代理铜秆,第一層是2.2.2.2,第二層是3.3.3.3讶迁,
而本次請求的來源IP4.4.4.4是第三層代理
1. 他在正向(如squid)反向(如nginx)代理中都是標準用法连茧,而正向代理中是沒有x-real-ip相關(guān)的標準的,也就是說巍糯,
如果用戶訪問你的 nginx反向代理之前啸驯,還經(jīng)過了一層正向代理,你即使在nginx中配置了x-real-ip祟峦,取到的也只是
正向代理的IP而不是客戶端真實IP
2. 大部分nginx反向代理配置文章中都沒有推薦加上x-real-ip 罚斗,而只有x-forwarded-for,因此更通用的做法自然是
取x-forwarded-for
3. 多級代理很少見宅楞,只有一級代理的情況下二者是等效的
4. 如果有多級代理针姿,x-forwarded-for效果是大于x-real-ip的,可以記錄完整的代理鏈路
緩沖區(qū)
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
proxy_buffering開啟的情況下厌衙,nignx會把后端返回的內(nèi)容先放到緩沖區(qū)當中距淫,然后再返回給客戶端
(邊收邊傳,不是全部接收完再傳給客戶端)婶希。
proxy_busy_buffers_size:此指令設(shè)置標注“client-ready”緩沖區(qū)的最大尺寸榕暇。而客戶端可以一次讀取來自一個緩沖區(qū)的數(shù)據(jù),緩沖被放置在隊列中喻杈,批量發(fā)送到客戶端彤枢。此指令控制允許是在這種狀態(tài)下的緩沖空間的大小。
注:如果Nginx位于負載均衡器奕塑,squid堂污,nginx反向代理之后,web服務(wù)器無法直接獲取到客戶端真實的IP地址龄砰。
$remote_addr獲取的是反向代理的IP地址盟猖。反向代理服務(wù)器在轉(zhuǎn)發(fā)請求的http頭信息中讨衣,可以增加X-Forwarded-For信息,
日志格式允許包含的變量:
$remote_addr, $http_x_forwarded_for 記錄客戶端IP地址
$remote_user 記錄客戶端用戶名稱
$request 記錄請求的URL和HTTP協(xié)議
$status 記錄請求狀態(tài)
$body_bytes_sent 發(fā)送給客戶端的字節(jié)數(shù)式镐,不包括響應頭的大小
$bytes_sent 發(fā)送給客戶端的總字節(jié)數(shù)
$connection 連接的序列號
$connection_requests 當前通過一個連接獲得的請求數(shù)量反镇。
$msec 日志寫入時間。單位為秒娘汞,精度是毫秒歹茶。
$pipe 如果請求是通過HTTP流水線(pipelined)發(fā)送,pipe值為“p”你弦,否
則為“.”惊豺。
$http_referer 記錄從哪個頁面鏈接訪問過來的,可以根據(jù)該參數(shù)進行防盜鏈設(shè)
置,防盜鏈從一定程度上緩解了服務(wù)器的壓力禽作。
日志格式:
日志條目:
查看Web服務(wù)器(nginx apache)的并發(fā)請求數(shù)及其TCP連接狀態(tài):
#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
LAST_ACK 5 (正在等待處理的請求數(shù))
SYN_RECV 30
ESTABLISHED 1597 (正常數(shù)據(jù)傳輸狀態(tài))
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057 (處理完畢尸昧,等待超時結(jié)束的請求數(shù))
redis
網(wǎng)站需要有大并發(fā),同一時間超過500人的點擊旷偿。那么為了快速給客戶端相應烹俗,你就得建立redis的數(shù)據(jù)庫。通過php調(diào)用
redis來解決大并發(fā)萍程。因為redis的數(shù)據(jù)庫基本在內(nèi)存中幢妄,響應快。
優(yōu)化:
worker_processes //定義在events模塊上面設(shè)置為“auto”與CPU個數(shù)一樣
worker_rlimit_nofile //定義在events模塊上面 文件句柄數(shù) 默認1024 設(shè)高(100000)
sendfile //用于http模塊 sendfile on 開啟新的傳輸方式
傳統(tǒng):硬盤—>內(nèi)核buf—>用戶buf—>socket相關(guān)緩沖區(qū)—>協(xié)議引擎
新: 當文件數(shù)據(jù)被復制到內(nèi)核緩沖區(qū)時茫负,不再將所有數(shù)據(jù)copy到socket相關(guān)的緩沖區(qū)蕉鸳,而是僅僅將記錄數(shù)據(jù)位置和長
度相關(guān)的數(shù)據(jù)保存到 socket相關(guān)的緩存,而實際數(shù)據(jù)將由DMA模塊直接發(fā)送到協(xié)議引擎
tcp_nopush on; 提升網(wǎng)絡(luò)的傳輸能力
防止網(wǎng)絡(luò)阻塞朽褪,此選項允許或禁止使用socket的TCP_CORK的選項置吓,此選項僅在使用sendfile的時候使用
server_tokens off; //用于http模塊 服務(wù)器應答頭
并不會讓nginx執(zhí)行的速度更快,但它可以關(guān)閉在錯誤頁面中的nginx版本數(shù)字缔赠,這樣對于安全性是有好處的衍锚。
gzip on; //用于http模塊 傳輸過程中壓縮數(shù)據(jù)
壓縮傳輸,一般對于手機用戶嗤堰,gzip功能要打開戴质,這塊比較重要,在本機壓縮踢匣,傳輸過去再解壓縮
keepalive_timeout
給客戶端分配keep-alive鏈接超時時間告匠。服務(wù)器將在這個超時時間過后關(guān)閉鏈接。
http {
keepalive_timeout 120s 120s;
keepalive_requests 10000;
}
超時值(默認75s)离唬;值為0會禁用keep-alive
設(shè)置一個keep-alive連接上可以服務(wù)的請求的最大數(shù)量后专,當最大請求數(shù)量達到時,連接被關(guān)閉输莺。默認是100戚哎。
client_header_timeout 和client_body_timeout
設(shè)置請求頭和請求體(各自)的超時時間裸诽。我們也可以把這個設(shè)置低些。
reset_timeout_connection
告訴nginx關(guān)閉不響應的客戶端連接型凳。這將會釋放那個客戶端所占有的內(nèi)存空間丈冬。
一、解決500錯誤:
1甘畅、500錯誤
指的是服務(wù)器內(nèi)部錯誤埂蕊,也就是服務(wù)器遇到意外情況,而無法履行請求疏唾。
2蓄氧、500錯誤一般有幾種情況:
(1)web腳本錯誤,如php語法錯誤荸实,lua語法錯誤等匀们。
(2)訪問量大的時候,由于系統(tǒng)資源限制准给,而不能打開過多的文件
3、一般分析思路:
(1)查看nginx error log 重抖,查看php error log
(2)如果是too many open files露氮,修改nginx的worker_rlimit_nofile參數(shù)(定義在events模塊上),使用ulimit查看系統(tǒng)打開文件限制钟沛,修改/etc/security/limits.conf ulimit -n 100000
(3)如果是腳本的問題畔规,則需要修復腳本錯誤,并優(yōu)化代碼
(4)各種優(yōu)化都做好恨统,還是出現(xiàn)too many open files叁扫,那就要考慮做負載均衡,把流量分散到不同服務(wù)器上去了
二畜埋、解決502莫绣,504錯誤
1、使用nginx代理悠鞍,而后端服務(wù)器發(fā)生故障对室;或者php-cgi進程數(shù)不夠用;php執(zhí)行時間長咖祭,或者是php-cgi進程死掉掩宜;已經(jīng)執(zhí)行fastCGI等使用情況都會導致502、504么翰。
2牺汤、502 Bad Gateway 是指請求的php-fpm已經(jīng)執(zhí)行,但是由于某種原因而沒有執(zhí)行完畢浩嫌,最終導致php-fpm進程終止檐迟。
一般來說戴已,與php-fpm.conf的設(shè)置有關(guān),也與php的執(zhí)行程序性能有關(guān)锅减,網(wǎng)站的訪問量大糖儡,而php-cgi的進程數(shù)偏少。針對這種情況的502錯誤怔匣,只需增加php-cgi的進程數(shù)握联。
具體就是修改/usr/local/php/etc/php-fpm.conf文件,將其中的max_children值適當增加每瞒。
這個數(shù)據(jù)要依據(jù)你的VPS或獨立服務(wù)器的配置進行設(shè)置金闽。一般一個php-cgi進程占20M內(nèi)存,你可以自己計算下剿骨,適量增多代芜。
/usr/local/php/sbin/php-fpm restart 然后重啟一下.
3、504 表示超時浓利,也就是客戶端所發(fā)出的請求沒有到達網(wǎng)關(guān)挤庇,請求沒有得到可以執(zhí)行的php-fpm
三、解決503錯誤
503 Service Temporarily Unavailable錯誤
單個ip并發(fā)設(shè)置過小會導致503報錯