Nginx學(xué)習(xí)筆記
1蔗坯、Nginx初識
Nginx 是一個(gè)高性能的Http和反向代理服務(wù)器撮躁。也是一個(gè)IMAP/POP3/SMTP等郵件代理服務(wù)器。
(一) 正向代理和反向代理
正向代理:客戶端client通過設(shè)置颈娜,使用代理服務(wù)器proxy去訪問遠(yuǎn)程服務(wù)器server地回。
|client - proxy | - server
使用場景:
- 可以訪問原來無法訪問的資源
- 做緩存使用,加快訪問速度
- 對客戶端授權(quán)或記錄訪問信息等
反向代理:服務(wù)器通過代理服務(wù)接收連接請求扔枫,然后再轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)的服務(wù)器汛聚,將服務(wù)器的結(jié)果返回給客戶端,此時(shí)這種代理叫反向代理短荐。
client - | proxy - server |
使用場景:
1)保證內(nèi)網(wǎng)的安全倚舀,阻止web攻擊。
2)負(fù)載均衡忍宋,優(yōu)化網(wǎng)站的負(fù)載(處理能力)
一句話痕貌,代理服務(wù)器站在客戶端一邊(能夠感知),就是正向代理糠排;代理服務(wù)器站在服務(wù)端一邊(客戶不感知)舵稠,就是反向代理。
(二) Hello Nginx
nginx安裝包所在目錄 /usr/local/src/
nginx安裝目錄 /usr/local/nginx/
啟動(dòng)命令 ./nginx
驗(yàn)證方式 瀏覽器訪問 虛擬機(jī)ip地址 (返回nginx歡迎頁面)
啟動(dòng)后入宦,進(jìn)程id存放位置 /usr/local/nginx/nginx.pid
查看文件 cat nginx.pid
關(guān)閉方式: ./nginx -s stop 原生命令
殺死進(jìn)程:
kill + 參數(shù) + pid 形式
如 : kill -9 pid 強(qiáng)制停止服務(wù)
kill -TERM pid 快速停止服務(wù)
kill -QUIT pid 平緩?fù)V狗?wù)
信號處理命令:
./nginx -s + ( stop, quit, reopen, reload)
其中 reload 是重加載命令哺徊, 在更改配置后使用
quit仍然是平緩?fù)V沟囊馑迹ㄍ暾行颍瑂top是快速停止
2乾闰、Nginx配置
分為三部分落追,全局塊、events塊汹忠、http塊淋硝。
(一)全局塊
全局指令,指定運(yùn)行時(shí)的用戶組宽菜、進(jìn)程id存放位置、日志存放位置竿报、worker process數(shù)量等等铅乡。
# 配置用戶或者用戶組
#user nobody;
# 允許生成的進(jìn)程數(shù)
worker_processes 1;
# 日志路徑設(shè)置 可以配置級別
# debug | info | notice | warn | error | crit
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 存儲進(jìn)程id的文件地址
#pid logs/nginx.pid;
(二)events塊
影響nginx服務(wù)器和用戶網(wǎng)絡(luò)連接的配置,比如每個(gè)進(jìn)程的最大連接數(shù)烈菌,選取哪種事件驅(qū)動(dòng)模型阵幸,以及在網(wǎng)絡(luò)連接過程中花履,是否開啟多個(gè),是否序列化等等挚赊。
events {
# 每個(gè)進(jìn)程的最大連接數(shù)
worker_connections 1024;
}
(三)http塊
配置代理诡壁、緩存、日志等絕大部分功能的地方荠割,可以嵌套多個(gè)server塊妹卿,而不同的server可以對應(yīng)不同的域名(虛擬主機(jī))
(1)虛擬主機(jī)的配置
虛擬主機(jī):同一臺nginx服務(wù)器,可以支持多個(gè)網(wǎng)站的運(yùn)行蔑鹦,每個(gè)虛擬主機(jī)之間都相互獨(dú)立夺克,具有完整功能。
http {
# 對應(yīng)虛擬主機(jī)的配置
server{
# 監(jiān)聽端口
listen 80;
# 監(jiān)聽域名
server_name localhost;
# 定位出路徑或文件地址
location / {
# 相對路徑
root html;
# 默認(rèn)跳轉(zhuǎn)的首頁地址
index index.html index.htm;
}
}
server{
}
}
配置指定域名(www.duyi123.com)嚎朽,訪問到虛擬機(jī)上的頁面
1)在安裝目錄下铺纽,創(chuàng)建文件夾,如: mkdir duyi123
- 創(chuàng)建頁面哟忍, index.html
- 更改配置
http {
# 對應(yīng)虛擬主機(jī)的配置
server{
# 監(jiān)聽端口
listen 80;
# 監(jiān)聽域名
server_name duyi123.com;
# 定位出路徑或文件地址
location / {
# 相對路徑
root duyi123;
# 默認(rèn)跳轉(zhuǎn)的首頁地址
index index.html;
}
}
}
- 給域名配置ip地址的映射
更改hosts文件 (C:\Windows\System32\drivers\etc)
5)瀏覽器輸入虛擬機(jī)地址或者域名 duyi123.com 狡门,均能返回自定義頁面
(2)日志配置
通過日志,可以獲取到用戶地址信息锅很、跳轉(zhuǎn)來源其馏、終端、以及url訪問量等等粗蔚。
#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;
日志demo
192.168.1.11 - - [04/Mar/2020:13:03:39 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36"
日志分析 | 對應(yīng)屬性 | 用途 |
---|---|---|
192.168.1.11 | remote_addr | 客戶端的ip地址 |
- - | remote_user | 客戶端的用戶名稱 |
[04/Mar/2020:13:03:39 +0800] | time_local | 訪問時(shí)間和時(shí)區(qū) |
"GET / HTTP/1.1" | request | 請求方法 |
200 | status | 響應(yīng)狀態(tài)碼 如:200 |
612 | body_bytes_sent | 主體內(nèi)容字節(jié)數(shù) 如:612 |
"-" | http_referer | 記錄是從哪個(gè)鏈接訪問過來的 |
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) | http_user_agent | 用戶使用的代理(瀏覽器) |
Chrome/80.0.3987.100 Safari/537.36" | http_x_forwarded_for | 通過代理服務(wù)器來記錄客戶端的ip地址 |
可以通過腳本實(shí)現(xiàn)日志切割(每天生成一份日志)
重命名日志文件 - 讓nginx重新從配置中讀取日志文件名 - 在新的日志文件中記錄日志
(3)反向代理配置
前提:系統(tǒng)中安裝好jdk和tomcat(配置好環(huán)境變量)
已安裝的目錄地址:
1) jdk路徑 /usr/local/java/
2) tomcat路徑 /usr/local/tomcat/
啟動(dòng)方式 /usr/local/tomcat/bin 執(zhí)行 ./startup.sh
關(guān)閉方式 執(zhí)行./shutdown.sh
驗(yàn)證方式 虛擬機(jī)ip:8080 可以看到tomcat頁面
原需求: 訪問域名duyi123.com 顯示 nginx路徑/duyi123/index.html頁面
現(xiàn)需求: 訪問域名duyi123.com 顯示 tomcat 首頁
實(shí)現(xiàn)方式
location / {
#root duyi123;
proxy_pass http://127.0.0.1:8080;
#index index.html;
}
注意:更改配置文件nginx.conf后尝偎,執(zhí)行重加載命令 ./nginx -s reload
進(jìn)階需求:一臺nginx連接多臺tomcat,當(dāng)域名下對應(yīng)不同路徑時(shí)鹏控,分發(fā)給不同的tomcat處理
實(shí)現(xiàn)方式
a) 拷貝一個(gè)tomcat安裝目錄致扯,修改server.xml配置中的三處端口
b) 分別在webapps目錄下,創(chuàng)建tomcat1和tomcat2目錄当辐,放置index.html(顯示不同的tomcat以及其端口)抖僵,啟動(dòng)兩個(gè)tomcat
c) 通過瀏覽器訪問 虛擬機(jī)ip:8080/tomcat1/index.html 以及
虛擬機(jī)ip:8081/tomcat2/index.html 都可以展示出內(nèi)容
d) 修改nginx配置文件并重加載
location ~ /tomcat1/ {
#root duyi123;
proxy_pass http://127.0.0.1:8080;
#index index.html;
}
location ~ /tomcat2/ {
proxy_pass http://127.0.0.1:8081;
}
e) 瀏覽器驗(yàn)證,訪問 http://duyi123.com/tomcat1/index.html 和 http://duyi123.com/tomcat2/index.html缘揪,均能找到對應(yīng)頁面耍群。
最終實(shí)現(xiàn)通過不同的路徑,映射到不同的tomcat目錄下
(4)負(fù)載均衡
client1 client2 .... clientN --- server
client1 client2 ... client 2^n --- server1 server2 .. serverN
早期使用DNS(域名解析系統(tǒng))做負(fù)載找筝,具體而言蹈垢,給客戶端解析不同的ip地址,讓流量直接到達(dá)服務(wù)器袖裕。
clientN - 負(fù)載均衡器(load balancer) --調(diào)度算法-- serverN
優(yōu)點(diǎn):
1) 通過健康檢查曹抬,避免單點(diǎn)故障
2) 當(dāng)發(fā)現(xiàn)節(jié)點(diǎn)故障時(shí),從集群中移除急鳄,保證應(yīng)用的高可用
四層負(fù)載均衡谤民,在OSI模型的傳輸層堰酿,主要是轉(zhuǎn)發(fā)。
七層負(fù)載均衡张足,在OSI模型的應(yīng)用層触创,主要是代理。
負(fù)載均衡器可以處理四大類型的請求为牍,HTTP/HTTPS/TCP/UDP等哼绑。
負(fù)載均衡的調(diào)度算法:
1) 輪詢, 相當(dāng)于將服務(wù)器從第1臺到最后1臺吵聪,形成一個(gè)環(huán)狀凌那,每接收一筆請求,則從1臺開始循環(huán)遍歷吟逝。
2)最小連接帽蝶,優(yōu)先選擇連接數(shù)最少的服務(wù)器,適用于會話時(shí)間較長的業(yè)務(wù)處理块攒。
3)ip映射励稳,根據(jù)請求的ip地址進(jìn)行散列,讓同一ip下的請求都映射到同一服務(wù)器上囱井,可以解決session問題驹尼。(粘性會話)
當(dāng)訪問 192.168.1.20/lb/index.html時(shí),通過負(fù)載均衡庞呕,讓請求平均分配到8080和8081端口中新翎。
1) 分別找到兩個(gè)tomcat的安裝目錄,如/usr/local/tomcat/webapps
創(chuàng)建lb目錄住练, mkdir lb
創(chuàng)建訪問頁面地啰, cp tomcat1/index.html lb
查看頁面內(nèi)容, cat lb/index.html
2) nginx.conf配置的修改
# http塊的層級下
upstream myserver{
# server列表的地址和端口
server 192.168.1.20:8080;
server 192.168.1.20:8081;
}
server {
listen 80;
server_name 192.168.1.20;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 將請求映射到負(fù)載均衡器中 參數(shù)為配置的upstream名稱
proxy_pass http://myserver;
}
}
3) 瀏覽器訪問 http://192.168.1.20/lb/index.html
以上讲逛,是默認(rèn)的輪詢調(diào)度算法亏吝。
如果需要額外設(shè)置權(quán)重,某個(gè)服務(wù)器處理的更多些盏混,使用weight蔚鸥,默認(rèn)值是1。
upstream myserver{
# server列表的地址和端口
server 192.168.1.20:8080 weight=2;
server 192.168.1.20:8081 weight=1;
}
如果需要根據(jù)ip地址许赃,固定server處理止喷,可以使用ip_hash。
upstream myserver{
server 192.168.1.20:8080 weight=2;
server 192.168.1.20:8081 weight=1;
ip_hash;
}
(5) 動(dòng)靜分離
將動(dòng)態(tài)和靜態(tài)請求分離開混聊,不能單純的理解為動(dòng)態(tài)頁面和靜態(tài)頁面的物理分離启盛。
如果是靜態(tài)資源請求,直接查找nginx上的靜態(tài)資源地址技羔。
如果是動(dòng)態(tài)資源請求僵闯,通過反向代理,映射到tomcat路徑下的資源藤滥。
實(shí)現(xiàn)方式:
1) 單獨(dú)把靜態(tài)文件放在獨(dú)立的服務(wù)器及獨(dú)立的域名下鳖粟,推薦方案;
2) 將動(dòng)態(tài)資源和靜態(tài)資源混合在一起拙绊,通過nginx來分開向图。
需求: 訪問圖片等靜態(tài)資源時(shí),可以直接從nginx中獲取标沪,訪問jsp等動(dòng)態(tài)資源時(shí)榄攀,通過tomcat返回結(jié)果。
處理流程:
1) 準(zhǔn)備動(dòng)態(tài)資源金句,來到/usr/local/tomcat/webapps 檩赢, 通過rz命令上傳本地的index.jsp
2) 準(zhǔn)備靜態(tài)資源,來到/usr/local/nginx/image违寞, 通過rz命令上傳本地的test.png
- nginx.conf配置
# 動(dòng)態(tài)資源配置
location ~ .*.jsp$ {
proxy_pass http://myserver;
}
# 靜態(tài)資源配置
location ~ .*\.(gif|jpg|png|css)$ {
root /usr/local/nginx/image;
# 在瀏覽器端使用緩存 設(shè)置過期時(shí)間
expires 3d;
}
4) 瀏覽器驗(yàn)證贞瞒,分別訪問 http://192.168.1.20/jsp/index.jsp & http://192.168.1.20/test.png
?
(6)location塊
匹配規(guī)則:
1)location = /uri 精確匹配
2)location ^~ /uri 前綴匹配,順序在正則之前
location /uri 前綴匹配趁曼,順序在正則匹配之后
3)location ~ pattern 區(qū)分大小寫的正則匹配
location ~* pattern 不區(qū)分大小寫的正則匹配
4)location / 通用匹配军浆,接收未匹配到其他location的請求
匹配順序:
首先會進(jìn)行精確匹配,然后會進(jìn)行前綴匹配挡闰,具體順序按照指令長度乒融,從長到短的順序依次匹配,但是在正則匹配時(shí)摄悯,是按照配置文件的順序依次匹配的赞季,如果不希望前綴匹配后進(jìn)行正則匹配,那么使用^~
情況一:
#對于 ^~ 和 ~
location ^~ /helloworld {
return 601;
}
#location /helloworld {
# return 602;
#}
#兩種前綴匹配不能同時(shí)出現(xiàn) 否則啟動(dòng)會報(bào)錯(cuò)
訪問 duyi123.com/helloworld/test -》 返回601
情況二:
#location ^~ /helloworld {
# return 601;
#}
location /helloworld {
return 602;
}
#兩種前綴匹配不能同時(shí)出現(xiàn) 否則啟動(dòng)會報(bào)錯(cuò)
location ~ /helloworld {
return 603;
}
訪問 duyi123.com/helloworld/test -》 返回603
情況三:
#location ^~ /helloworld {
# return 601;
#}
location /helloworld {
return 602;
}
#兩種前綴匹配不能同時(shí)出現(xiàn) 否則啟動(dòng)會報(bào)錯(cuò)
location ~ /helloworld {
return 603;
}
location ~ /helloworld/test {
return 604;
}
訪問 duyi123.com/helloworld/test/a.html -》 返回603
情況四:
#location ^~ /helloworld {
# return 601;
#}
location /helloworld {
return 602;
}
#兩種前綴匹配不能同時(shí)出現(xiàn) 否則啟動(dòng)會報(bào)錯(cuò)
location ~ /helloworld/test {
return 604;
}
location ~ /helloworld {
return 603;
}
訪問 duyi123.com/helloworld/test/a.html -》 返回604
(7)URL重寫
對url的規(guī)范化處理射众,域名更換時(shí)的新舊跳轉(zhuǎn)碟摆,一些額外的參數(shù)調(diào)整等等
server{
listen 80;
server_name duyi123.com;
rewrite ^/(.*) http://www.duyi123.com/$1 permanent;
}
# 訪問 duyi123.com 地址欄會變成www.duyi123.com
3、Nginx安裝
在各官網(wǎng)下載相關(guān)組件 nginx openssl zlib pcre 等等
以openssl為例
1) 通過rz上傳壓縮包
2) 通過tar -xvf *.tar.gz 進(jìn)行解壓縮
3)cd openssl-1.1.1d 進(jìn)行配置檢查以及編譯
./config 執(zhí)行配置檢查
make & make install 進(jìn)行編譯和安裝
? 如上過程叨橱,適用于zlib和pcre
? 注意: 對于 pcre而言典蜕, 執(zhí)行檢查命令為 ./configure
-
安裝nginx過程中 執(zhí)行配置檢查
./configure --sbin-path=/usr/local/nginx/nginx
--conf-path=/usr/local/nginx/nginx.conf
--pid-path=/usr/local/nginx/nginx.pid
--with-http_ssl_module
--with-pcre=/usr/local/src/pcre-8.44
--with-zlib=/usr/local/src/zlib-1.2.11
--with-openssl=/usr/local/src/openssl-1.1.1d
```
- 仍然執(zhí)行 make 以及 make install
- nginx安裝成功 ./nginx驗(yàn)證
注意事項(xiàng):nginx服務(wù)器,需要虛擬機(jī)開放80端口的訪問
防火墻配置 (同樣適用于開放8080 8081端口)
firewall-cmd --list-all 查看當(dāng)前配置
firewall-cmd --add-service=http --permanent 開放http訪問
firewall-cmd --add-port=80/tcp --permanent 開放80端口
firewall-cmd --reload 重啟防火墻保存
jdk的安裝
1) 解壓縮 -- 拷貝目錄到 /usr/local/java
- 更改環(huán)境變量 vim /etc/profile
export JAVA_HOME=/usr/local/java
export JAVA_BIN=$JAVA_HOME/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
- 讓環(huán)境變量生效 source /etc/profile
- 驗(yàn)證版本 java -version
tomcat的安裝
1) 解壓縮 -- 拷貝目錄到 /usr/local/tomcat
- 執(zhí)行啟動(dòng) ./startup.sh