一.前言
本期來介紹nginx最后幾個知識點,看著要說的內容很多,其實一點也不多,都是所見即所得的東西。
二.nginx常用變量
2.1 常用變量?
$args 請求中的參數,也叫查詢參數,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2,?
$content_length HTTP響應信息里的"Content-Length"
$content_type HTTP響應信息里的"Content-Type",文本文件在瀏覽上是可以直接預覽 的,就是可以直接打開
$document_root nginx虛擬主機配置文件中的root站點根目錄$document_uri 當前請求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的
$document_uri就是/1.php,不包含后面的參數
$host 主機頭,也就是域名或者ip地址
$http_user_agent 客戶端的詳細信息,也就是瀏覽器的標識,用curl -A可以指定,比如:curl -A 'jaden/666.0' 192.168.61.139
$http_cookie 客戶端的cookie信息
$limit_rate 如果nginx服務器使用limit_rate配置了顯示網絡速率,則會顯示,如果沒 有設置, 則顯示0
$remote_addr 客戶端的公網ip
$remote_port 客戶端的port
$remote_user 如果nginx有配置認證,該變量代表客戶端認證的用戶名
$request_body_file 做反向代理時發給后端服務器的本地資源的名稱
$request_method http請求方法,GET/POST/PUT/DELETE等
$request_filename 當前請求的資源文件的路徑名稱,相當于$document_root/$document_uri的組合
$request_uri 請求的鏈接,包括$document_uri和$args
$scheme 請求的協議,如ftp,http,https
$server_protocol 客戶端請求資源使用的協議的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等$server_addr 服務器IP地址
$server_name 服務器的主機名
$server_port 服務器的端口號
$uri 和$document_uri相同
$http_referer 客戶端請求時的referer請求頭鍵值對的值,通俗講就是該請求是通過哪個 鏈接跳過來的,用curl -e可以指定
2.2?Nginx防盜鏈?
referer的使用場景
百度搜索--點擊某個網站--收費
盜鏈:你自己網站視頻下載地址,被別人放到他的網站上了,別人從他網站上點擊你的下載鏈接,下載動作和 流量走的是你的服務器,他收獲了人氣,你損失了流量。通過referer請求頭就可以防盜鏈。只要下載請求數 據中的referer值不是你自己網站的網址,那就不讓下載。
?# 修改b網站的index.html文件:
root@web01 web]# cd two/
[root@web01 two]# ls
ceshi games icon index index0 index1 index2 index3 index4 index5 index.html youxi youxi.tar.gz
[root@web01 two]# vim index.html
# 添加如下內容:
<img src='http://a.xxx.com/images/logo.png'>
a網站防盜鏈
?[root@web01 conf.d]# ls
a.xxx.com.conf b.xxx.com.conf c.xxx.com.conf www.xxx.top.conf
[root@web01 conf.d]# vim a.xxx.com.conf
# 加上如下內容
????????location ~* \.png$ {
???????????????? if ( $http_referer !~* "a.xxx.com" ) { #!~* 不包含的意思
????????????????????????return 403;
????????????????}
???????? }
# 并且將location中的站點根目錄放到全局來
????????server {
????????????????listen ????????80;
????????????????server_name a.xxx.com;
????????????????access_log /opt/nginx/a.xxx.com_log xxx;
????????????????# 站點根目錄設置到location外面,表示所有的location的站點根目錄都指向/web/one
????????????????root /web/one;
????????????????index index.html index.htm; location / {
????????????????#...
????????????????#root /web/one;
????????????????#index index.html index.htm;
????????}
???????? location ~* \.png$ {
????????????????if ( $http_referer !~* "a.xxx.com" ) {
????????????????????????return 403;
????????????????}
????????}
}
重點變量:
host #http請求頭的host域名
referer #從哪一個url跳轉過來的
user_agent #用戶的瀏覽器客戶端信息
Connection #是否為長鏈接
remote_addr #客戶端的
ip status #http的狀態碼?
三.nginx 中英文自動匹配?
這個示例我們再做一個域名,比如yuyan.com。
?# mkdir -p /html/lang/en
# mkdir -p /html/lang/cn
# cd /html/lang/en
# vim index.html # 寫點英文
# cd /html/lang/cn # vim index.html # 寫點漢字
# hosts文件中加入yuyan.com
server {
????????listen 80;
????????server_name yuyan.com;
????????index index.htm index.html;
????????charset utf-8;
????????location / {
????????????????if ( $http_accept_language ~* ^en ) { # 如果accept_language的值以en開頭,也就是 英文,那么返回英文的站點目錄,否則返回中文的站點目錄,而且有時候會根據ip地址來返回不同語言的網 站。
????????????????root /html/lang/en;
????????}
????????????????root /html/lang/cn;
????????}
}
chrome瀏覽器接受的語言的設置,在這里可以添加:
四.lnmp網站架構?
網站架構指的是一個網站的搭建環境:操作系統+軟件+開發語言這么三個部分組成。而且很多情況下他 們是常用的相對比較固定的組合。軟件主要指的是中間件(主要指的是web服務應用程序)+數據庫。?
數據庫:mysql\oracle...數據庫管理工具,也叫做數據庫管理系統,DBMS:database manager system
linux + nginx + mysql + php lnmp架構
linux + apache + mysql + php lamp架構
windows + apache + mysql + php wamp架構
linux + nginx + mysql + tomcat lnmt架構 ,主要是跑java語言項目的,tomcat本身也是web服務程序,但是本身效率低,可以和nginx結合一起使用
linux + nginx + mysql + uwsgi lnmu架構,主要是跑python語言項目的
我們先捋清楚lnmp架構,其他的也就都簡單了。
五.正向代理?
客戶端使用的代理我們一般稱之為正向代理,服務端使用的代理我們一般稱之為反向代理。
客戶端如果使用了正向代理,那么服務端記錄的是代理的ip地址,代理可以有很多層,而且很多網絡是 正向代理和反向代理都存在。
我們做一個正向代理試試。
首先找一臺服務器,比如我用阿里云的一臺服務器作為正向代理服務器吧,安裝一個centos7.8,然后安裝個nginx
?# yum install nginx -y
# 去掉配置用的#號行和空行
[root@web01 conf.d]# grep -Ev '^$|#' /etc/nginx/nginx.conf.default >
/etc/nginx/nginx.conf[root@web01 conf.d]# vim /etc/nginx/nginx.conf
# 修改nginx的配置分別添加http和https的server,其他配置保持不變,我們就添加個http的演示一下即可
# 將nginx.conf配置中的server部分替換為下面的server
# 下面配置正向代理轉發http請求
server {
????????resolver 223.5.5.5;
????????listen 80;
????????location / {
????????????????proxy_pass ????????http://$host$request_uri;
????????????????proxy_set_header ????????HOST $host;
????????????????proxy_buffers ????????256 4k;
????????????????proxy_max_temp_file_size ????????0k;
????????????????proxy_connect_timeout ????????30;
????????????????proxy_send_timeout ????????60;
????????????????proxy_read_timeout???????? 60;
????????????????proxy_next_upstream error timeout invalid_header http_502;
????????}
} # nginx -t
# systemctl restart nginx
# 這時候的nginx就不代表一個網站了,只是幫我們進行請求的轉發,就是單純的代理。
# 正向代理轉發https請求,這個就暫時不說了
通過實時查看nginx的訪問日志,可以看到Windows下設置代理IP和端口后,本地電腦訪問的所有網頁 會通過代理服務器進行訪問網頁,實現了正向代理的功能,并且隱藏了用戶自己真實的IP。
六.反向代理?
反向代理更多的時候是為了保護原站,還能用于負載均衡的效果?
我們再去克隆一個虛擬機作為反向代理服務器,使用nginx作為反向代理工具,安裝nginx,配置如下:
?[root@lb01 ~]# cat /etc/nginx/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 localhost;
????????????????location / {
????????????????????????proxy_pass http://192.168.61.140; # 將請求轉發到哪個ip地址,原站的ip地址,并 且其實我們正常的話是應該加一個DNS解析記錄,將我們的域名指向這個代理服務器的ip地址。我們沒有真實 公網主機來演示,所以改一下hosts文件的記錄即可,將原來的域名都指向這個代理主機的ip地址。然后訪問 網站,wireshark抓包就能看到轉發效果。
????????????????????????# 如果只是單純的配置上面這句話也可以完成反向代理,但是服務端的其他網站就沒辦法訪問 到了,因為nginx轉發的時候,會用客戶端請求的服務器的ip地址,不會用域名,域名丟了,那么服務端的nginx會自動打開一個網站給你響應。所以還是要設置一下nginx轉發時的host請求頭,讓它變成域名。
????????????????????????proxy_set_header Host $host; # 設置host,以防請求域名丟失。? ? ? ? ? ? ? ? ? ? ? ? ????????????????????#proxy_set_header jaden 666666; # 可以自定定制多個轉發請求時的請求頭鍵值對
????????????????????????#下面這兩個主要是為了記錄客戶端的真實ip地址,因為有了反向代理之后,我們看到記錄的 客戶端的ip地址是反向代理服務器的ip地址,這樣肯定不行呀,無法定位誰攻擊的我,所以我們需要記錄用戶 的真實ip,所以就可以在nginx轉發請求的時候加兩個請求頭鍵值對,將客戶端真實ip寫進去
????????????????????????proxy_set_header X-Real-IP $remote_addr;
????????????????????????proxy_set_header X-Forwarded-For $remote_addr; # 這個簡稱叫做XFF,業內一 般都用這個字段來記錄客戶端真實ip地址,也有用上面這個remote_addr來記錄的,所以我們都配置上吧, 將nginx的日志記錄格式修改一下,加上一個"真實ip:$http_x_forwarded_for"
????????????????????????#proxy_set_header X-Forwarded-For $http_x_forwarded_for;
????????????????}
????????}
}
# 后端服務器日志格式,vim /etc/nginx/nginx.conf,加上如下兩條
log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host ' '
$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/new.log main; # 給所有網站定義日志格式用的
# 保存退出,然后訪問網站,就看到日志了。
之前的網站服務器作為原站服務器,然后我們自己的物理機作為客戶端訪問。
七.負載均衡模式?
nginx做反向代理的同時,還可以配置負載均衡,為了演示負載均衡的效果,我們再創建一個web網站服 務器。而且要保證這兩臺web服務器跑著相同的網站。兩個網站簡單寫一些不太一樣的東西,為了是讓大家看效果。
修改nginx反向代理的配置:
http {
????????include mime.types;
????????default_type application/octet-stream;
????????sendfile ????????on;
????????keepalive_timeout 65;
????????upstream web{
????????????????server 192.168.61.140;
????????????????server 192.168.61.141;
????????}
????????server {
????????????????listen ????????80;
????????????????server_name localhost;
????????????????location / {
????????????????????????proxy_pass http://web; # 這個地方不寫死ip地址了,寫個上面配置中的upstream的名稱
????????????????????????proxy_set_header Host $host;
????????????????????????proxy_set_header X-Real-IP $remote_addr;
????????????????????????proxy_set_header X-Forwarded-For $http_x_forwarded_for;
????????????????}
????????}
}
八.總結?
總體來說,這些東西現在就算是記住了也會遺忘,所以我們點贊關注加收藏,遇到要用的時候再來看就好了。?