Linux三階段之八:架構nginx實踐應用

来源:https://www.cnblogs.com/cuiyongchao007/archive/2020/05/01/12814907.html
-Advertisement-
Play Games

八、架構nginx實踐應用 (一)web服務軟體種類介紹 常用來提供靜態Web服務的軟體有如下三種: 常用來提供動態服務的軟體 (二)nginx軟體服務介紹 (三)nginx軟體特征介紹 (四)nginx軟體功能介紹 (五)nginx軟體模型特點說明 (六)nginx軟體編譯安裝 第一個裡程:軟體依 ...


八、架構nginx實踐應用

(一)web服務軟體種類介紹

常用來提供靜態Web服務的軟體有如下三種:

1	Apache:  
這是中小型Web服務的主流,Web伺服器中的老大哥。
2	Nginx:   
大型網站Web服務的主流,曾經Web伺服器中的初生牛犢,現已長大。
Nginx的分支Tengine(http://tengine.taobao.org/)目前也在飛速發展。
3	Lighttpd:
這是一個不溫不火的優秀Web軟體,社區不活躍,靜態解析效率很高。
在Nginx流行前,它是大併發靜態業務的首選,國內百度貼吧、豆瓣等眾多網站都有Lighttpd奮鬥的身影。

常用來提供動態服務的軟體

1	PHP(FastCGI):
大中小型網站都會使用,動態網頁語言PHP程式的解析容器。
它可配合Apache解析動態程式,不過,這裡的PHP不是FastCGI守護進程模式,而是mod_php5.so(module)。
也可配合Nginx解析動態程式,此時的PHP常用FastCGI守護進程模式提供服務。
2	Tomcat:
中小企業動態Web服務主流,互聯網Java容器主流(如jsp、do)。
3	Resin:
大型動態Web服務主流,互聯網Java容器主流(如jsp、do)。

(二)nginx軟體服務介紹

如果你聽說或使用過Apache軟體,那麼很快就會熟悉Nginx軟體,與Apache軟體類似,
Nginx(“engine x”)是一個開源的,支持高性能、高併發的WWW伺服器和代理服務軟體。
它是由俄羅斯人lgor Sysoev開發的,最初被應用在俄羅斯的大型網站www.rambler.ru上。
後來作者將源代碼以類BSD許可證的形式開源出來供全球使用。
Nginx可以運行在UNIX、Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系統中

(三)nginx軟體特征介紹

 支持高併發:能支持幾萬併發連接(特別是靜態小文件業務環境)
 資源消耗少:在3萬併發連接下,開啟10個Nginx線程消耗的記憶體不到200MB
 支持非同步網路I/O事件模型epoll(Linux 2.6+) apache(select)

(四)nginx軟體功能介紹

1)作為Web服務軟體(處理用戶訪問靜態請求)
2)反向代理或負載均衡服務
3)前端業務數據緩存服務

(五)nginx軟體模型特點說明

apache與nginx軟體對比說明:
apache使用select模型
nginx使用epoll模型
舉例說明:宿舍管理員
select模型版管理員  會一個一個房間查詢人員
epoll模型版管理員   會進行檢索後,直接找到需要找的人
舉例說明:幼兒園阿姨
select模型版阿姨    會一個一個小朋友進行詢問,確認哪個小朋友需要上廁所
epoll模型版阿姨     會告知想上廁所小朋友自覺站到響應位置

(六)nginx軟體編譯安裝

第一個裡程:軟體依賴包安裝

pcre-devel:   perl語言正則表達式相容軟體包
openssl-devel:使系統支持https方式訪問
yum install -y pcre-devel openssl-devel

第二個裡程:創建一個管理nginx進程的虛擬用戶

useradd www -s /sbin/nologin/ -M

第三個裡程:下載並解壓nginx軟體

cd /server/tools
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar xf nginx-1.12.2.tar.gz 

第四個裡程:進行軟體編譯安裝

①. 編譯配置
./configure --prefix=/application/nginx-12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
--prefix=PATH     指定軟體安裝在什麼目錄下
--user=USER       指定軟體worker進程管理用戶,利用www虛擬用戶管理worker進程
--group=USER 
--with-http_ssl_module           使nginx程式可以支持HTTPsF訪問功能
--with-http_stub_status_module	 用於監控用戶訪問nginx服務情況	
②. 編譯過程 make
③. 編譯安裝 make install

第五個裡程:為nginx程式軟體創建鏈接目錄

