如果是lvs,lvs只是把用戶發來的請求數據包轉到後端的服務器,後端的服務器看到是用戶請求是來自於客戶端
如果是nginx,nginx不是轉發用戶發來的請求,而是代替用戶去後端的Apache服務器去訪問,後端Apache服務器看到的用戶請求是來自nginx服務器,這叫反向代理
支持高可用
支持熱部署,不停機升級版本,新發起的請求,在新版本響應,如果是一個連接舊版本,就在舊版本響應,當舊的訪問結束了,新發起的請求我們就可以連接新的版本。也加平滑升級
支持的模塊 event-driven ,aio,mmap,sendfile
nginx是一個優秀的靜態資源的web服務器,用來存放一些靜態的頁面
lnmp :linux nginx mysql php-fpm php-mysql 注:php-fpm是fastcgi
nginx充當的是fastcgi的客戶端,nginx要監聽fastcgi的9000端口
客戶端連接nginx,nginx連接php-fastcgi,php-fastcgi連接php-mysql,php-mysql在連接mysql數據庫
而子進程worker連接各種所需要的模塊來處理用戶請求,而處理請求時基於事件驅動模型能實現單進程處理多路請求,單個進程能處理連接數由worker kenaiks定義,而一共能啓用的進程數只有worker_processes定義,二者的乘級就是他能處理的併發連接請求數量
nginx是一個master開多個worker,但是worker不多。但是每個worker可以併發支持很多人的訪問,worker中沒有線程,用的是I/O複用,
worker支持很多模塊,每個模塊有特定的功能,例如:web服務,代理服務,fastcgi
master和worker之間的關係:master管理worker進程,例如:銷燬,會加載一個worker,平滑升級,都是master進程來負責的,master相當老闆,用戶發來請求,master不會提供服務
nginx支持反向代理:nginx可以將用戶的請求調度到後端的web服務器,或者fastcgi服務器
nginx還支持緩存功能:用戶將請求發給nginx,nginx可以緩存一份數據,下次用戶訪問就可以直接在緩存中響應請求,就不用到後端服務器去重新查找數據。nginx基於緩存加載,緩存管理的功能。這個緩存放在內存中也可能放在nginx磁盤裏
Apache支持多http虛擬主機,不支持多https虛擬主機
nginx支持多https虛擬主機,因爲nginx支持SNI
apache的併發只能達到10000,而nginx能輕鬆達到30000
select 跨平臺,在linux實現了,也在windows支持
epoll :epoll比select有巨大的區別,因爲epoll具有信號驅動I/O模型的某些特性
epoll和select的區別
select和epoll都可以面對多個用戶的進程發請求,select和epoll相當代理人收集很多用戶的請求過來,然後收集完成,select和epoll去幫你從磁盤上發數據,得到數據方複製到內核中,來得到相應的數據,但是這個數據有沒有準備好,select和epoll的實現機制是不一樣的
select和poll :遍歷機制,一個一個的查找用戶的數據是否準備好
epoll :回調機制:相當於異步的機制,具有信號的一些特性,因此,當你的數據準備好以後epoll會主動通知你,相對來講epoll比select效率要高 。
select併發連接,接收的用戶請求是1024個,poll的併發連接無上限
水平觸發:如果是水平觸發,是通知多次,這次數據沒有準備好,在通知
邊緣觸發:只做一次的事,不分多次做,相對消耗資源少,邊緣觸發性能要更好
如果要安裝新版本的nginx可以在nginx的官方網站,進行拷貝官方提供的yum源
ab -c 1000 -n 2000 http://172.20.127.169/
1.worker_processes auto; 根據CPU當前的情況自動定義worker的數量,最好和當前的CPU數量相等,例如:我們有兩個cpu就有2個worker,但是並不是worker越多性能就越好,因爲每開一個進程都要消耗CPU,如果開的進程多,消耗的CPU就越多。nginx的一個worker就可以併發支持多個用戶的訪問,所以nginx不是一個進程響應一個用戶
2.我們可以將一個worker和一個CPU綁定,這樣的好處是提高緩存的命中率,我們的CPU裏面也有緩存,如果一個worker和cpu綁定在一起,這樣CPU裏面的緩存就可以一直被這個worker重複使用,如果不綁定就有可能帶來問題,例如:支持跑在這個CPU,待會又可能跑在另一個CPU上,這樣原來CPU上的緩存就將失效了,由此會反過來影響我們的性能
watch -n 0.5 'ps axo pid,cmd,psr |grep nginx'
例如有兩個CPU,兩個worker,我們將worker綁定在第一個和第二個CPU上
3.worker進程的優先級,worker優先級的 -20,19
watch -n 0.5 'ps axo pid,cmd,psr,nice |grep nginx' 注:nice就是優先級
4.worker進程能打開的文件數量上限,支持多少個用戶併發
worker_rlimit_nofile 30000; 代表worker的總值
5. events 事件驅動,我們在nginx用的是epoll模型
我們可以定義一個worker的併發連接是15000,兩個worker的併發就是30000
6. accept_mutex on |off 互斥 處理新請求的方法
如果啓用,如果有多個請求,第一個請求發送給第一個worker,第二個請求發送給第二個worker
如果不啓用,如果來了一個請求,就都喚醒所有的worker,最後還是一個worker提供服務的
是否以守護進程方式運行,默認是守護進程,守護進程就是前臺執行還是後臺執行
是否以master/worker模型運行nginx,默認是on啓用的
ngx_http_core_module 模塊,模塊中的指令
server 語句塊,這個server語句塊是放在http語句塊裏面的
我們可以建多個虛擬主機,建每個虛擬主機放在不同的.conf文件裏面,方便管理
是否當用戶發請求到http網站的時候,如果我們啓用keepalived服務器狀態監測模式,意味着用戶發來請求不立即斷開,可以繼續發多個請求過來,一次tcp握手,可以連接多次請求
直接從磁盤把數據複製到內核空間,然後內核空間直接把數據複製到內核關於socket ba fe的緩衝區
server_tokens on |off | build |string
我們要在配置文件的http語句塊裏面設置,這樣隱藏全部的版本號,如果想隱藏單獨的虛擬主機我們可以虛擬主機的server裏面設置
location:可以定義某個位置,根據這個位置來單獨的做額外的處理
當我們訪問news的url的時候,訪問的是/data/sitea/
當訪問url的news的上,訪問的是/app/sitea/下news目錄下的index.html
訪問www.a.com 的根站點 /www/sitea/目錄
alias 例如:當我們訪問網站url的/bbs/目錄時,得到的數據是來自於/web/forum/index.html
root 例如:當我們訪問網站url的/bbs/目錄時,的到的數據是來自於/web/forum/bbs/index.html
error_page_code 錯誤頁面
如果訪問的是一個不存在的頁面,我們可以定義把報錯轉到我們定義的位置頁面
如果404報錯就將報錯頁面轉到我們指定的/data/sitea/404.html/ 頁面
當我們訪問一個錯誤頁面,我們將404響應改成200的響應碼,我們看到的還是404報錯的頁面
try_files :當我們找一個內容,按照什麼順序去尋找順序
try_files $uri /images/default.gif;
當訪問/images/目錄下的內容的時候,進到目錄挨個找,先找$uri(xx.html),如果找不到就訪問/images/default.gif默認頁面
try_files $uri $uri/index.html $uri.html =404;
當訪問根的時候,先找$uri,如果沒有就找$uri $uri/index.html,如果還找不到,就找$uri.html並返回一個404頁面
當訪問images目錄下的a.jpg就返回a.jpg,如果沒有a.jpg就返回default.jpg
用於接收每個客戶端請求報文的body部分的緩衝區大小,默認是16k,超出此大小時,其將被暫存到磁盤上的由下面client_body_temp_path指令所定義的位置。
limit_except method 只能用在location
限定客戶端的請求方法
只能是內部管理員訪問除了GET的其他方法,其他互聯網用戶都不能訪問
ngx_http_access_module 控制用戶誰能訪問,誰不能訪問
ngx_http_auth_basic_module 用戶身份驗證
htpasswd -cm nginxuser httpuser1 創建用戶httpuser1,第一次創建要加 c
htpasswd -cm nginxuser httpuser2 創建用戶httpuser2,第二次創建不用加 c
vim /etc/nginx/conf.d/a.com.conf
auth_basic_user_file 用戶密碼文件的位置
ngx_http_stub_status_module 狀態頁
ngx_http_log_module 指定日誌格式的記錄請求
access_log /var/log/nginx/a.com_access.log testlog;
日誌的存放位置 /var/log/nginx/a.com_access.log
ngx_http_gzip_module 壓縮 注:必須使用在生產中
gzip_comp_level 壓縮的級別 1到9,默認是1
gzip_http_version 1.0 | 1.1 啓用壓縮功能時的協議版本,http一般是1.1
gzip_buffers 壓縮時緩衝區數量及每個緩衝區的大小
gzip_types 針對什麼資源壓縮 例如:text文本和html壓縮,默認對html壓縮
gzip_vary on|off 如果啓用壓縮是否在響應報文的首部插入一個專門表示壓縮的首部報文頭部
gzip_proxied 壓縮的時候,如果nginx充當登錄服務器,是否對後端服務器的響應報文在某中條件下壓縮,根據後端服務器發的信息決定壓縮不壓縮
gzip_min_length 64; 壓縮的大小 單位字節
gzip_types text/xml text/css application/javascript text/plain; 壓縮的資源
只要加密就需要證書
ssl_protocols ssl的協議支持的版本TLSv1;TLSv1.1;TLSv1.2
ssl_session_cache 我們通過http連接到網站 會有一些session會話消息,session消息爲了加速訪問可以考慮緩存cache
builtin[:size] 所用的openssl內建緩存,每個worker進程它的ssl會話信息是私有的,可以指定大小
[shared:name:size] 在多個worker之間使用一個共享的緩存。使用的時候要起名,並指定大小
ssl_session_timeout session會話的超時時長,默認是5分鐘
make a.crt 創建證書
我們是加密的,如果要啓用nginx分爲要輸入密碼,我們可以解密密碼
openssl rsa -in a.key -out aa.key a.key解密成aa.key
cp a.crt aa.key /etc/nginx/conf.d/
可以創建多https加密虛擬主機,因爲nginx支持SNI名稱空間,要創建新的證書,祕鑰
openssl s_client -connect www.c.com:443
ngx_http_rewrite_module
例如:我們平常訪問http:/www/baidu.com 會跳到https:/www/baidu.com,就是基於rewrite實現的
last :url會按照正則表達式去查找,例如:如果找到符合的url2就會替換成新的url2,然後看到last就不會往下查找 ,建議不要在location中使用,會造成死循環
break : 如果發現break就在終止跳轉,不會在往下跳轉,不會造成死循環
http://nginx/regex1 ---》http://nginx/url2
rewrite ^/bbs/(.*)$ /froum/$1 last
如果訪問^/bbs/開頭的index.html文件就跳轉到froum下的index.html文件
rewrite / https://www.a.com/ redirect;
如果訪問/根網站,就轉到https://www.a.com/
if ( $scheme = http ){ 如果是http就跳轉到https://www.a.com/
rewrite / https://www.a.com/ redirect;
如果訪問www.a.com/admin/就返回拒絕,顯示這是一個非法地址
if如果 url ~* 不區分大小寫,包含admin的就返回403拒絕訪問,並返回一個提示DENY ACCESS
在a的網站主頁目錄/data/sitea/目錄下創建一個daolian.html
在a網站盜取了b網站的圖片,爲a網站服務
我們要避免這種情況,來避免自己網站的圖片被別的網站盜取我們的圖片
跳轉,當我們點擊www.b.com的時候。從當前站點跳轉到www.b.com
varid_referer有效的訪問, 根據跳轉的網站,是非法的還是合法的,假如,是從百度跳過來的就是合法的,從別的地方跳過來的就是非法的。
我們用varid_referer決定誰是合法的,誰是非法的
blocked:請求報文有referer首部,但沒有有效值,可能是反向代理服務器吧referer清空了
server_names 參數,將來帶有的值是某一個域名,當然也有可能是某一個模式
regular expression 可以寫正則表達式,但是有一個要求,要用~波浪符表示開頭,後面纔是正則表達式
valid_referers none block server_names *.b.com ~\.baidu\.; none 沒有referer的,block有referer但是沒值的,server_names帶有域名的,*.b.com以b.com結尾的,~\.baidu\包含baidu的都是合法的
if ($invalid_referer) { 其他的都是非法的,返回403
當訪問www.a.com 的根時候就代理到後端的192.168.63.131服務器
因爲/bbs 比/ 更精確,優先級更高,所以先查找/bbs目錄的url下的數據,發現一bbs開頭的目錄下的文件都轉換成/froun目錄下的文件,然後在查找/根發現,代理到192.168.63.131後端的服務器上,就變成了http://192.168.63.131//froun/.*
加/斜杆: 就是當訪問/bbs的時候,就置換成http://192.168.63.131/
不加/斜杆:當訪問/bbs的時候,就在http://192.168.63.131/後面加/bbs目錄充當我的URL,變成http://192.168.63.131/bbs
proxy_pass 前面加斜杆是不允許有正則表達式的,否則會有語法錯誤
只有圖片文件的時候例如 .jpg .gif 等文件的時候,才調度到http://192.168.63.131 服務器
一臺後端服務器安裝Apache,php-fpm ,php-mysql連接數據庫
一臺後端服務器安裝數據庫,mariadb-server,創建允許遠程連接的用戶
注意:後端服務器收到的請求的ip地址來源於nginx代理服務器的ip,並不是真正的遠程客戶端的ip
解決方法:是在數據報文的頭部在添加一個新的頭,數據報文的結構有首行,首部字段行,還有實體行,其中我們可以在首部字段添加一個新的報文頭部。就是在請求報文的頭部加上客戶端的ip
但是後端的web服務器默認記錄日誌,記錄的是還是客戶端也就是nginx代理服務器的地址,不會記錄加的報文頭部的地址,因爲web服務器的日誌格式是預先定義好的,所以我們要更改日誌的格式
proxy_set_header remoteclientip $remote_addr
vim /etc/httpd/conf/httpd.conf
remoteclientip是在nginx代理服務器上新加的頭部
proxy_add_x_forwarded_for 解決多層代理
在生產中可能有多臺代理服務器,我們可以將多臺代理服務器地址累加在一起
如果在兩層代理服務器上都加proxy_set_header 會在後端服務器上看到所有疊加的代理服務器的ip,還有真實的客戶端ip
如果只在最外層的代理服務器上加proxy_setheader,在後端服務器上的日誌只會顯示真實客戶端的ip,看不到中間發現代理服務器的地址
proxy_cache_path 可以定義反向代理緩存的功能
我們可以將一些頁面緩存到服務器上,下次客戶端就不需要跑到後端服務器去找數據了,直接在代理服務器進行數據的響應,進而提高速度
[levels=levels]存放緩存不是文件名的方式,而是把文件起哈希值做計算,把哈希值當文件名,哈希值存的時候會按照一級,二級,三級,定義多少級來存,每一級就是安裝哈希值的數字來作爲文件夾名,所以要設定,分幾級,每一級佔幾個16進制數
keys_zone=name:size 是否起一個名稱,這個名字是將來要在某個虛擬主機去用這個緩存,所以要起一個名字,調用這個名稱,接下來還要指定它的大小,緩存佔多大空間
[inactive=time] 緩存失效的時間,當失效了就將緩存刪掉
proxy_cache_path /var/cache/nginx/proxy_cache 將來要存放緩存的位置
levels=1:1:1 keys_zone=proxycache:20m
注意: keys_zone指定的20m,說的是在內存中佔20m的空間,但是這個緩存存的不是數據,真正的數據放在/var/cache/nginx/proxy_cache 磁盤路徑裏面,這個緩存放在內存中是key鍵和metadata源數據,所謂的key鍵就是用戶訪問的url,值就是文件名,但是值不放在緩存的內存中,它是放在磁盤空間上max_size=1g; 最大1g
放的是key和metadata源數據,比如說源數據訪問了多少次
/var/cache/nginx/proxy_cache 這個路徑放的的是頁面文件,放在磁盤裏面
vim /etc/nginx/nginx.conf 主配置文件
在我們的虛擬主機記錄 在哪個location裏面轉發的時候反向代理服務器緩存信息放在過程指定的位置裏面
proxy_cache proxycache; 指定前面定義緩存的名字proxycache,要定義這個緩存
proxy_cache_key $request_uri; 調用的時候用$request_uri用戶訪問的url當key,值是文件內容
proxy_cache_valid 200 302 301 1h; 在200 302 301 這些響應嗎的時候才啓用緩存,緩存1小時
proxy_cache_valid any 1m; 其他的緩存1分鐘
內存裏面放的是,訪問的url也就是key鍵,還有metadata源數據,訪問了幾次也就是緩存命中率
真正的數據是存放在磁盤上的,而且存放磁盤的時候他是把文件做了一個哈希運算,放到文件上
如果後端服務器down機了,然後緩存的信息又過期了,我們可以考慮用過期的緩存繼續提供服務
proxy_hide_header 隱藏後端服務器的特定報文
ngx_http_headers_module模塊,加這個模塊有助於排除
向由代理服務器響應給客戶端的響應報文添加自定義首部,或修改指定首部的
add_header X-Via $server_addr; 中間的反向代理服務器地址
add_header X-Cache $upstream_cache_status; 緩存的命中率情況
add_header X-Accel $server_name; server的名稱
192.168.63.132 php-fpm php-mysql
yum install php-fpm php-mysql -y
listen.allowed_clients = 192.168.63.131 允許訪問的ip
pm.status_path = /status 啓用測試頁面
ping.response = pong 測試PHP測試是否存活
fastcgi_param nginx要充當fastcgi的客戶端要傳一些變量參數過去
在nginx的程序中已經有很多自帶的有關fastcgi變量在/etc/nginx/fastcgi_params
fastcgi_param 就是fastcgi傳過去的具體路徑,將來將前端發來的PHP請求發送到後端fastcgi哪個文件夾上
location ~* ^/(pm_status|ping)$ { 當訪問fastcgi的pm_status或ping的時候就轉發大後端的fastcgi服務器
fastcgi_pass 192.168.63.141:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
在主配置文件http語句塊插入,緩存的存放的路徑,還有定義緩存的名字fcgicache,內存的大小20m,這個內存存放的是key鍵和源數據和源數據的次數。緩存的值是放在磁盤裏面
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
nginx自帶健康性檢查功能,如果發現有一臺後端服務器down機,可以實現不給down的服務器調度
例如後端有多臺服務器,可以用nginx的upstream模塊實現調度
location / 當訪問根的時候,訪問的www代表的兩個主機
還可以設置連接後端服務器失敗幾次,超出這個數字,就是出故障了,就不調度了
還可以設置超時時長,多長時間連接不了後端服務器,後端服務器就故障了
可以將後端服務器標記爲備用,只有後端的所有服務器都不能用了,才啓用備用服務器
還可以吧後端服務器標記爲不可用,就不往這個服務器上調度,例如要更新的時候,可以先把這個服務器下線,進行更新
進行源地址進行哈希運算,只要是同一個ip地址來的請求,始終往一個服務器上調度
hash $request_uri 根據uri進行調度,例如我們有一臺調度服務器,後端有2臺服務器,用戶發來請求,我們查看uri是什麼,如果一個url就向後端其中以個服務器進行調度,如果是另一個uri就向另外一個服務器調度,這2個服務器的權重還不一樣,第一臺服務器的權重是1,第二臺服務器的權重是2,我們可以根據權重進行哈希運算並和權重的總和取模,