一、平滑升級
- 平滑升級就是在不影響業(yè)務(wù)運(yùn)行的情況下,可以對nginx新增模塊功能。雖然有這樣一個(gè)功能,但在實(shí)際生產(chǎn)中最好是一次性把所有需要的模塊編譯進(jìn)去。
- 這里演示如何新增一個(gè)echo模塊。
1.緊接上文,查看nginx當(dāng)前已編譯的模塊。
2.下載新模塊,echo模塊下載地址。
3.解壓nginx安裝包,注意這里的安裝包版本就是當(dāng)前已安裝的nginx版本的二進(jìn)制包。
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0
4.開始編譯新模塊。
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--add-module=/root/echo-nginx-module-master //也就是在第一次編譯的所有參數(shù)后買你添加此行,指定新增模塊的解壓目錄。
//使用make編譯,編譯后絕不能再執(zhí)行make install。
make
5.備份原程序。
cp /usr/local/nginx/sbin/nginx{,-bck}
6.停止服務(wù),使用新程序文件啟動(dòng)Nginx,最后查看已經(jīng)編譯的模塊。
//停止服務(wù)。
nginx -s stop
//拷貝新程序替換原程序
cp /root/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin/
//啟動(dòng)服務(wù)。
nginx
7.測試echo模塊效果。修改配置文件后重啟服務(wù),訪問url
二、修飾符
修飾符 | 功能 |
---|---|
= | 精確匹配 |
~ | 正則表達(dá)式模式匹配,區(qū)分大小寫 |
~* | 正則表達(dá)式模式匹配,不區(qū)分大小寫 |
^~ | 前綴匹配,類似于無修飾符的行為,也是以指定模塊開始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正則表達(dá)式 |
@ | 定義命名location區(qū)段,這些區(qū)段客戶端不能訪問,只可以由內(nèi)部產(chǎn)生的請求來訪問,如try_files或error_page等 |
2.1 無修飾符效果
1.修改配置文件,重啟服務(wù)。
http {
server {
listen 80;
server_name www.qingjun.com;
location /qingjun { //此時(shí)location沒有添加修飾符,就光一個(gè)/qingjun
echo 'hehe';
}
}
}
2.此時(shí)能匹配qingjun并輸出內(nèi)容,如下幾種情況。
2.2 精準(zhǔn)匹配(=)
- =,表示必須與指定的模式精確匹配。
1.修改配置文件,重啟服務(wù)。
http {
server {
listen 80;
server_name www.qingjun.com;
location = /qingjun { //在/qingjun前面添加修飾符 =
echo 'hehe';
}
}
}
2.此時(shí)能匹配qingjun并輸出內(nèi)容,如以下幾種情況。
3.以下幾種情況不能匹配。
2.3 區(qū)分大小寫匹配(~)
- ~,表示指定的正則表達(dá)式要區(qū)分大小寫。
1.修改配置文件,重啟服務(wù)。
http {
server {
listen 80;
server_name www.qingjun.com;
location ~ /qingjun {
echo 'hehe';
}
}
}
2.查看效果。
2.4 不區(qū)分大小寫匹配(~*)
- ~*,表示指定的正則表達(dá)式不區(qū)分大小寫
1.修改配置文件,重啟服務(wù)。
http {
server {
listen 80;
server_name www.qingjun.com;
location ~* /qingjun {
echo 'hehe';
}
}
}
2.查看效果。
2.5 匹配優(yōu)先級
優(yōu)先級次序如下:
( location = 路徑 ) --> ( location ^~ 路徑 ) --> ( location ~ 正則 ) --> ( location ~* 正則 ) --> ( location 路徑 )
1.當(dāng)有=修飾符時(shí),優(yōu)先顯示=修飾符下面的location內(nèi)容。
2.正則表達(dá)式按照配置文件中定義的順序匹配。
三、訪問控制
- 訪問控制就是設(shè)置黑名單、白名單,允許哪些主機(jī)可以訪問,哪些主機(jī)不能訪問。
參數(shù) | 釋義 | 備注 |
---|---|---|
allow | 設(shè)定允許哪臺或哪些主機(jī)訪問,多個(gè)參數(shù)間用空格隔開。 | 可用于全局段、http段、server段、location段 |
deny | 設(shè)定禁止哪臺或哪些主機(jī)訪問,多個(gè)參數(shù)間用空格隔開。 | 可用于全局段、http段、server段、location段 |
1.示例。
allow 192.168.1.1/32 172.16.0.0/16;
deny all;
2.設(shè)置IP白名單。
http {
server {
listen 80;
server_name www.qingjun.com;
location ~ /qingjun {
echo 'dsadjkalsdjlkaas';
allow 192.168.161.132/32; //只允許這臺主機(jī)訪問
deny all; //拒絕所有主機(jī)
}
}
}
3.設(shè)置IP黑名單。
http {
deny 192.168.161.132/32;
allow all;
server {
listen 80;
server_name www.qingjun.com;
location ~ /qingjun {
echo 'dsadjkalsdjlkaas';
}
}
}
四、用戶認(rèn)證
- 讓客戶端訪問時(shí)需要通過輸入正確的賬號密碼后,才能訪問到網(wǎng)頁。
參數(shù) | 釋義 | 備注 |
---|---|---|
auth_basic “歡迎信息”; | 添加描述信息。 | 可用于全局段、http段、server段、location段 |
auth_basic_user_file “/path/to/user_auth_file” | 指定加密文件路徑。 | 可用于全局段、http段、server段、location段 |
1.生成加密文件,里面包含賬戶和密碼。
yum -y install httpd-tools
//-m指定文件存放路徑,一般就是如下這個(gè)地址,admin為自定義賬戶。
htpasswd -c -m /usr/local/nginx/.password admin
2.修改nginx配置文件,指定加密文件。
http {
auth_basic "111";
auth_basic_user_file '/usr/local/nginx/.password';
server {
listen 80;
server_name www.qingjun.com;
location ~ /qingjun {
echo 'dsadjkalsdjlkaas';
}
}
}
3.訪問網(wǎng)頁,查看效果。
五、配置https
1.自簽CA證書。
//生成密鑰。
mkdir /etc/pki/CA
cd /etc/pki/CA/
mkdir private
(umask 077;openssl genrsa -out private/cakey.pem 2048)
//提取公鑰。
openssl rsa -in private/cakey.pem -pubout
//CA自簽證書。
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
//#讀出cacert.pem證書內(nèi)容
openssl x509 -text -in cacert.pem
mkdir certs newcerts crl
touch index.txt && echo 01 > serial
//客戶端生成密鑰。
cd /usr/local/nginx/
mkdir ssl
cd ssl/
(umask 077;openssl genrsa -out nginx.key 2048)
//客戶端生成證書簽署請求
openssl req -new -key nginx.key -days 365 -out nginx.csr
//客戶端把證書簽署請求文件發(fā)送給CA(這里不需要做這步驟,因?yàn)槲覀円呀?jīng)在當(dāng)前目錄了)
scp httpd.csr root@CA端IP:/root
//CA簽署客戶端提交上來的證書。
openssl ca -in ./nginx.csr -out nginx.crt -days 365
//刪除過度文件。
rm -rf nginx.csr
2.修改nginx配置文件。
http {
server {
listen 443 ssl; //修改端口號
server_name www.qingjun.com; //域名要與證書里保持一致。
ssl_certificate ../ssl/nginx.crt; //指定公鑰
ssl_certificate_key ../ssl/nginx.key; //指定私鑰
ssl_session_cache shared:SSL:1m; //取消注釋
ssl_session_timeout 5m; //取消注釋
ssl_ciphers HIGH:!aNULL:!MD5; //取消注釋
ssl_prefer_server_ciphers on; //取消注釋
location ~ /qingjun {
echo 'dsadjkalsdjlkaas';
}
}
}
3.重啟服務(wù),訪問網(wǎng)頁。
六、開啟狀態(tài)界面
- 可以通過狀態(tài)網(wǎng)頁獲取基本的流量信息。
- 該參數(shù)由 --with-http_stub_status_module 模塊提供,安裝Nginx時(shí)需要加入該模塊。
狀態(tài)碼 | 表示的意義 |
---|---|
Active connections 2 | 當(dāng)前所有處于打開狀態(tài)的連接數(shù) |
accepts | 總共處理了多少個(gè)連接 |
handled | 成功創(chuàng)建多少握手 |
requests | 總共處理了多少個(gè)請求 |
Reading | nginx讀取到客戶端的Header信息數(shù),表示正處于接收請求狀態(tài)的連接數(shù) |
Writing | nginx返回給客戶端的Header信息數(shù),表示請求已經(jīng)接收完成, 且正處于處理請求或發(fā)送響應(yīng)的過程中的連接數(shù) |
Waiting | 開啟keep-alive的情況下,這個(gè)值等于active - (reading + writing), 意思就是Nginx已處理完正在等候下一次請求指令的駐留連接 |
1.修改配置文件??梢耘浜习酌麊蝸硗?。
location /status {
stub_status {on | off};
allow 172.16.0.0/16;
deny all;
}
2.重啟服務(wù),http://ip/status訪問狀態(tài)網(wǎng)頁。
活動(dòng)的連接數(shù):1
服務(wù)接受的連接數(shù):4
處理的個(gè)數(shù):4
請求的個(gè)數(shù):1
處于讀的個(gè)數(shù):0
處于寫的個(gè)數(shù):1
處于等待的個(gè)數(shù):1
3.可以使用zabbix監(jiān)控這個(gè)網(wǎng)頁中的連接數(shù)。
[root@master conf]# curl -k https://192.168.161.129/status
Active connections: 1
server accepts handled requests
6 6 2
Reading: 0 Writing: 1 Waiting: 0
//取第一行的數(shù)值即可。
curl -k https://192.168.161.129/status |awk 'NR==1{print $3}'
1
七、rewrite重寫url
- 把原來要訪問的uri交給另外一個(gè)uri去尋找,是用來執(zhí)行URL重定向。
- 這個(gè)機(jī)制有利于去掉惡意訪問的url,也有利于搜索引擎優(yōu)化(SEO)
- 語法:rewrite regex replacement flag;
- 捕獲子表達(dá)式,可以捕獲放在()之間的任何文本,比如^(hello|sir)$ ,符串為“hi sir”捕獲的結(jié)果$1=hi$2=sir
示例 | 釋義 |
---|---|
rewrite ^/images/(.*.jpg)$ /imgs/$1 break | 表示訪問images的uri時(shí),交給imgs這個(gè)uri去尋找。 |
rewrite ^/img/(.*)$ http://www.idfsoft.com/index.html redirect | 表示訪問img這個(gè)uri時(shí),交給http://www.idfsoft.com/index.html這個(gè)url尋找。 |
flag | 作用 |
---|---|
last | 基本上都用這個(gè)flag,表示當(dāng)前的匹配結(jié)束,繼續(xù)下一個(gè)匹配,最多匹配10個(gè)到20個(gè) 一旦此rewrite規(guī)則重寫完成后,就不再被后面其它的rewrite規(guī)則進(jìn)行處理 而是由UserAgent重新對重寫后的URL再一次發(fā)起請求,并從頭開始執(zhí)行類似的過程 |
break | 中止Rewrite,不再繼續(xù)匹配 一旦此rewrite規(guī)則重寫完成后,由UserAgent對新的URL重新發(fā)起請求, 且不再會被當(dāng)前l(fā)ocation內(nèi)的任何rewrite規(guī)則所檢查 |
redirect | 以臨時(shí)重定向的HTTP狀態(tài)302返回新的URL |
permanent | 以永久重定向的HTTP狀態(tài)301返回新的URL |
標(biāo)識符 | 意義 |
---|---|
^ | 必須以^后的實(shí)體開頭 |
$ | 必須以$前的實(shí)體結(jié)尾 |
. | 匹配任意字符 |
[] | 匹配指定字符集內(nèi)的任意字符 |
[^] | 匹配任何不包括在指定字符集內(nèi)的任意字符串 |
l | 匹配 l之前或之后的實(shí)體 |
() | 分組,組成一組用于匹配的實(shí)體,通常會有 l來協(xié)助 |
7.1 uri——>uri
1.正常訪問圖片效果。創(chuàng)建圖片目錄,上傳一張圖片,web訪問。
mkdir /usr/local/nginx/html/img
[root@master img]# ll
-rw-r--r-- 1 root root 1476047 Jul 18 23:20 1.jpg
//修改配置文件。
vim /usr/local/nginx/conf/nginx.conf
http {
server {
listen 80;
server_name www.qingjun.com;
location ~ /img {
root /usr/local/nginx/html;
}
}
}
2.修改圖片目錄名,此時(shí)使用img路徑就訪問不到這個(gè)圖片。
mv /usr/local/nginx/html/img /usr/local/nginx/html/qingjun
3.添加rewrite重寫url規(guī)則,再次訪問。
http {
server {
listen 80;
server_name www.qingjun.com;
location ~ /img {
root /usr/local/nginx/html;
rewrite ^/img/(.*\.jpg)$ /qingjun/$1 break; //img交給qingjun去找,$1等于括號里的內(nèi)容。
}
location ~ /qingjun { //指定圖片正確存在的路徑。
root /usr/local/nginx/html;
}
}
}
4.若目標(biāo)地址不在源地址的根下,則需要定義源地址的根。
//將圖片地址移到其他位置。
mv /usr/local/nginx/html/qingjun /opt/
//修改配置文件。
http {
server {
listen 80;
server_name www.qingjun.com;
location ~ /img {
root /opt; //也要改成圖片正確位置的上一級目錄。
rewrite ^/img/(.*\.jpg)$ /qingjun/$1 break;
}
location ~ /qingjun { //圖片正確位置。
root /opt;
}
}
}
7.2 uri——>其他網(wǎng)址
1.定義一個(gè)正常訪問網(wǎng)站。
http {
server {
listen 80;
server_name www.qingjun.com;
location /qingjun {
root /usr/local/nginx/html;
index index.html index.htm;
}
}
}
//定義網(wǎng)頁文件
mkdir /usr/local/nginx/html/qingjun
echo 'hehe' > /usr/local/nginx/html/qingjun/index.html
2.使用rewrite重定向,使其訪問http:ip/qingjun會跳轉(zhuǎn)到其他網(wǎng)址。
http {
server {
listen 80;
server_name www.qingjun.com;
location /qingjun {
root /usr/local/nginx/html;
index index.html index.htm;
rewrite ^/qingjun/(.*)$ https://blog.csdn.net/yi_qingjun?spm=1011.2415.3001.5343;
}
}
}
3.調(diào)用其他網(wǎng)站的圖片讓客戶訪問。訪問img轉(zhuǎn)到其他網(wǎng)址。
http {
server {
listen 80;
server_name www.qingjun.com;
location /img {
root /usr/local/nginx/html;
index index.html index.htm;
rewrite ^/img/(.*)$ https://cn.bing.com/images/search?view=detailV2&ccid=CxDCuKuu&id=FBA838ACF064A76AC0058220B2B6BCB1CBBD5DE6&thid=OIP.CxDCuKuuVVfXZ_eDRcfDuQHaEK&mediaurl=https%3a%2f%2fts1.cn.mm.bing.net%2fth%2fid%2fR-C.0b10c2b8abae5557d767f78345c7c3b9%3frik%3d5l29y7G8trIggg%26riu%3dhttp%253a%252f%252fi3.img.969g.com%252fdown%252fimgx2014%252f02%252f08%252f289_093214_13ee6.jpg%26ehk%3dDz0E1RuS%252fO0MM4sqy3TBm9fhMKtoEti9THnsNH%252buZY0%253d%26risl%3d%26pid%3dImgRaw%26r%3d0&exph=1080&expw=1920&q=%e7%b2%be%e7%be%8e%e5%a3%81%e7%ba%b8&simid=608041651648332714&FORM=IRPRST&ck=912A8F3A94487DA462B2C2764AC15A4A&selectedIndex=0&ajaxhist=0&ajaxserp=0;
}
}
}
7.3 uri——>uri——>uri
1.修改圖片地址。
2.修改配置文件。
http {
server {
listen 80;
server_name www.qingjun.com;
location /img {
root /opt;
rewrite ^/img/(.*\.jpg)$ /image/$1 last;
}
location /image {
root /opt;
rewrite ^/image/(.*\.jpg)$ /images/$1 last;
}
}
}
3.重啟服務(wù),訪問網(wǎng)頁。
八、if判斷
語法 | 應(yīng)用場景 |
---|---|
if (condition) {…} | server段、location段 |
condition類型 | 釋義 |
---|---|
變量 | 變量值為空串,或者以“0”開始,則為false,其它的均為true |
以變量為操作數(shù)構(gòu)成的比較表達(dá)式 | 可使用=,!=類似的比較操作符進(jìn)行測試 |
正則表達(dá)式的模式匹配操作 | ~:區(qū)分大小寫的模式匹配檢查。 ~:不區(qū)分大小寫的模式匹配檢查。 !~和!~:對上面兩種測試取反 |
測試指定路徑為文件的可能性 | -f,!-f |
測試指定路徑為目錄的可能性 | -d,!-d |
測試文件的存在性 | -e,!-e |
檢查文件是否有執(zhí)行權(quán)限 | -x,!-x |
8.1 瀏覽器分離
http {
server {
listen 80;
server_name www.qingjun.com;
if ($http_user_agent ~ firefox) {
rewrite ^(.*)$ /firefox/$1 break;
}
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_user_agent ~ Chrome) {
rewrite ^(.*)$ /chrome/$1 break;
}
location / {
root html;
index index.html;
}
}
}
8.2 防盜鏈
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referers none blocked www.idfsoft.com;
if ($invalid_referer) {
rewrite ^/ http://www.idfsoft.com/403.html;
}
}
九、反向代理與負(fù)載均衡
- nginx實(shí)現(xiàn)動(dòng)靜分離。在反向代理的時(shí)候,若是靜態(tài)資源,就直接從nginx發(fā)布的路徑去讀取,而不需要從后臺服務(wù)器獲取了。但是這種情況下需要保證后端和前端程序一致,可以使用Rsync做服務(wù)端自動(dòng)同步或者使用NFS、MFS分布式共享存儲。
- 常用模塊是proxy_pass和proxy_cache。模塊使用都時(shí)需要編譯進(jìn)nginx的。
9.1 基本了解
- nginx通過upstream模塊來實(shí)現(xiàn)簡單的負(fù)載均衡,upstream需要定義在http段內(nèi)。
- 在upstream段內(nèi),定義一個(gè)服務(wù)器列表,默認(rèn)方式是輪詢。
1.第一步。若要確定同一個(gè)訪問者發(fā)出的請求總是由同一個(gè)后端服務(wù)器來處理,可以設(shè)置ip_hash,如下配置:
//注意:這個(gè)方法本質(zhì)還是輪詢,而且由于客戶端的ip可能是不斷變化的,比如動(dòng)態(tài)ip,代理,翻墻等,因此ip_hash并不能完全保證同一個(gè)客戶端總是由同一個(gè)服務(wù)器來處理。
upstream www.qingjun.com {
ip_hash;
server 127.0.0.1:9080 weight=5;
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:1111;
}
2.第二步。定義好upstream后,需要在server段內(nèi)添加如下內(nèi)容:
server {
location / {
proxy_pass http://www.qingjun.com;
}
}
9.2 示例
主機(jī) | IP | 安裝的服務(wù) |
---|---|---|
lb | 192.168.161.129 | nginx |
RS1 | 192.168.161.131 | httpd |
RS2 | 192.168.161.132 | httpd |
1.在RS1和RS2上安裝服務(wù)。
//RS1
yum -y install httpd
echo 'RS1' > /var/www/html/index.html
systemctl start httpd
//RS2
yum -y install httpd
echo 'RS2' > /var/www/html/index.html
systemctl start httpd
2.配置nginx負(fù)載均衡。
http {
upstream www.runtime.com { //這個(gè)名稱需要與下面的location名稱一致。
server 192.168.161.131; //負(fù)載哪個(gè)后端服務(wù)。
server 192.168.161.132;
}
server {
listen 80;
server_name www.qingjun.com;
location / {
proxy_pass http://www.runtime.com; //固定寫法,只需要修改名稱即可。
}
}
}
3.設(shè)置權(quán)重訪問。
http {
upstream www.runtime.com {
server 192.168.161.131 weight=3; //添加weight=3意味著訪問3次,不設(shè)置則默認(rèn)訪問1次。
server 192.168.161.132;
}
server {
listen 80;
server_name www.qingjun.com;
location / {
proxy_pass http://www.runtime.com;
}
}
}
4.設(shè)置始終要同一個(gè)后端服務(wù)器處理請求。訪問顯示是隨機(jī)的,之后一致是該服務(wù)器處理請求。(存在瑕疵,慎用)文章來源:http://www.zghlxwxcb.cn/news/detail-602627.html
http {
upstream www.runtime.com {
ip_hash;
server 192.168.161.131;
server 192.168.161.132;
}
server {
listen 80;
server_name www.qingjun.com;
location / {
proxy_pass http://www.runtime.com;
}
}
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-602627.html
到了這里,關(guān)于nginx基礎(chǔ)3——配置文件詳解(實(shí)用功能篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!