ln -s /application/nginx-12.2 /application/nginx	

第六個裡程:啟動nginx程式服務

/application/nginx/sbin/nginx

(七)nginx軟體程式目錄結構

conf     --- nginx程式所有配置文件保存目錄
nginx.conf   nginx程式主配置文件
精簡nginx.conf配置文件內容:
grep -Ev "#|^$" nginx.conf.default >nginx.conf

nginx配置文件組成:
①. main       nginx主區塊
②. event      nginx事件區塊
③. http       nginx http功能區塊
④. server     nginx 網站主機區塊
⑤. location   nginx 匹配或者定位區塊

html	 --- nginx程式站點目錄
logs     --- nginx程式日誌文件保存目錄
sbin     --- nginx程式命令所在目錄
nginx命令參數說明:
-V       --- 查看nginx軟體編譯配置參數
-t       --- 檢查nginx配置文件語法格式是否正確
-s       --- 用於管理nginx服務運行狀態
stop   停止nginx服務
reload 平滑重啟nginx伺服器
重啟nginx服務
nginx -s stop  先停止 
nginx          再啟動

(八)編寫nginx服務配置

三個語法格式說明:
①. 大括弧要成對出現
②. 每一行指令後面要用分號結尾
③. 每一個指令要放置在指定的區塊中

實現編寫一個網站頁面
worker_processes  1;
events {#事件區塊
worker_connections  1024;
}
http {#http功能區塊
include       mime.types;
default_type  application/octet-stream;
sendfile        on;
keepalive_timeout  65;
server {#網站主機區塊
listen       80;
server_name  www.etiantian.org;
location / {#匹配定位區塊
root   html/www;#程式的站點目錄
index  index.html index.htm;
}
}
}

實現編寫多個網站頁面==編寫多個虛擬主機(等於一個網站)

第一個裡程編寫配置文件:

  server {
    listen       80;
    server_name  www.etiantian.org;
    location / {
        root   html/www;
        index  index.html index.htm;
    }
    }
    server {
        listen       80;
        server_name  bbs.etiantian.org;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
    }
    server {
        listen       80;
        server_name  blog.etiantian.org;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
    }

第二個裡程創建站點目錄:

mkdir -p /application/nginx/html/{www,bbs,blog}

第三個裡程創建站點目錄下首頁文件:

for name in www bbs blog;do echo "10.0.0.7 $name.etiantian.org" >/application/nginx/html/$name/index.html;done
for name in www bbs blog;do cat /application/nginx/html/$name/index.html;done
10.0.0.7 www.etiantian.org
10.0.0.7 bbs.etiantian.org
10.0.0.7 blog.etiantian.org

第四個裡程:進行訪問測試

瀏覽器訪問測試:
註意:需要編寫windows主機hosts文件,進行解析
命令行訪問測試:
利用curl命令在linux系統中訪問測試
註意:需要編寫linux主機hosts文件,進行解析

虛擬主機配置文件編寫方法:
①. 基於功能變數名稱的虛擬主機配置方法(最常用)
②. 基於埠的虛擬主機配置方法
說明:當你訪問的網站功能變數名稱在虛擬主機配置中不存在時,預設會將第一個虛擬主機的配置頁面響應給用戶
③. 基於IP地址的虛擬主機配置方法
說明:nginx服務中只要涉及IP地址的修改,都需要重啟nginx服務,而不能採用平滑重啟

(九)Nginx服務日誌信息

錯誤日誌 訪問日誌

1.錯誤日誌

  Syntax:	error_log file [level];
   Default:	
   error_log logs/error.log error;
   Context:	main, http, mail, stream, server, location
   #error_log  logs/error.log;
   #error_log  logs/error.log  notice;
   #error_log  logs/error.log  info;
   
   vim nginx.conf
   error_log  /tmp/error.log error;
   
   補充說明:
   ===========================================================================================
   錯誤日誌的,預設情況下不指定也沒有關係,因為nginx很少有錯誤日誌記錄的。
   但有時出現問題時,是有必要記錄一下錯誤日誌的,方便我們排查問題。
   error_log 級別分為 debug, info, notice, warn, error, crit  預設為crit 
   該級別在日誌名後邊定義格式如下:
   error_log  /your/path/error.log crit;  
   
   crit 記錄的日誌最少,而debug記錄的日誌最多。
   如果nginx遇到一些問題,比如502比較頻繁出現,但是看預設的error_log並沒有看到有意義的信息,
   那麼就可以調一下錯誤日誌的級別,當你調成error級別時,錯誤日誌記錄的內容會更加豐富
   ===========================================================================================

