您好,登錄后才能下訂單哦!
Nginx (engine x) 是一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù)。Nginx是由伊戈?duì)枴べ愃饕驗(yàn)槎砹_斯訪問(wèn)量第二的Rambler.ru站點(diǎn)(俄文:Рамблер)開(kāi)發(fā)的,第一個(gè)公開(kāi)版本0.1.0發(fā)布于2004年10月4日。
其將源代碼以類BSD許可證的形式發(fā)布,因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。2011年6月1日,nginx 1.0.4發(fā)布。
Nginx是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在BSD-like 協(xié)議下發(fā)行。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力在同類型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好
Nginx 可以在大多數(shù) UnixLinux OS 上編譯運(yùn)行,并有 Windows 移植版。 Nginx 的1.4.0穩(wěn)定版已經(jīng)于2013年4月24日發(fā)布,一般情況下,對(duì)于新建站點(diǎn),建議使用最新穩(wěn)定版作為生產(chǎn)版本,已有站點(diǎn)的升級(jí)急迫性不高。
Nginx 的源代碼使用 2-clause BSD-like license。
Nginx 是一個(gè)很強(qiáng)大的高性能Web和反向代理服務(wù),它具有很多非常優(yōu)越的特性:
在連接高并發(fā)的情況下,Nginx是Apache服務(wù)不錯(cuò)的替代品:Nginx在美國(guó)是做虛擬主機(jī)生意的老板們經(jīng)常選擇的軟件平臺(tái)之一。能夠支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù)的響應(yīng),感謝Nginx為我們選擇了 epoll and kqueue作為開(kāi)發(fā)模型。
基于nginx模塊ngx_http_auth_basic_module實(shí)現(xiàn),在編譯安裝nginx的時(shí)候需要添加編譯參數(shù)--with-http_stub_status_module,否則配置完成之后監(jiān)測(cè)會(huì)是提示語(yǔ)法錯(cuò)誤。
查看是否加載了ngx_http_auth_basic_module模塊
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -V
nginx version: nginx/1.14.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --with-http_perl_module
[root@CentOS7 ~]#vim /apps/nginx/conf/nginx.conf
location /nginx_status {
stub_status;
allow 192.168.36.0/24;
deny all;
}
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -s reload
訪問(wèn)測(cè)試
[root@CentOS-Test ~]#curl 192.168.36.104/nginx_status
Active connections: 1
server accepts handled requests
124 124 223 # 這三個(gè)數(shù)字分別對(duì)應(yīng)accepts,handled,requests三個(gè)值
Reading: 0 Writing: 1 Waiting: 0
Active connections:當(dāng)前處于活動(dòng)狀態(tài)的客戶端連接數(shù),包括連接等待空閑連接數(shù)。
accepts:統(tǒng)計(jì)總值,Nginx自啟動(dòng)后已經(jīng)接受的客戶端請(qǐng)求的總數(shù)。
handled:統(tǒng)計(jì)總值,Nginx自啟動(dòng)后已經(jīng)處理完成的客戶端請(qǐng)求的總數(shù),通常等于accepts,除非有因
worker_connections限制等被拒絕的連接。
requests:統(tǒng)計(jì)總值,Nginx自啟動(dòng)后客戶端發(fā)來(lái)的總的請(qǐng)求數(shù)。
Reading:當(dāng)前狀態(tài),正在讀取客戶端請(qǐng)求報(bào)文首部的連接的連接數(shù)。
Writing:當(dāng)前狀態(tài),正在向客戶端發(fā)送響應(yīng)報(bào)文過(guò)程中的連接數(shù)。
Waiting:當(dāng)前狀態(tài),正在等待客戶端發(fā)出請(qǐng)求的空閑連接數(shù),開(kāi)啟 keep-alive的情況下,這個(gè)值等于active – (reading+writing),
添加第三方模塊:echo-nginx-module
[root@CentOS7 ~]#yum install git -y
[root@CentOS7 ~]#git clone https://github.com/openresty/echo-nginx-module.git
[root@CentOS7 ~]#cd nginx-1.14.2/
[root@CentOS7 nginx-1.14.2]#./configure \ # 重新編譯安裝
> --prefix=/apps/nginx \
> --user=nginx --group=nginx \
> --with-http_ssl_module \
> --with-http_v2_module \
> --with-http_realip_module \
> --with-http_stub_status_module \
> --with-http_gzip_static_module \
> --with-pcre \
> --with-stream \
> --with-stream_ssl_module \
> --with-stream_realip_module \
> --with-http_perl_module \
> --add-module=/root/echo-nginx-module # 添加echo模塊
[root@CentOS7 nginx-1.14.2]#make && make install # make安裝
[root@CentOS7 ~]#vim /apps/nginx/conf.d/pc.conf
[root@CentOS7 ~]#cat /apps/nginx/conf.d/pc.conf
server {
listen 80;
server_name www.darius.com;
error_log logs/www_darius_com_error.log;
access_log logs/www_darius_com_access.log;
location /main {
index index.html;
default_type text/html;
echo_reset_timer;
echo_location /sub1;
echo_location /sub2;
echo "took $echo_timer_elapsed sec for total.";
}
location /sub1 {
echo_sleep 1;
echo sub1;
}
location /sub2 {
echo_sleep 1;
echo sub2;
}
}
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -s reload
訪問(wèn)測(cè)試
[root@CentOS7 ~]#curl www.darius.com/main
sub1
sub2
took 2.008 sec for total.
nginx的變量可以在配置文件中引用,作為功能判斷或者日志等場(chǎng)景使用,變量可以分為內(nèi)置變量和自定義變量,內(nèi)置變量是由nginx模塊自帶,通過(guò)變量可以獲取到眾多的與客戶端訪問(wèn)相關(guān)的值。
$remote_addr;
存放了客戶端的地址,注意是客戶端的公網(wǎng)IP,也就是一家人訪問(wèn)一個(gè)網(wǎng)站,則會(huì)顯示為路由器的公網(wǎng)IP。
$args;
變量中存放了URL中的指令,例如http://www.darius.com/main/index.do?
id=20190221&partner=search中的id=20190221&partner=search
$document_root;
保存了針對(duì)當(dāng)前資源的請(qǐng)求的系統(tǒng)根目錄,如/apps/nginx/htm
$document_uri;
保存了當(dāng)前請(qǐng)求中不包含指令的URI,注意是不包含請(qǐng)求的指令,比如
http://www.darius.com/main/index.do?id=20190221&partner=search會(huì)被定義為/main/index.do
$host;
#存放了請(qǐng)求的host名稱。
$http_user_agent;
客戶端瀏覽器的詳細(xì)信息
$http_cookie;
客戶端的cookie信息
limit_rate 10240;
echo $limit_rate;
如果nginx服務(wù)器使用limit_rate配置了顯示網(wǎng)絡(luò)速率,則會(huì)顯示,如果沒(méi)有設(shè)置, 則顯示0
$remote_port;
客戶端請(qǐng)求Nginx服務(wù)器時(shí)隨機(jī)打開(kāi)的端口,這是每個(gè)客戶端自己的端口
$remote_user;
已經(jīng)經(jīng)過(guò)Auth Basic Module驗(yàn)證的用戶名
$request_body_file;
做反向代理時(shí)發(fā)給后端服務(wù)器的本地資源的名稱
$request_method;
請(qǐng)求資源的方式,GET/PUT/DELETE等
$request_filename;
當(dāng)前請(qǐng)求的資源文件的路徑名稱,由root或alias指令與URI請(qǐng)求生成的文件絕對(duì)路徑,如/apps/nginx/html/main/index.html
$request_uri;
包含請(qǐng)求參數(shù)的原始URI,不包含主機(jī)名,如:/main/index.do?id=20190221&partner=search
$scheme;
請(qǐng)求的協(xié)議,如ftp,https,http等
$server_protocol;
保存了客戶端請(qǐng)求資源使用的協(xié)議的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等
$server_addr;
保存了服務(wù)器的IP地址
$server_name;
請(qǐng)求的服務(wù)器的主機(jī)名
$server_port;
請(qǐng)求的服務(wù)器的端口號(hào)
假如需要自定義變量名稱和值,使用指令set $variable value;,則方法如下:
set $name magedu;
echo $name;
set $my_port $server_port;
echo $my_port;
echo "$server_name:$server_port";
[root@CentOS7 ~]#vim /apps/nginx/conf.d/pc.conf
[root@CentOS7 ~]#cat /apps/nginx/conf.d/pc.conf
server {
listen 80;
server_name www.darius.com;
error_log logs/www_darius_com_error.log;
access_log logs/www_darius_com_access.log;
location /main {
index index.html;
default_type text/html;
echo $request_uri;
}
}
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -s reload
[root@CentOS7 ~]#curl www.darius.com/main
/main
[root@CentOS7 ~]#curl www.darius.com/main/xxx
/main/xxx
[root@CentOS7 ~]#vim /apps/nginx/conf.d/pc.conf
[root@CentOS7 ~]#cat /apps/nginx/conf.d/pc.conf
server {
listen 80;
server_name www.darius.com;
error_log logs/www_darius_com_error.log;
access_log logs/www_darius_com_access.log;
location /main {
index index.html;
default_type text/html;
set $name Darius;
echo $name;
}
}
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -s reload
[root@CentOS7 ~]#curl www.darius.com/main
Darius
訪問(wèn)日志是記錄客戶端即用戶的具體請(qǐng)求內(nèi)容信息,全局配置模塊中的error_log是記錄nginx服務(wù)器運(yùn)行時(shí)的日志保存路徑和記錄日志的level,因此有著本質(zhì)的區(qū)別,而且Nginx的錯(cuò)誤日志一般只有一個(gè),但是訪問(wèn)日志可以在不同server中定義多個(gè),定義一個(gè)日志需要使用access_log指定日志的保存路徑,使用log_format指定日志的格式,格式中定義要保存的具體日志內(nèi)容。
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;
[root@CentOS7 ~]#vim /apps/nginx/conf/nginx.conf
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"uri":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
access_log /apps/nginx/logs/access_json.log access_json;
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -s reload
[root@CentOS7 ~]#tail -f /apps/nginx/logs/access_json.log
{"@timestamp":"2019-05-30T18:58:23+08:00","host":"192.168.36.104","clientip":"192.168.36.110","size":15,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.36.104","uri":"/index.html","domain":"192.168.36.104","xff":"-","referer":"-","tcp_xff":"","http_user_agent":"curl/7.29.0","status":"200"}
[root@CentOS7 logs]#cat nginx_json.py
#!/usr/bin/env python
#coding:utf-8
status_200= []
status_404= []
with open("access_json.log") as f:
for line in f.readlines():
line = eval(line)
if line.get("status") == "200":
status_200.append(line.get)
elif line.get("status") == "404":
status_404.append(line.get)
else:
print("狀態(tài)碼 ERROR")
f.close()
print "狀態(tài)碼200的有--:",len(status_200)
print "狀態(tài)碼404的有--:",len(status_404)
保存日志文件到指定路徑并進(jìn)測(cè)試:
[root@CentOS7 ~]# python nginx_json.py
....
狀態(tài)碼200的有--: 403428
狀態(tài)碼404的有--: 125712
Nginx支持對(duì)指定類型的文件進(jìn)行壓縮然后再傳輸給客戶端,而且壓縮還可以設(shè)置壓縮比例,壓縮后的文件大小將比源文件顯著變小,這樣有助于降低出口帶寬的利用率,降低企業(yè)的IT支出,不過(guò)會(huì)占用相應(yīng)的CPU資源。Nginx對(duì)文件的壓縮功能是依賴于模塊ngx_http_gzip_module
啟用或禁用gzip壓縮,默認(rèn)關(guān)閉
gzip on | off;
壓縮比由低到高從1到9,默認(rèn)為1
gzip_comp_level level;
禁用IE6 gzip功能
gzip_disable "MSIE [1-6]\.";
gzip壓縮的最小文件,小于設(shè)置值的文件將不會(huì)壓縮
gzip_min_length 1k;
啟用壓縮功能時(shí),協(xié)議的最小版本,默認(rèn)HTTP/1.1
gzip_http_version 1.0 | 1.1;
指定Nginx服務(wù)需要向服務(wù)器申請(qǐng)的緩存空間的個(gè)數(shù)*大小,默認(rèn)32 4k|16 8k;
gzip_buffers number size;
指明僅對(duì)哪些類型的資源執(zhí)行壓縮操作;默認(rèn)為gzip_types text/html,不用顯示指定,否則出錯(cuò)
gzip_types mime-type ...;
如果啟用壓縮,是否在響應(yīng)報(bào)文首部插入“Vary: Accept-Encoding”
gzip_vary on | off;
配置文件修改
gzip on;
gzip_comp_level 5;
gzip_min_length 1;
gzip_types text/plain application/javascript application/x-javascript text/cssapplication/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -s reload
訪問(wèn)測(cè)試
[root@CentOS-Test ~]#curl --head --compressed http://www.darius.com/test1.html
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 30 May 2019 11:26:49 GMT
Content-Type: text/html
Last-Modified: Thu, 30 May 2019 11:26:31 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: W/"5cefbde7-720"
Content-Encoding: gzip
Web網(wǎng)站的登錄頁(yè)面都是使用https加密傳輸?shù)?,加密?shù)據(jù)以保障數(shù)據(jù)的安全,HTTPS能夠加密信息,以免敏感信息被第三方獲取,所以很多銀行網(wǎng)站或電子郵箱等等安全級(jí)別較高的服務(wù)都會(huì)采用HTTPS協(xié)議,HTTPS其實(shí)是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務(wù)端和客戶端的信息傳輸都會(huì)通過(guò)TLS進(jìn)行加密,所以傳輸?shù)臄?shù)據(jù)都是加密后的數(shù)據(jù)。
1.客戶端發(fā)起HTTPS請(qǐng)求:
客戶端訪問(wèn)某個(gè)web端的https地址,一般都是443端口
2.服務(wù)端的配置:
采用https協(xié)議的服務(wù)器必須要有一套證書(shū),可以通過(guò)一些組織申請(qǐng),也可以自己制作,目前國(guó)內(nèi)很多網(wǎng)站都自己做的,當(dāng)你訪問(wèn)一個(gè)網(wǎng)站的時(shí)候提示證書(shū)不可信任就表示證書(shū)是自己做的,證書(shū)就是一個(gè)公鑰和私鑰匙,就像一把鎖和鑰匙,正常情況下只有你的鑰匙可以打開(kāi)你的鎖,你可以把這個(gè)送給別人讓他鎖住一個(gè)箱子,里面放滿了錢(qián)或秘密,別人不知道里面放了什么而且別人也打不開(kāi),只有你的鑰匙是可以打開(kāi)的。
3.傳送證書(shū):
服務(wù)端給客戶端傳遞證書(shū),其實(shí)就是公鑰,里面包含了很多信息,例如證書(shū)得到頒發(fā)機(jī)構(gòu)、過(guò)期時(shí)間等等。
4.客戶端解析證書(shū):
這部分工作是有客戶端完成的,首先回驗(yàn)證公鑰的有效性,比如頒發(fā)機(jī)構(gòu)、過(guò)期時(shí)間等等,如果發(fā)現(xiàn)異常則會(huì)彈出一個(gè)警告框提示證書(shū)可能存在問(wèn)題,如果證書(shū)沒(méi)有問(wèn)題就生成一個(gè)隨機(jī)值,然后用證書(shū)對(duì)該隨機(jī)值進(jìn)行加密,就像2步驟所說(shuō)把隨機(jī)值鎖起來(lái),不讓別人看到。
5.傳送4步驟的加密數(shù)據(jù):
就是將用證書(shū)加密后的隨機(jī)值傳遞給服務(wù)器,目的就是為了讓服務(wù)器得到這個(gè)隨機(jī)值,以后客戶端和服務(wù)端的通信就可以通過(guò)這個(gè)隨機(jī)值進(jìn)行加密解密了。
6.服務(wù)端解密信息:
服務(wù)端用私鑰解密5步驟加密后的隨機(jī)值之后,得到了客戶端傳過(guò)來(lái)的隨機(jī)值(私鑰),然后把內(nèi)容通過(guò)該值進(jìn)行對(duì)稱加密,對(duì)稱加密就是將信息和私鑰通過(guò)算法混合在一起,這樣除非你知道私鑰,不然是無(wú)法獲取其內(nèi)部的內(nèi)容,而正好客戶端和服務(wù)端都知道這個(gè)私鑰,所以只要機(jī)密算法夠復(fù)雜就可以保證數(shù)據(jù)的安全性。
7.傳輸加密后的信息:
服務(wù)端將用私鑰加密后的數(shù)據(jù)傳遞給客戶端,在客戶端可以被還原出原數(shù)據(jù)內(nèi)容。
8.客戶端解密信息:
客戶端用之前生成的私鑰獲解密服務(wù)端傳遞過(guò)來(lái)的數(shù)據(jù),由于數(shù)據(jù)一直是加密的,因此即使第三方獲取到數(shù)據(jù)也無(wú)法知道其詳細(xì)內(nèi)容。
nginx 的https 功能基于模塊ngx_http_ssl_module實(shí)現(xiàn),因此如果是編譯安裝的nginx要使用參數(shù)ngx_http_ssl_module開(kāi)啟ssl功能,但是作為nginx的核心功能,yum安裝的nginx默認(rèn)就是開(kāi)啟的,編譯安裝的nginx需要指定編譯參數(shù)--with-http_ssl_module開(kāi)啟
ssl on | off;
為指定的虛擬主機(jī)配置是否啟用ssl功能,此功能在1.15.0廢棄,使用listen [ssl]替代。
ssl_certificate /path/to/file;
當(dāng)前虛擬主機(jī)使用使用的公鑰文件,一般是crt文件
ssl_certificate_key /path/to/file;
當(dāng)前虛擬主機(jī)使用的私鑰文件,一般是key文件
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
支持ssl協(xié)議版本,早期為ssl現(xiàn)在是TSL,默認(rèn)為后三個(gè)
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
配置ssl緩存
off:關(guān)閉緩存
none: 通知客戶端支持ssl session cache,但實(shí)際不支持
builtin[:size]:使用OpenSSL內(nèi)建緩存,為每worker進(jìn)程私有
[shared:name:size]:在各worker之間使用一個(gè)共享的緩存,需要定義一個(gè)緩存名稱和緩存空間大小,一兆可以存儲(chǔ)4000個(gè)會(huì)話信息,多個(gè)虛擬主機(jī)可以使用相同的緩存名稱。
ssl_session_timeout time; # 客戶端連接可以復(fù)用ssl session cache中緩存的有效時(shí)長(zhǎng),默認(rèn)5m
創(chuàng)建自簽名CA證書(shū)
[root@CentOS7 ~]#cd /apps/nginx/
[root@CentOS7 nginx]#mkdir certs
[root@CentOS7 nginx]# cd certs/
[root@CentOS7 certs]#openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt # 自簽名CA證書(shū)
Generating a 4096 bit RSA private key
.............................................................................................................................................................................................................................................................................................................................................++
........................................................................................++
writing new prvate key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
lf you enter '.',the field will be left blamk
-----
Country Name (2 letter code) [XX]:CN # 國(guó)家代碼
State or Province Name (full name) []:BeiJing # 省份
Locality Name (eg, city) [Default City]:BeiJing # 城市名稱
Organization Name (eg, company) [Default Company Ltd]:magedu.com # 公司名稱
Organizational Unit Name (eg, section) []:magedu # 部門(mén)
Common Name (eg, your name or your server's hostname) []:M36 # 通用名稱
Email Address []: # 郵箱
[root@CentOS7 certs]#ll ca.crt
-rw-r--r-- 1 root root 2009 5月 30 19:34 ca.crt
創(chuàng)建自定義額key和csr文件
[root@CentOS7 certs]#openssl req -newkey rsa:4096 -nodes -sha256 -keyout www.darius.com.key -out www.darius.com.csr
Generating a 4096 bit RSA private key
............++
..........................++
writing new prvate key to 'www.danrius.com.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
lf you enter '.',the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BeiJing
Locality Name (eg, city) [Default City]:BeiJing
Organization Name (eg, company) [Default Company Ltd]:magedu.com
Organizational Unit Name (eg, section) []:magedu
Common Name (eg, your name or your server's hostname) []:M36
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@CentOS7 certs]#ll
總用量 16
-rw-r--r-- 1 root root 2009 5月 30 19:34 ca.crt
-rw-r--r-- 1 root root 3272 5月 30 19:34 ca.key
-rw-r--r-- 1 root root 1695 5月 30 19:38 www.darius.com.csr
-rw-r--r-- 1 root root 3272 5月 30 19:38 www.darius.com.key
證書(shū)簽發(fā)
[root@CentOS7 certs]#openssl x509 -req -days 3650 -in www.darius.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.darius.com.crt
Signature ok
subject=/C=CN/ST=BeiJing/L=BeiJing/O=magedu.com/OU=magedu/CN=M36
Getting CA Private Key
驗(yàn)證證書(shū)內(nèi)容
[root@CentOS7 certs]#openssl x509 -in www.darius.com.crt -noout -text
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
fe:15:2c:1a:9d:a5:df:f5
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=BeiJing, L=BeiJing, O=magedu.com, OU=magedu, CN=M36
Validity
Not Before: May 30 11:42:02 2019 GMT
Not After : May 27 11:42:02 2029 GMT
Subject: C=CN, ST=BeiJing, L=BeiJing, O=magedu.com, OU=magedu, CN=M36
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
[root@CentOS7 ~]#vim /apps/nginx/conf.d/pc.conf
[root@CentOS7 ~]#cat /apps/nginx/conf.d/pc.conf
server {
listen 80;
listen 443 ssl;
ssl_certificate /apps/nginx/certs/www.darius.com.crt;
ssl_certificate_key /apps/nginx/certs/www.darius.com.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.darius.com;
error_log logs/www_darius_com_error.log;
access_log logs/www_darius_com_access.log;
location / {
index index.html;
root /data/nginx/html/pc;
}
}
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 ~]#/apps/nginx/sbin/nginx -s reload
訪問(wèn)測(cè)試
favicon.ico 文件是瀏覽器收藏網(wǎng)址時(shí)顯示的圖標(biāo),當(dāng)客戶端使用瀏覽器問(wèn)頁(yè)面時(shí),瀏覽器會(huì)自己主動(dòng)發(fā)起請(qǐng)求獲取頁(yè)面的favicon.ico文件,但是當(dāng)瀏覽器請(qǐng)求的favicon.ico文件不存在時(shí),服務(wù)器會(huì)記錄404日志,而且瀏覽器也會(huì)顯示404報(bào)錯(cuò)。
一:服務(wù)器不記錄訪問(wèn)日志:
# location = /favicon.ico {
# log_not_found off;
# access_log off;
# }
二:將圖標(biāo)保存到指定目錄訪問(wèn):
# location ~ ^/favicon\.ico$ {
location = /favicon.ico {
root /data/nginx/images123;
}
顯示效果
修改Nginx源碼文件,此配置文件需要在nginx.conf的http中添加server_tokens off;開(kāi)啟nginx版本隱藏才能實(shí)現(xiàn)預(yù)期效果
[root@CentOS7 nginx-1.14.2]#vim src/http/ngx_http_header_filter_module.c
49 static u_char ngx_http_server_string[] = "Server: Darius/10.0" CRLF;
停止Nginx服務(wù),重新編譯Nginx
[root@CentOS7 nginx-1.14.2]#/apps/nginx/sbin/nginx -s stop
[root@CentOS7 nginx-1.14.2]#./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/root/echo-nginx-module
[root@CentOS7 nginx-1.14.2]#make && make ×××tall
啟動(dòng)服務(wù)
[root@CentOS7 nginx-1.14.2]#/apps/nginx/sbin/nginx
檢測(cè)
[root@CentOS7-Test ~]#curl -I www.darius.com
HTTP/1.1 200 OK
Server: Darius/10.0
修改src/core/nginx.h文件無(wú)需開(kāi)啟隱藏功能,起到修改版本信息的效果
[root@CentOS7 nginx-1.14.2]# vim src/core/nginx.h
13 #define NGINX_VERSION "10.0"
14 #define NGINX_VER "Darius/" NGINX_VERSION
Nginx服務(wù)器利用ngx_http_rewrite_module 模塊解析和處理rewrite請(qǐng)求,此功能依靠 PCRE(perl compatibler egularexpression),因此編譯之前要安裝PCRE庫(kù),rewrite是nginx服務(wù)器的重要功能之一,用于實(shí)現(xiàn)URL的重寫(xiě),URL的重寫(xiě)是非常有用的功能,比如它可以在我們改變網(wǎng)站結(jié)構(gòu)之后,不需要客戶端修改原來(lái)的書(shū)簽,也無(wú)需其他網(wǎng)站修改我們的鏈接,就可以設(shè)置為訪問(wèn),另外還可以在一定程度上提高網(wǎng)站的安全性。
用于條件匹配判斷,并根據(jù)條件判斷結(jié)果選擇不同的Nginx配置,可以配置在server或location塊中進(jìn)行配置,Nginx的if語(yǔ)法僅能使用if做單次判斷,不支持使用if else或者if elif這樣的多重判斷
location /main {
index index.html;
default_type text/html;
if ( $scheme = http ) {
echo "if --> $scheme";
}
}
[root@CentOS7 conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntaxis ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 conf.d]#nginx -s reload
檢測(cè)
[root@CentOS7-Test ~]#curl www.darius.com/main
if --> http
使用正則表達(dá)式對(duì)變量進(jìn)行匹配,匹配成功時(shí)if指令認(rèn)為條件為true,否則認(rèn)為false,變量與表達(dá)式之間使用以下符號(hào)鏈接
=:#比較變量和字符串是否相等,相等時(shí)if指令認(rèn)為該條件為true,反之為false。
!=: #比較變量和字符串是否不相等,不相等時(shí)if指令認(rèn)為條件為true,反之為false。
~:#表示在匹配過(guò)程中區(qū)分大小寫(xiě)字符,(可以通過(guò)正則表達(dá)式匹配),滿足匹配條件為真,不滿足為假。
~*: #表示在匹配過(guò)程中不區(qū)分大小寫(xiě)字符,(可以通過(guò)正則表達(dá)式匹配),滿足匹配條件為真,不滿足問(wèn)假。
!~:#區(qū)分大小寫(xiě)不匹配,不滿足為真,滿足為假,不滿足為真。
!~*:#為不區(qū)分大小寫(xiě)不匹配,滿足為假,不滿足為真。
-f 和 ! -f:判斷請(qǐng)求的文件是否存在和是否不存在
-d 和 ! -d: #判斷請(qǐng)求的目錄是否存在和是否不存在。
-x 和 ! -x: #判斷文件是否可執(zhí)行和是否不可執(zhí)行。
-e 和 ! -e: #判斷請(qǐng)求的文件或目錄是否存在和是否不存在(包括文件,目錄,軟鏈接)。
注:如果$變量的值為空字符串或是以0開(kāi)頭的任意字符串,則if指令認(rèn)為該條件為false,其他條件為true。
指定key并給其定義一個(gè)變量,變量可以調(diào)用Nginx內(nèi)置變量賦值給key,另外set定義格式為set $key $value,及無(wú)論是key還是value都要加$符號(hào)。
[root@CentOS7 conf.d]#vim pc.conf
location /set {
root index.html;
default_type text/html;
set $name Darius;
echo $name;
set $my_port $server_port;
echo $my_port;
}
[root@CentOS7 conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntaxis ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 conf.d]#nginx -s reload
檢測(cè)
[root@CentOS7-Test ~]#curl www.darius.com/set
Darius
80
用于中斷當(dāng)前相同作用域(location)中的其他Nginx配置,與該指令處于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的指令配置就不再生效了,Nginx服務(wù)器在根據(jù)配置處理請(qǐng)求的過(guò)程中遇到該指令的時(shí)候,回到上一層作用域繼續(xù)向下讀取配置,該指令可以在server塊和location塊以及if塊中使用,使用語(yǔ)法如下:
[root@CentOS7 conf.d]#vim pc.conf
location /set {
root index.html;
default_type text/html;
set $name Darius;
echo $name;
break;
set $my_port $server_port;
echo $my_port;
}
[root@CentOS7 conf.d]#nginx -s reload
檢測(cè)
[root@CentOS7-Test ~]#curl www.darius.com/set
Darius
從nginx版本0.8.2開(kāi)始支持,return用于完成對(duì)請(qǐng)求的處理,并直接向客戶端返回響應(yīng)狀態(tài)碼,比如其可以指定重定向URL(對(duì)于特殊重定向狀態(tài)碼,301/302等) 或者是指定提示文本內(nèi)容(對(duì)于特殊狀態(tài)碼403/500等),處于此指令后的所有配置都將不被執(zhí)行,return可以在server、if和location塊進(jìn)行配置
location /main {
index index.html;
default_type text/html;
if ( $scheme = http ) {
return 666 "not allow http"; # 可以是返回給客戶端指定的HTTP狀態(tài)碼、也可以是返回給客戶端的狀態(tài)碼及響應(yīng)體內(nèi)容(可以調(diào)用變量)、或者返回給客戶端URL地址
echo "if-----> $scheme"; # return后面的將不再執(zhí)行
}
[root@CentOS7-Test ~]#curl www.darius.com/main
not allow http
[root@CentOS7-Test ~]#curl -I www.darius.com/main
HTTP/1.1 666
Server: Darius/10.0
Date: Sat, 01 Jun 2019 03:52:37 GMT
Content-Type: text/html
Content-Length: 14
Connection: keep-alive
rewrite_log指令
設(shè)置是否開(kāi)啟記錄ngx_http_rewrite_module模塊日志記錄到error_log日志文件當(dāng)中,可以配置在http、server、location或if當(dāng)中,需要日志級(jí)別為notice
[root@CentOS7 conf.d]#vim ../conf/nginx.conf
error_log logs/error.log notice; # 開(kāi)啟錯(cuò)誤日志notice級(jí)別
[root@CentOS7 conf.d]#vim pc.conf # 啟用rewrite_log指令
location /set {
root index.html;
default_type text/html;
set $name Darius;
echo $name;
rewrite_log on;
break;
set $my_port $server_port;
echo $my_port;
}
[root@CentOS7 conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 conf.d]#nginx -s reload
訪問(wèn)并驗(yàn)證
[root@CentOS7 conf.d]#tail -f /apps/nginx/logs/*.log
==> /apps/nginx/logs/error.log <==
2019/06/01 12:01:46 [warn] 11234#0: *40 using uninitialized "my_port" variable, client: 192.168.36.110, server: www.darius.com, request: "GET /set/aaa HTTP/1.1", host: "www.darius.com"
通過(guò)正則表達(dá)式的匹配來(lái)改變URI,可以同時(shí)存在一個(gè)或多個(gè)指令,按照順序依次對(duì)URI進(jìn)行匹配,rewrite主要是針對(duì)用戶請(qǐng)求的URL或者是URI做具體處理
??URI(universal resource identifier):通用資源標(biāo)識(shí)符,標(biāo)識(shí)一個(gè)資源的路徑,可以不帶協(xié)議。
??URL(uniform resource location):統(tǒng)一資源定位符,是用于在Internet中描述資源的字符串,是URI的子集,主要包括傳輸協(xié)議(scheme)、主機(jī)(IP、端口號(hào)或者域名)和資源具體地址(目錄和文件名)等三部分,一般格式為 scheme://主機(jī)名[:端口號(hào)][/資源路徑],如:http://www.a.com:8080/path/file/index.html就是一個(gè)URL路徑,URL必須帶訪問(wèn)協(xié)議。
每個(gè)URL都是一個(gè)URI,但是URI不都是URL。
??例如:
??http://example.org/path/to/resource.txt #URI/URL
??ftp://example.org/resource.txt #URI/URL
??/absolute/path/to/resource.txt #URI
redirect;
??臨時(shí)重定向,重寫(xiě)完成后以臨時(shí)重定向方式直接返回重寫(xiě)后生成的新URL給客戶端,由客戶端重新發(fā)起請(qǐng)求;使用相對(duì)路徑,或者h(yuǎn)ttp://或https://開(kāi)頭,狀態(tài)碼:302
permanent;
?? 永久重定向,重寫(xiě)完成后以永久重定向方式直接返回重寫(xiě)后生成的新URL給客戶端,由客戶端重新發(fā)起請(qǐng)求,狀態(tài)碼:301
last;
??重寫(xiě)完成后停止對(duì)當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫(xiě)操作,而后對(duì)新的URL啟動(dòng)新一輪重寫(xiě)檢查,不建議在location中使用
break;
??重寫(xiě)完成后停止對(duì)當(dāng)前URL在當(dāng)前l(fā)ocation中后續(xù)的其它重寫(xiě)操作,而后直接跳轉(zhuǎn)至重寫(xiě)規(guī)則配置塊之后的其它配置;結(jié)束循環(huán),建議在location中使用
注:其中前兩種是跳轉(zhuǎn)型的flag,后兩種是代理型,跳轉(zhuǎn)型是指有客戶端瀏覽器重新對(duì)新地址進(jìn)行請(qǐng)求,代理型是在WEB服務(wù)器內(nèi)部實(shí)現(xiàn)跳轉(zhuǎn)的。
rewrite域名永久重定向
[root@CentOS7 conf.d]#vim ../conf/nginx.conf
location / {
root html;
index index.html index.htm;
rewrite / http://www.darius.com permanent; # 永久重定向301
#rewrite / http://www.darius.com redirect; # 臨時(shí)重定向302
}
[root@CentOS7 conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 conf.d]#nginx -s reload
重定向檢測(cè)
[root@CentOS7-Test ~]#curl 192.168.36.104
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h2>301 Moved Permanently</h2></center>
<hr><center>nginx</center>
</body>
</html>
[root@CentOS7-Test ~]#curl -L 192.168.36.104
www.darius.com
[root@CentOS7-Test ~]#curl -I 192.168.36.104
HTTP/1.1 301 Moved Permanently
Server: Darius/10.0
Date: Sat, 01 Jun 2019 04:27:42 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: http://www.darius.com
[root@CentOS7-Test ~]#curl -I 192.168.36.104
HTTP/1.1 302 Moved Temporarily
Server: Darius/10.0
Date: Sat, 01 Jun 2019 04:28:32 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Location: http://www.darius.com
location /last {
rewrite ^/last/(.*) /test$1 last;
return 888 "last";
}
location /break {
rewrite ^/break/(.*) /test$1 break;
return 666 "break";
}
location /test {
return 999 "test";
}
[root@CentOS7 conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 conf.d]#nginx -s reload
break不會(huì)跳轉(zhuǎn)到其他location中
[root@CentOS7-Test ~]#curl -L -i http://www.darius.com/break/index.html
HTTP/1.1 404 Not Found
Server: Darius/10.0
Date: Sat, 01 Jun 2019 06:12:04 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Vary: Accept-Encoding
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h2>404 Not Found</h2></center>
<hr><center>nginx</center>
</body>
</html>
#last會(huì)跳轉(zhuǎn)到其他location中繼續(xù)執(zhí)行匹配操作
[root@CentOS7-Test ~]#curl -L -i http://www.darius.com/last/index.html
HTTP/1.1 999
Server: Darius/10.0
Date: Sat, 01 Jun 2019 06:12:11 GMT
Content-Type: text/html
Content-Length: 4
Connection: keep-alive
test
server {
listen 80;
listen 443 ssl;
server_name www.darius.com;
error_log /apps/nginx/logs/www_darius_com_error.log;
access_log /apps/nginx/logs/www_darius_com_access.log access_json;
ssl_certificate /apps/nginx/certs/www.darius.com.crt;
ssl_certificate_key /apps/nginx/certs/www.darius.com.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
location / {
root /data/nginx/html/pc;
index index.html;
if ( $scheme = http ){
rewrite (.*) https://www.darius.com;
}
}
}
[root@CentOS7 conf.d]#nginx -s reload
訪問(wèn)測(cè)試
[root@CentOS7-Test ~]#curl -L -i -k http://www.darius.com
HTTP/1.1 302 Moved Temporarily
Server: Darius/10.0
Date: Sat, 01 Jun 2019 06:29:34 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Location: https://www.darius.com
HTTP/1.1 200 OK
Server: Darius/10.0
Date: Sat, 01 Jun 2019 06:29:37 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Thu, 30 May 2019 03:06:03 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5cef489b-7"
Accept-Ranges: bytes
pc web
當(dāng)用戶訪問(wèn)到公司網(wǎng)站時(shí),輸入一個(gè)錯(cuò)誤的URL,可以將用戶訪問(wèn)的瀏覽頁(yè)面重定向到公司官網(wǎng)首頁(yè)上
location / {
root /data/nginx/html/pc;
index index.html;
if ( !-f $request_filename ){
rewrite (.*) http://www.darius.com/index.html;
}
}
瀏覽測(cè)試
[root@CentOS7-Test ~]#curl -L -i http://www.darius.com/asdfg
HTTP/1.1 302 Moved Temporarily
Server: Darius/10.0
Date: Sat, 01 Jun 2019 06:56:26 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Location: http://www.darius.com/index.html
HTTP/1.1 200 OK
Server: Darius/10.0
Date: Sat, 01 Jun 2019 06:56:26 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Thu, 30 May 2019 03:06:03 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5cef489b-7"
Accept-Ranges: bytes
pc web
防盜鏈基于客戶端攜帶的referer實(shí)現(xiàn),referer是記錄打開(kāi)一個(gè)頁(yè)面之前記錄是從哪個(gè)頁(yè)面跳轉(zhuǎn)過(guò)來(lái)的標(biāo)記信息,如果別人只鏈接了自己網(wǎng)站圖片或某個(gè)單獨(dú)的資源,而不是打開(kāi)了網(wǎng)站的整個(gè)頁(yè)面,這就是盜鏈,referer就是之前的那個(gè)網(wǎng)站域名,正常的referer信息有以下幾種:
none:請(qǐng)求報(bào)文首部沒(méi)有referer首部,比如用戶直接在瀏覽器輸入域名訪問(wèn)web網(wǎng)站,就沒(méi)有referer信息。
blocked:請(qǐng)求報(bào)文有referer首部,但無(wú)有效值,比如為空。
server_names:referer首部中包含本主機(jī)名及即nginx 監(jiān)聽(tīng)的server_name。
arbitrary_string:自定義指定字符串,但可使用*作通配符。
regular expression:被指定的正則表達(dá)式模式匹配到的字符串,要使用~開(kāi)頭,例如:
~.*\.magedu\.com。
盜鏈測(cè)試
[root@CentOS7 conf.d]#cat a.conf
server {
listen 80;
charset utf-8;
server_name www.a.com;
location / {
root /data;
index index.html;
}
}
[root@CentOS7 conf.d]#cat /data/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>盜鏈頁(yè)面</title>
</head>
<body>
<a href="http://www.darius.com">測(cè)試盜鏈</a>
<img src="http://www.darius.com/logo.png">
</body>
</html>
[root@CentOS7 conf.d]#tail -f /apps/nginx/logs/*.log
==> /apps/nginx/logs/www_darius_com_access.log <==
{"@timestamp":"2019-06-01T15:21:30+08:00","host":"192.168.36.104","clientip":"192.168.36.1","size":0,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"www.darius.com","uri":"/logo.png","domain":"www.darius.com","xff":"-","referer":"http://www.a.com/","tcp_xff":"","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:67.0) Gecko/20100101 Firefox/67.0","status":"304"}
基于訪問(wèn)安全考慮,nginx支持通過(guò)ungx_http_referer_module模塊檢查訪問(wèn)請(qǐng)求的referer信息是否有效實(shí)現(xiàn)防盜鏈功能
location / {
root /data/nginx/html/pc;
index index.html;
valid_referers none blocked server_names *.magedu.com www.magedu.* api.online.test/v1/hostlist ~\.google\. ~\.baidu\.;
if ($invalid_referer) {
return 403;
}
}
[root@CentOS7 conf.d]#nginx -s reload
頁(yè)面訪問(wèn)測(cè)試
反向代理:反向代理也叫reverse proxy,指的是代理外網(wǎng)用戶的請(qǐng)求到內(nèi)部的指定web服務(wù)器,并將數(shù)據(jù)返回給用戶的一種方式,這是用的比較多的一種方式。
Nginx除了可以在企業(yè)提供高性能的web服務(wù)之外,另外還可以將本身不具備的請(qǐng)求通過(guò)某種預(yù)定義的協(xié)議轉(zhuǎn)發(fā)至其它服務(wù)器處理,不同的協(xié)議就是Nginx服務(wù)器與其他服務(wù)器進(jìn)行通信的一種規(guī)范,主要在不同的場(chǎng)景使用以下模塊實(shí)現(xiàn)不同的功能:
ngx_http_proxy_module: 將客戶端的請(qǐng)求以http協(xié)議轉(zhuǎn)發(fā)至指定服務(wù)器進(jìn)行處理。
ngx_stream_proxy_module:將客戶端的請(qǐng)求以tcp協(xié)議轉(zhuǎn)發(fā)至指定服務(wù)器處理。
ngx_http_fastcgi_module:將客戶端對(duì)php的請(qǐng)求以fastcgi協(xié)議轉(zhuǎn)發(fā)至指定服務(wù)器助理。
ngx_http_uwsgi_module:將客戶端對(duì)Python的請(qǐng)求以u(píng)wsgi協(xié)議轉(zhuǎn)發(fā)至指定服務(wù)器處理。
##### Nginx http的反向代理實(shí)現(xiàn)
1.proxy_pass; 用來(lái)設(shè)置將客戶端請(qǐng)求轉(zhuǎn)發(fā)給的后端服務(wù)器的主機(jī),可以是主機(jī)名、IP地址:端口的方式,也可以代理到預(yù)先設(shè)置的主機(jī)群組,需要模塊gx_http_upstream_module支持。
server {
listen 80;
charset utf-8;
server_name www.a.com;
location /app {
proxy_pass http://192.168.36.110:80; # 不帶斜線將訪問(wèn)的/web,等于訪問(wèn)后端服務(wù)器 http://192.168.36.103:80/web/index.html,即后端服務(wù)器配置的站點(diǎn)根目錄要有web目錄才可以被訪問(wèn),這是一個(gè)追加/web到后端服務(wù)器。 帶斜線,等于訪問(wèn)后端服務(wù)器的http://192.168.36.103:80/index.html 內(nèi)容返回給客戶端
index index.html;
}
}
訪問(wèn)測(cè)試
[root@CentOS7 conf.d]#curl -L -i http://www.a.com/app
HTTP/1.1 301 Moved Permanently
Server: Darius/10.0
Date: Sat, 01 Jun 2019 08:24:33 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 234
Connection: keep-alive
Location: http://192.168.36.110/app/
HTTP/1.1 200 OK
Date: Sat, 01 Jun 2019 08:24:31 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sat, 25 May 2019 03:41:28 GMT
ETag: "19-589ae171491d6"
Accept-Ranges: bytes
Content-Length: 25
Content-Type: text/html; charset=UTF-8
<h2>Real Server 110</h2>
2.proxy_hide_header; 用于nginx作為反向代理的時(shí)候,在返回給客戶端http響應(yīng)的時(shí)候,隱藏后端服務(wù)版本相應(yīng)頭部的信息,可以設(shè)置在http/server或location塊
[root@CentOS7 conf.d]#vim a.conf
server {
listen 80;
charset utf-8;
server_name www.a.com;
location /app {
index index.html;
proxy_pass http://192.168.36.110:80;
proxy_hide_header Location; # 若想隱藏多個(gè)head頭部信息需要再次定義proxy_hide_header,不支持在后面接著寫(xiě)
}
}
[root@CentOS7 conf.d]#nginx -s reload
[root@CentOS7 conf.d]#curl -L -I http://www.a.com/app
HTTP/1.1 301 Moved Permanently
Server: Darius/10.0
Date: Sat, 01 Jun 2019 08:30:47 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
3.proxy_pass_request_body on | off; 是否向后端服務(wù)器發(fā)送HTTP包體部分,可以設(shè)置在http/server或location塊,默認(rèn)即為開(kāi)啟
4.proxy_pass_request_headers on | off; 是否將客戶端的請(qǐng)求頭部轉(zhuǎn)發(fā)給后端服務(wù)器,可以設(shè)置在http/server或location塊,默認(rèn)即為開(kāi)啟
5.proxy_set_header; 可以更改或添加客戶端的請(qǐng)求頭部信息內(nèi)容并轉(zhuǎn)發(fā)至后端服務(wù)器,比如在后端服務(wù)器想要獲取客戶端的真實(shí)IP的時(shí)候,就要更改每一個(gè)報(bào)文的頭部,如下:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HOST $remote_addr;
添加HOST到報(bào)文頭部,如果客戶端為NAT上網(wǎng)那么其值為客戶端的共用的公網(wǎng)IP地址。
6.proxy_hide_header field; 用于隱藏后端服務(wù)器特定的響應(yīng)首部,默認(rèn)nginx在響應(yīng)報(bào)文中不傳遞后端服務(wù)器的首部字段Date, Server, XPad, X-Accel等
7.proxy_connect_timeout time; 配置nginx服務(wù)器與后端服務(wù)器嘗試建立連接的超時(shí)時(shí)間,默認(rèn)為60秒
proxy_connect_timeout 60s;
60s為自定義nginx與后端服務(wù)器建立連接的超時(shí)時(shí)間
8.proxy_read_time time; 配置nginx服務(wù)器向后端服務(wù)器或服務(wù)器組發(fā)起read請(qǐng)求后,等待的超時(shí)時(shí)間,默認(rèn)60s
proxy_send_time time;
配置nginx項(xiàng)后端服務(wù)器或服務(wù)器組發(fā)起write請(qǐng)求后,等待的超時(shí)時(shí)間,默認(rèn)60s
9.proxy_http_version 1.0; 用于設(shè)置nginx提供代理服務(wù)的HTTP協(xié)議的版本,默認(rèn)http 1.0
10.proxy_ignore_client_abort off; 當(dāng)客戶端網(wǎng)絡(luò)中斷請(qǐng)求時(shí),nginx服務(wù)器中斷其對(duì)后端服務(wù)器的請(qǐng)求。即如果此項(xiàng)設(shè)置為on開(kāi)啟,則服務(wù)器會(huì)忽略客戶端中斷并一直等著代理服務(wù)執(zhí)行返回,如果設(shè)置為off,則客戶端中斷后Nginx也會(huì)中斷客戶端請(qǐng)求并立即記錄499日志,默認(rèn)為off。
11.proxy_headers_hash_bucket_size 64; 當(dāng)配置了 proxy_hide_header和proxy_set_header的時(shí)候,用于設(shè)置nginx保存HTTP報(bào)文頭的hash表的上限。
12.proxy_headers_hash_max_size 512; 設(shè)置proxy_headers_hash_bucket_size的最大可用空間
13.server_names_hash_bucket_size 512; server_name hash表申請(qǐng)空間大小
14.server_names_hash_max_szie 512; 設(shè)置服務(wù)器名稱hash表的上限大小
1.proxy_cache zone | off; 默認(rèn)off 指明調(diào)用的緩存,或關(guān)閉緩存機(jī)制
2.proxy_cache_key string; 緩存中用于“鍵”的內(nèi)容,默認(rèn)值:proxy_cache_key $scheme$proxy_host$request_uri;
3.proxy_cache_valid [code ...] time; 定義對(duì)特定響應(yīng)碼的響應(yīng)內(nèi)容的緩存時(shí)長(zhǎng),定義在http{...}中
示例
調(diào)用緩存功能,需要定義在相應(yīng)的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 10m; # 對(duì)200、302類響應(yīng)碼緩存10分鐘
proxy_cache_valid 404 1m; # 對(duì)404類響應(yīng)碼緩存1分鐘
4.proxy_cache_path; 定義可用于proxy功能的緩存;
使用方法:
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number]
[manager_sleep=time] [manager_threshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number]
[purger_sleep=time] [purger_threshold=time];
示例:在http配置定義緩存信息
proxy_cache_path /var/cache/nginx/proxy_cache # 定義緩存保存路徑,proxy_cache會(huì)自動(dòng)創(chuàng)
建
levels=1:2:2; # 定義緩存目錄結(jié)構(gòu)層次,1:2:2可以生成2^4x2^8x2^8=1048576個(gè)目錄
keys_zone=proxycache:20m; # 指內(nèi)存中緩存的大小,主要用于存放key和metadata(如:使用次數(shù))
inactive=120s; # 緩存有效時(shí)間
max_size=1g; # 最大磁盤(pán)占用空間,磁盤(pán)存入文件內(nèi)容的緩存空間最大值
5. proxy_cache_use_stale; 在被代理的后端服務(wù)器出現(xiàn)哪種情況下,可直接使用過(guò)期的緩存響應(yīng)客戶端
bash
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默認(rèn)是off
6.proxy_cache_methods GET | HEAD | POST ...; 對(duì)哪些客戶端請(qǐng)求方法對(duì)應(yīng)的響應(yīng)進(jìn)行緩存,GET和HEAD方法總是被緩存
7.proxy_set_header field value; 設(shè)定發(fā)往后端主機(jī)的請(qǐng)求報(bào)文的請(qǐng)求首部的值
Context: http, server, location
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
請(qǐng)求報(bào)文的標(biāo)準(zhǔn)格式如下:
X-Forwarded-For: client1, proxy1, proxy2
[root@CentOS7 conf.d]#vim ../conf/nginx.conf # 配置在nginx.conf http配置段
proxy_cache_path /data/nginx/proxycache levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
[root@CentOS7 conf.d]#cat a.conf
server {
listen 80;
charset utf-8;
server_name www.a.com;
location /app { # 要緩存的URL或者放在server配置項(xiàng)對(duì)所有URL都進(jìn)行緩存
index index.html;
proxy_pass http://192.168.36.110:80;
proxy_hide_header Location;
proxy_hide_header Connection;
proxy_set_header clientip $remote_addr;
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 10m;
proxy_cache_valid any 1m;
}
}
[root@CentOS7 conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 conf.d]#nginx -s reload
訪問(wèn)驗(yàn)證
[root@CentOS7 conf.d]#curl -L http://www.a.com/app
[root@CentOS7 conf.d]#ab -n 2000 -c 200 http://www.a.com/app
Total transferred: 822000 bytes
HTML transferred: 468000 bytes
Requests per second: 9413.58 [#/sec] (mean)
Time per request: 21.246 [ms] (mean)
Time per request: 0.106 [ms] (mean, across all concurrent requests)
Transfer rate: 3778.30 [Kbytes/sec] received
緩存路徑結(jié)構(gòu)及文件大小
[root@CentOS7 conf.d]#tree /data/nginx/proxycache/
/data/nginx/proxycache/
├── 2
│ └── e
│ └── 8
└── 7
└── 5
└── b
└── 606c5106afffe9fd4f2021504afe7b57
6 directories, 1 file
驗(yàn)證文件內(nèi)容
[root@CentOS7 conf.d]#head -n100 /data/nginx/proxycache/7/5/b/606c5106afffe9fd4f2021504afe7b57
HTTP/1.1 200 OK
Date: Sat, 01 Jun 2019 09:51:06 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sat, 01 Jun 2019 09:50:35 GMT
ETag: "1388-58a4010131b0d"
Accept-Ranges: bytes
Content-Length: 5000
Connection: close
Content-Type: text/html; charset=UTF-8
nginx基于模塊ngx_http_headers_module可以實(shí)現(xiàn)對(duì)頭部報(bào)文添加指定的key與值
添加自定義首部,如下:
add_header name value [always];
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name;
add_trailer name value [always];
添加自定義響應(yīng)信息的尾部, 1.13.2版后支持
[root@CentOS7 conf.d]#cat a.conf
server {
listen 80;
charset utf-8;
server_name www.a.com;
location /app {
index index.html;
proxy_pass http://192.168.36.110:80;
proxy_set_header clientip $remote_addr;
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 10m;
proxy_cache_valid any 1m;
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name;
}
}
[root@CentOS7 conf.d]#nginx -s reload
[root@CentOS7 conf.d]#curl -i http://www.a.com/app
HTTP/1.1 301 Moved Permanently
Server: Darius/10.0
Date: Sat, 01 Jun 2019 10:12:16 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 234
Connection: keep-alive
Location: http://192.168.36.110/app/
X-Via: 192.168.36.104
X-Cache: MISS # 第一次訪問(wèn)沒(méi)有使用緩存,再次進(jìn)行訪問(wèn)測(cè)試
X-Accel: www.a.com
[root@CentOS7 conf.d]#curl -i http://www.a.com/app
HTTP/1.1 301 Moved Permanently
Server: Darius/10.0
Date: Sat, 01 Jun 2019 10:12:18 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 234
Connection: keep-alive
Location: http://192.168.36.110/app/
X-Via: 192.168.36.104
X-Cache: HIT # 第二次訪問(wèn)命中緩存
X-Accel: www.a.com
Nginx可以基于ngx_http_upstream_module模塊提供服務(wù)器分組轉(zhuǎn)發(fā)、權(quán)重分配、狀態(tài)監(jiān)測(cè)、調(diào)度算法等高級(jí)功能
upstream name {
}
自定義一組服務(wù)器,配置在http內(nèi)
server address [parameters];
配置一個(gè)后端web服務(wù)器,配置在upstream內(nèi),至少要有一個(gè)server服務(wù)器配置。
server支持的parameters如下:
weight=number # 設(shè)置權(quán)重,默認(rèn)為1。
max_conns=number # 給當(dāng)前server設(shè)置最大活動(dòng)鏈接數(shù),默認(rèn)為0表示沒(méi)有限制。
max_fails=number # 對(duì)后端服務(wù)器連續(xù)監(jiān)測(cè)失敗多少次就標(biāo)記為不可用。
fail_timeout=time # 對(duì)后端服務(wù)器的單次監(jiān)測(cè)超時(shí)時(shí)間,默認(rèn)為10秒。
backup # 設(shè)置為備份服務(wù)器,當(dāng)所有服務(wù)器不可用時(shí)將重新啟用次服務(wù)器。
down # 標(biāo)記為down狀態(tài)。
resolve # 當(dāng)server定義的是主機(jī)名的時(shí)候,當(dāng)A記錄發(fā)生變化會(huì)自動(dòng)應(yīng)用新IP而不用重啟Nginx。
hash KEY consistent;
基于指定key做hash計(jì)算,使用consistent參數(shù),將使用ketama一致性hash算法,適用于后端是Cache服務(wù)器(如varnish)時(shí)使用,consistent定義使用一致性hash運(yùn)算,一致性hash基于取模運(yùn)算。
所謂取模運(yùn)算,就是計(jì)算兩個(gè)數(shù)相除之后的余數(shù),比如10%7=3, 7%4=3
hash $request_uri consistent; # 基于用戶請(qǐng)求的uri做hash
ip_hash; # 源地址hash調(diào)度方法,基于的客戶端的remote_addr(源地址)做hash計(jì)算,以實(shí)現(xiàn)會(huì)話保持
least_conn; # 最少連接調(diào)度算法,優(yōu)先將客戶端請(qǐng)求調(diào)度到當(dāng)前連接最少的后端服務(wù)器
[root@CentOS7 conf.d]#vim ../conf/nginx.conf
upstream app1 {
#hash $request_uri consistent;
#ip_hash; # 指定ip_hash算法,根據(jù)session調(diào)度到同一臺(tái)后端主機(jī)上,當(dāng)此臺(tái)主機(jī)宕機(jī),則強(qiáng)制切換到另一臺(tái)存活的主機(jī)上
#least_conn;
server 192.168.36.110:80 weight=1 fail_timeout=5s max_fails=3; # 后端服務(wù)器狀態(tài)監(jiān)測(cè):fail_timeout連續(xù)檢測(cè)多少次失敗,max_fails檢測(cè)時(shí)長(zhǎng)
server 192.168.36.106:80 weight=1 fail_timeout=5s max_fails=3;
server 192.168.36.101:80 weight=1 fail_timeout=5s max_fails=3 backup; # 備用服務(wù)器,當(dāng)其余反向代理服務(wù)器宕機(jī),啟用備用服務(wù)器
}
[root@CentOS7 conf.d]#vim a.conf
server {
listen 80;
charset utf-8;
server_name www.a.com;
location / {
index index.html;
root /data/nginx/html/pc;
}
location /app {
index index.html;
proxy_pass http://app1;
}
}
[root@CentOS7 conf.d]#nginx -s reload
訪問(wèn)測(cè)試
[root@CentOS7 conf.d]#while true;do curl http://www.a.com/app/index.html;sleep 0.5;done
192.168.36.110
192.168.36.106
192.168.36.110
192.168.36.106
[root@CentOS7 conf.d]#vim ../conf/nginx.conf
upstream app1 {
#hash $request_uri consistent;
#least_conn;
server 192.168.36.110:80 weight=1 fail_timeout=5s max_fails=3;
server 192.168.36.106:80 weight=1 fail_timeout=5s max_fails=3;
ip_hash;
}
[root@CentOS7 conf.d]#nginx -s reload
訪問(wèn)測(cè)試:
[root@CentOS7 conf.d]#while true;do curl http://www.a.com/app/index.html;sleep 0.5;done
192.168.36.106
192.168.36.106
192.168.36.106
192.168.36.106
192.168.36.106
192.168.36.106
宕機(jī)測(cè)試
[root@CentOS7 conf.d]#while true;do curl http://www.a.com/app/index.html;sleep 0.5;done
192.168.36.106
192.168.36.106
192.168.36.106
192.168.36.106
192.168.36.110 # 請(qǐng)求被強(qiáng)制切換到存活主機(jī)上
192.168.36.110
....
192.168.36.106 # 當(dāng)修復(fù)好宕機(jī)主機(jī)重新工作,請(qǐng)求將重新回到原來(lái)的主機(jī)上
192.168.36.106
192.168.36.106
upstream web {
server 192.168.36.1 weight=1 max_fails=2 fail_timeout=2;
server 192.168.36.2 weight=1 max_fails=2 fail_timeout=2;
}
upstream image {
server 192.168.36.3 weight=1 max_fails=2 fail_timeout=2;
server 192.168.36.4 weight=1 max_fails=2 fail_timeout=2;
}
upstream php {
server 192.168.36.5 weight=1 max_fails=2 fail_timeout=2;
server 192.168.36.6 weight=1 max_fails=2 fail_timeout=2;
}
location /{
root html/web;
index index.php index.html;
}
location ~* \.php$ {
fastcgi_proxy http://php;
}
location ~* "\.(.jpg|png|jpeg|gif)" {
proxy_pass http://image;
}
Nginx在1.9.0版本開(kāi)始支持tcp模式的負(fù)載均衡,在1.9.13版本開(kāi)始支持udp協(xié)議的負(fù)載,udp主要用于DNS的域名解析,其配置方式和指令和http 代理類似,其基于ngx_stream_proxy_module模塊實(shí)現(xiàn)tcp負(fù)載,另外基于模塊ngx_stream_upstream_module實(shí)現(xiàn)后端服務(wù)器分組轉(zhuǎn)發(fā)、權(quán)重分配、狀態(tài)監(jiān)測(cè)、調(diào)度算法等高級(jí)功能。
stream { #定義stream
upstream backend { #定義后端服務(wù)器
hash $remote_addr consistent; #定義調(diào)度算法
server backend1.example.com:12345 weight=5; #定義具體server
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
upstream dns { #定義后端服務(wù)器
server 192.168.0.1:53535; #定義具體server
server dns.example.com:53;
}
server { #定義server
listen 12345; #監(jiān)聽(tīng)I(yíng)P:PORT
proxy_connect_timeout 1s; #連接超時(shí)時(shí)間
proxy_timeout 3s; #轉(zhuǎn)發(fā)超時(shí)時(shí)間
proxy_pass backend; #轉(zhuǎn)發(fā)到具體服務(wù)器組
}
server {
listen 127.0.0.1:53 udp reuseport;
proxy_timeout 20s;
proxy_pass dns;
}
server {
listen [::1]:12345;
proxy_pass unix:/tmp/stream.socket;
}
}
[root@CentOS7-1 ~]#yum install -y redis
[root@CentOS7-1 ~]#vim /etc/redis.conf
[root@CentOS7-1 ~]#egrep "^bind" /etc/redis.conf
bind 0.0.0.0
[root@CentOS7-1 ~]#systemctl start redis
[root@CentOS7-1 ~]#systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
[root@CentOS7-1 ~]#ss -ntl | grep 6379 # Redis基于6379端口進(jìn)行工作
LISTEN 0 128 *:6379 *:*
[root@CentOS7 ~]#mkdir /apps/nginx/tcp
[root@CentOS7 ~]#cd /apps/nginx/tcp/
[root@CentOS7 tcp]#vim tcp.conf
stream {
upstream redis_server {
server 192.168.36.110:6379 max_fails=3 fail_timeout=30s;
}
server {
listen 192.168.36.104:6379;
proxy_connect_timeout 3s;
proxy_timeout 3s;
proxy_pass redis_server;
}
}
[root@CentOS7 tcp]#vim ../conf/nginx.conf
include /apps/nginx/tcp/tcp.conf; # 注意此處的include與http模塊平級(jí),建議寫(xiě)在http模塊上方
[root@CentOS7 tcp]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 tcp]#nginx -s reload
查看6379端口是否開(kāi)啟
[root@CentOS7 tcp]#ss -ntl | grep 6379
LISTEN 0 128 192.168.36.104:6379 *:*
測(cè)試通過(guò)Nginx負(fù)載連接Redis
[root@CentOS7-1 ~]#redis-cli -h 192.168.36.104
192.168.36.104:6379> set name darius
OK
192.168.36.104:6379> get name
"darius"
192.168.36.104:6379>
[root@CentOS7-1 ~]#yum install -y mariadb mariadb-server
[root@CentOS7-1 ~]#systemctl start mariadb # 啟動(dòng)mariadb數(shù)據(jù)庫(kù)服務(wù)
[root@CentOS7-1 ~]#systemctl enable mariadb # 開(kāi)機(jī)自啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)
[root@CentOS7-1 ~]#ss -ntl | grep 3306 # 檢查端口是否啟動(dòng)
LISTEN 0 50 *:3306 *:*
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@CentOS7-1 ~]#mysql_secure_installation # 對(duì)數(shù)據(jù)庫(kù)進(jìn)行安全加固
對(duì)數(shù)據(jù)庫(kù)進(jìn)行授權(quán)操作
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.36.%' IDENTIFIED BY 'centos';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Nginx配置
[root@CentOS7 tcp]#vim tcp.conf
stream {
upstream mysql_server {
least_conn;
server 192.168.36.110:3306 max_fails=3 fail_timeout=30s;
}
server {
listen 192.168.36.104:3306;
proxy_connect_timeout 3s;
proxy_timeout 3s;
proxy_pass mysql_server;
}
}
[root@CentOS7 tcp]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@CentOS7 tcp]#nginx -s reload
對(duì)負(fù)載端口進(jìn)行檢查
[root@CentOS7 tcp]#ss -ntl | grep 3306
LISTEN 0 128 192.168.36.104:3306 *:*
####測(cè)試通過(guò)nginx負(fù)載連接Mysql
[root@CentOS7-1 ~]#mysql -uroot -pcentos -h 192.168.36.104
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 16
Server version: 5.5.60-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE Darius;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Darius |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。