一.nginx的入門學習
1.1.概念
正向代理:知道目標服務器地址,但是要借助代理來轉發
反向代理:用戶只知道nginx的暴露的網址,不知道nginx背后的服務器地址(例如tomcat),也不能直接訪問
負債均衡:可以擴展服務器,減少單台服務的請求壓力
動靜分離:html和css,js等放在一個靜態資源和 jsp servlet等分開項目
1.2安裝
方式1:yum源安裝(官方推薦)
步驟1 打開網址https://nginx.org/en/linux_packages.html#RHEL-CentOS
nstall the prerequisites: sudo yum install yum-utils -- 安裝工具 To set up the yum repository, create the file named /etc/yum.repos.d/nginx.repo with the following contents: [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true By default, the repository for stable nginx packages is used. If you would like to use mainline nginx packages, run the following command: sudo yum-config-manager --enable nginx-mainline To install nginx, run the following command: sudo yum install nginx 安裝完成 When prompted to accept the GPG key, verify that the fingerprint matches 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62, and if so, accept it.
步驟2,對應的路徑如下
2.手動編譯安裝
wget 下載包XXX.tar.gz->解壓 tar zxvf XXX ->下載C環境 -> 編譯並安裝make && make install
1.3 啟動方式
1.4退出方式
kill -quit pid -- 從容的停止
kill -trem pid -- 立即停止
kill -9 pid -- 干掉主進程不會干掉其他子進程
nginx自帶的退出
sbin/nginx -s quit --從容退出
sbin/nginx -s stop--強制退出
1.5 重啟
sbin/nginx -s reload
重啟之前可以做一個測試 sbin/nginx -t
1.6核心配置模塊
main塊下面的woker_process數量建議為cpu數*核數 例如 4個cpu 雙核的 那就為 8
http模塊下面有server,每個server就是一個虛擬主機
1.7虛擬主機配置
1.8 location的配置
1.普通匹配 只匹配前綴
2.精確匹配 全匹配
3.正則匹配
遵循最長匹配規則 /demo 和/都匹配了,就找/demo
普通規則和精准規則,以精准的為主
二.實戰
2.1 反向代理
proxy_pass 反向代理服務器的路徑
proxy_method 可以改變method
下面可以獲取源請求的數據
2.2 負債均衡
配置
負債均衡的語法
負債均衡的策略
輪詢
缺點:會話不一致
ip_hash
權重
2.3動靜分離
動靜分離、緩存處理、壓縮處理
2.4原理分析
master:主進程,負責管理調度,類似於springmvc的dispatchServlet
worker:工作進程,真正的工作進程
reload的原理:修改nginx. conf之后發送reload命令給master->進行語法檢查 通過就嘗試配置->成功后就使用新的worker->新的worker會通知舊的worker把當下的任務完成后關閉了,具體如下
2.5優化配置文件
user root root; |
默認用戶是nobody,如果nginx需要訪問某些比如root類權限的文件,會提示403錯誤,修改這個可以通過root去訪問 |
worker_processes 2;worker_cpu_affinity 01 10 |
nginx默認是沒有開啟利用多核cpu的配置的。需要通過增加worker_cpu_affinity配置參數來充分利用多核cpu,cpu是任務處理,當計算最費時的資源的時候,cpu核使用上的越多,性能就越好。解釋:01表示啟用第一個CPU內核,10表示啟用第二個CPU內核worker_cpu_affinity 01 10;表示開啟兩個進程,第一個進程對應着第一個CPU內核,第二個進程對應着第二個CPU內核。 |
error_log /var/log/nginx/error.log warn; |
錯誤日志級別 |
worker_rlimit_nofile 20480; |
更改worker進程的最大打開文件數限制, 如果沒設置的話,這個值為操作系統的限制, 所以把這個值設高,這樣nginx就不會有“too many open files”問題了。設置了這個后,修改worker_connections值時,是不能超過worker_rlimit_nofile的這個值(其實核心原因就是程序打開的文件/socket鏈接數量超過系統設定值) |
use epoll; |
使用epoll的I/O模型,這個不用說了吧。{select/pool/kqueue/epool ; select、poll是標准工作模式、kquque、epoll是高效工作模式,epoll是用在linux系統。kqueue是用在bsd系統(unix的衍生系統) |
worker_connections 20480; |
nginx默認的並發連接數是1024,如果網站訪問量過大,就需要調整這個值,值越大能夠支撐的並發數也就越大。但是最終的天花板是CPU; 理論上每台nginx服務器的最大連接數為worker_processes*worker_connections |
accept_mutex off; |
當一個新連接到達時,如果激活了accept_mutex,那么多個Worker將以串行方式來處理,其中有一個Worker會被喚醒,其他的Worker繼續保持休眠狀態;如果沒有激活accept_mutex,那么所有的Worker都會被喚醒,不過只有一個Worker能獲取新連接,其它的Worker會重新進入休眠狀態,這就是「驚群問題」。假設你養了一百只小雞,現在你有一粒糧食,那么有兩種喂食方法:你把這粒糧食直接扔到小雞中間,一百只小雞一起上來搶,最終只有一只小雞能得手,其它九十九只小雞只能鎩羽而歸。這就相當於關閉了accept_mutex。你主動抓一只小雞過來,把這粒糧食塞到它嘴里,其它九十九只小雞對此渾然不知,該睡覺睡覺。這就相當於激活了accept_mutex。可以看到此場景下,激活accept_mutex相對更好一些,讓我們修改一下問題的場景,我不再只有一粒糧食,而是一盆糧食,怎么辦?此時如果仍然采用主動抓小雞過來塞糧食的做法就太低效了,一盆糧食不知何年何月才能喂完,大家可以設想一下幾十只小雞排隊等着喂食時那種翹首以盼的情景。此時更好的方法是把這盆糧食直接撒到小雞中間,讓它們自己去搶,雖然這可能會造成一定程度的混亂,但是整體的效率無疑大大增強了。 |
include /etc/nginx/mime.types; |
這里我們使用它來加載文件擴展名與文件類型映射表。nginx根據映射關系,設置http請求響應頭的Content-Type值。當在映射表找不到時,使用nginx.conf中default-type指定的默認值。 |
default_type application/octet-stream; |
指定默認類型為二進制流,也就是當文件類型未 定義時使用這種方式 |
sendfile on; |
開啟高效傳輸模式 |
keepalive_timeout 60; |
http連接的超時時間 |
include extra/*.conf; |
通過不同配置文件進行管理 |
2.6跨域訪問
同協議 同域名 同端口都相同才算同源策略
http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允許 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夾 允許 http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允許 http://www.a.com/a.js https://www.a.com/b.js 同一域名,不同協議 不允許 http://www.a.com/a.js http://70.32.92.74/b.js 域名和域名對應ip 不允許 http://www.a.com/a.js http://script.a.com/b.js 主域相同,子域不同 不允許 http://www.a.com/a.js http://a.com/b.js 同一域名,不同二級域名(同上) 不允許(cookie這種情況下也不允許訪問) http://www.cnblogs.com/a.js http://www.a.com/b.js 不同域名 不允許
解決跨域三種方式:
jsonp
服務器配置跨域
@CrossOrigin
nginx做代理
location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; if ($request_method = 'OPTIONS') { return 204; } proxy_pass http://192.168.12.1:8081; }
2.7 防盜鏈
location ~* .*\.(gif|jpg|ico|png|css|svg|js)$ { root /usr/local/nginx/static; valid_referers none blocked *.gupao.com ; if ($invalid_referer) { #rewrite ^/ http://www.youdomain.com/404.jpg; return 403; break; } access_log off; }
2.8實現高可用
keepalive+nginx實現高可用
配置文件 global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.17.129 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 #(檢測腳本執行的間隔) weight 2 } vrrp_instance VI_1 { state BACKUP # 備份服務器上將 MASTER 改為 BACKUP interface ens33 //網卡 virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同 priority 90 # 主、備機取不同的優先級,主機值較大,備份機值較小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.12.150 // VRRP H 虛擬地址 } }