2.訪問日誌(重點關註)

   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;    --- 調用定義格式信息,生成訪問日誌
   $remote_addr       10.0.0.1           --- 訪問客戶端的源地址信息
   $remote_user          -               --- 訪問客戶端認證用戶信息   ???
   [$time_local]                         --- 顯示訪問時間
   $request        GET / HTTP/1.1        --- 請求行信息
   $status              304              --- 狀態碼信息(304狀態碼利用緩存顯示頁面信息)
   $body_bytes_sent                      --- 服務端響應客戶端的數據大小信息
   $http_referer                         --- 記錄鏈接到網站的功能變數名稱信息  ???
   $http_user_agent                      --- 用戶訪問網站客戶端軟體標識信息
                                             用戶利用客戶端瀏覽器測試訪問時,win10預設瀏覽器會有異常問
   $http_x_forwarded_for                 --- ???  反向代理
   官方鏈接:http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log
  1. 日誌要進行切割

    01. 利用shell腳本實現日誌切割
    [root@web01 scripts]# vim cut_log.sh
    #!/bin/bash
    
    data_info=$(date +%F-%H:%M)
    
    mv /application/nginx/logs/www_access.log /application/nginx/logs/access.log.$data_info
    /application/nginx/sbin/nginx -s reload
    
    # cut nginx log cron
    * */6 * * * /bin/sh /server/scripts/cut_log.sh &>/dev/null
    

(十)Nginx服務location區塊說明

利用location區塊可以用於定位或者匹配網站資源信息
企業需求解決
搭建好一臺nginx的web伺服器。配置好內網卡地址與外網卡地址
web服務的網站功能變數名稱為www.etiantian.org,站點目錄為html/www
要求內網用戶可以訪問網站http://www.etiantian.org/AV資源信息
要求外網用戶禁止訪問網站http://www.etiantian.org/AV資源信息

①. 如何利用nginx進行訪問控制

   deny allow
   ngx_http_access_module    --- 實現訪問控制模塊
   官方鏈接:nginx.org/en/docs/http/ngx_http_access_module.html
   location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
    }

②. 如何定位站點目錄資源信息

   location區塊進行定位站點目錄下資源信息
   Syntax: 	location [ = | ~ | ~* | ^~ ] uri { ... }
   location @name { ... }
   Default: 	—
   Context: 	server, location
   官方鏈接:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
   

第一個裡程:編寫nginx配置文件

   server {
        listen       80;
        server_name  www.etiantian.org;
        root   html/www;
        index  index.html index.htm;
        location /AV {
           allow   172.16.1.0/24;
           deny    10.0.0.0/24;
        }
    } 

第二個裡程:創建測試訪問資源

mkdir AV
echo "AV info" >AV/oldboy.html
cat AV/oldboy.html 

第三個裡程:重啟nginx服務

/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload

location [ = | ~ | ~* | ^~ ] uri { ... }
=     --- 精確匹配網站uri資源信息
~     --- 區分大小寫匹配網站uri資源信息
~*    --- 不區分大小寫匹配網站uri資源信息
^~    --- 優先匹配網站uri資源信息
/AV/  --- 指定匹配網站資源目錄信息
/     --- 預設匹配網站資源信息
!     --- 對匹配的內容進行取反

location = / {
[ configuration A ]       --- 優先順序最高 ①
}

location / {                  --- 所有匹配都不滿足時候,匹配預設location ④
[ configuration B ]
}

location /documents/ {        --- 根據資源目錄進行匹配         ③
[ configuration C ]
}

location ^~ /images/ {        --- 優先匹配 ②
[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {  --- 不區分大小寫匹配網站資源  ③
[ configuration E ]
}

(十一)Nginx服務rewrite模塊功能說明

01. 實現功能變數名稱地址信息跳轉
02. 用於做偽靜態
www.etiantian.org/oldboy?edu.html   ---動態資源
www.etiantian.org/oldboy-edu.html   ---偽靜態

實現類似百度重寫功能變數名稱的功能?
baidu.com  ===>  www.baidu.com
etiantian.org  ===> www.etiantian.org

rewrite 
Syntax: 	rewrite regex replacement [flag];
Default: 	—
Context: 	server, location, if

last
stops processing the current set of ngx_http_rewrite_module directives and starts a search for a new location matching the changed URI; 
break
stops processing the current set of ngx_http_rewrite_module directives as with the break directive; 
redirect
returns a temporary redirect with the 302 code; used if a replacement string does not start with “http://”, “https://”, or “$scheme”; 
permanent
returns a permanent redirect with the 301 code. 



rewrite指令實踐操作一:(錯誤)
[root@web01 extra]# cat bbs.conf 
server {
listen       80;
server_name  www.etiantian.org bbs.org;
rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
root   html/bbs;
index  index.html index.htm;
}

[root@web01 extra]# curl -L etiantian.org 
curl: (47) Maximum (50) redirects followed
[root@web01 extra]# curl -Lv etiantian.org   --- 顯示無限迴圈過程
說明:以上配置進入了無限迴圈狀態

rewrite指令實踐操作二:(正確)
cat bbs.conf 
server {
listen 80;
server_name etiantian.org;
rewrite ^/(.*) http://bbs.etiantian.org/$1 permanent;
}
server {
listen       80;
server_name  bbs.etiantian.org ;
root   html/bbs;
index  index.html index.htm;
}

rewrite指令實踐操作三:(正確)
[root@web01 extra]# cat bbs.conf 
server {
listen       80;
server_name  bbs.etiantian.org ;
if ($host ~* "^etiantian.org$") {
rewrite ^/(.*) http://bbs.etiantian.org/$1 permanent;
}
root   html/bbs;
index  index.html index.htm;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如果你經常看開源項目的源碼,你會發現很多Dispose方法中都有這麼一句代碼: ,看過一兩次可能無所謂,看多了就來了興趣,這篇就跟大家聊一聊。 一:背景 1. 在哪發現的 相信現在Mysql在.Net領域中鋪的面越來越廣了,C 對接MySql的MySql.Data類庫的代碼大家可以研究研究,幾乎所有 ...
  • 前言 今天 .NET 官方博客宣佈 C 9 Source Generators 第一個預覽版發佈,這是一個用戶已經喊了快 5 年特性,今天終於發佈了。 簡介 Source Generators 顧名思義代碼生成器,它允許開發者在代碼編譯過程中獲取查看用戶代碼並且生成新的 C 代碼參與編譯過程,並且可 ...
  • 1、前言 面向對象設計(OOD)里有一個重要的思想就是依賴倒置原則(DIP),並由該原則牽引出依賴註入(DI)、控制反轉(IOC)及其容器等概念。在學習Core依賴註入、服務生命周期之前,下麵讓我們先瞭解下依賴倒置原則(DIP)、依賴註入(DI)、控制反轉(IOC)等概念,然後再深入學習Core依賴 ...
  • 參考文檔 https://www.cnblogs.com/htsboke/p/10956807.html https://www.cnblogs.com/lenmom/p/8510572.html 在WebApi項目中使用AutoFac,結構如下: 首先在Api項目當中引用AutoFac包,如下圖所 ...
  • 前言 不知道你平時是否關註程式記憶體使用情況,我是關註的比較少,正好藉著優化本地一個程式的空對比了一下.Net平臺垃圾回收和jvm垃圾回收,順便用dotMemory看了程式運行後的記憶體快照,生成記憶體快照後,媽媽再也不擔心我優化程式找不到方向了。 .Net平臺垃圾回收 記憶體優化 憑空想象這些概念多少會索 ...
  • 博客當筆記系列. 收錄各種資源 前言 總的來說, Blazor 是一個很新鮮的事物. 它的最大特點是極大地加速了UI的開發效率. 然而, 要活用Blazor的話, 比MVC要難一個等級, 畢竟MVC是輸出靜態HTML, 好理解. Blazor是生成更動態的界面. 這表示Blazor需要一個更長的學習 ...
  • 最近完善自己的項目中,將很多原先的framework下的類庫都轉為.net standard類庫,服務自然也往.netCore上轉.因此,寫了一個WebApi做為服務來完善自己的類庫程式. 在我的程式體系中中有一部分的方式是要客戶端傳送Sql到服務端,服務端返回DataSet到客戶端進行處理,WCF ...
  • 前言 本文主要講的是Asp.Net Core的啟動過程,幫助大家掌握應用程式的關鍵配置點。 1、創建項目 1.1、用Visual Studio 2019 創建WebApi項目。 這裡面可以看到有兩個關鍵的類。 一個Program,一個stsrtup Program裡面有一個Main函數,Main函數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...