nginx的搭建與優化 阿新 • • 發佈:2021-08-16 一、Nginx的編譯安裝 1.1 Nginx的簡介 1.1.1 概述 Nginx(發音同"engine x")是一個高效能的反向代理和 Web伺服器軟體,最初是由俄羅斯人 Igor Sysoev開發的。Nginx 的第一個版本釋出於2004年,其原始碼基於雙條款 BSD許可證釋出,因其系統資源消耗低、執行穩定且具有高效能的併發處理能力等特性,Nginx 在網際網路企業中得到廣泛應用。Nginx 是網際網路上最受歡迎的開源 Web 伺服器之一,它不僅提供了用於開發和交付的一整套應用技術,還是應用交付領域的開源領導者。 Netcraft公司 2019年7月的統計資料表明,Nginx 為全球最繁忙網站中的25.42%提供了服務或代理,進一步擴大了其在主機域名領域的佔有量,新增 5220 萬個站點,總數達4.4億個,市場佔有率已經超過 Apache 4.89%。得益於近幾年雲端計算和微服務的快速發展,Nginx因在其中發揮了自身優勢而得到廣泛應用,且有望在未來佔有更多的市場份額。 2019年 3月,著名硬體負載均衡廠商F5宣佈收購 Nginx,Nginx成為F5的一部分。 F5表示,將加強對開源和 Nginx 應用平臺的投資,致力於Nginx 開源技術、開發人員和社群的發展,更大的投資將為開放原始碼計劃注人新的活力,會主辦更多的開放原始碼活動,併產生更多的開放原始碼內容。 1.1.2 Nginx和Apache的區別 (1)nginx相對於apache的優點∶ 輕量級,同樣起web服務,比apache佔用更少的記憶體及資源 抗併發,nginx處理請求是非同步非阻塞的,而apache是阻塞型的在高併發下,nginx能保持低資源低消耗高效能 高度模組化的設計,編寫模組相對簡單 (2)apache相對於nginx的優點∶ Rewrite比nginx的rewrite強大 (rewrite的主要功能就是實現統一資源定位符URL的跳轉) 模組多,基本想到的都可以找到 少bug, nginx的bug相對較多 超穩定 總結:一般來說,需要效能的web服務,用nginx。 若不需要效能只求穩定,就選用apache。 1.2 Nginx的編譯安裝 1.2.1 編譯安裝nginx服務的步驟(理論) 1.關閉防火牆,將安裝nginx所需軟體包傳到/opt目錄下 systemctl stop firewalld systemctl disable firewalld setenforce 0 # 將壓縮包傳入到/opt目錄下 nginx-1.12.0.tar.gz 2.安裝依賴包 #nginx的配置及執行需要pcre、zlib等軟體包的支援,因此需要安裝這些安裝的開發包,以便提供相應的庫和標頭檔案。 yum install -y pcre-devel zlib-devel gcc gcc-c++ make 3.建立執行使用者、組(Nginx 服務程式預設以 nobody 身份執行,建議為其建立專門的使用者賬號,以便更準確地控制其訪問許可權) useradd -M -s /sbin/nologin nginx 4.編譯安裝nginx cd /opt tar zxvf nginx-1.12.0.tar.gz ./configure \ > --prefix=/usr/local/nginx \ #指定nginx的安裝路徑 > --user=nginx \ #指定使用者名稱 > --group=nginx \ #指定組名 > --with-http_stub_status_module #啟用 http_stub_status_module模組以變持狀態線計 make && make install ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ ##讓系統識別nginx的操作命令 5.檢查、啟動、重啟、停止 nginx服務 nginx -t #檢查配置檔案是否配置 正確 #啟動 nginx #停止 cat /usr/local/nginx/logs/nginx.pid #先檢視nginx的PID號 kill -3 <PID號> #直接殺死 kill -s QUIT <PID號> #優雅的殺死() killall -3 nginx killall -s QUIT nginx #過載 kill -1 <PID號> kill -s HUP <PID號> killall -1 nginx killall -s HUP nginx #日誌分割,重新開啟日誌檔案 kill -USR1 <PID號> #平滑升級 kill -USR2 <PID號> 新版本升級∶ tar -zxvf nginx-1.xx.xX. tar.gz cd nginx-1.xx. xx ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module \ --with-http_ssl_module make mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old cp objs/nginx /usr/local/nginx/sbin/nginx make upgrade #或者先 killall nginx ,再/usr/local/nginx/sbin/nginx 6.新增nginx系統服務 方法一:使用指令碼 vim /etc/init.d/nginx #建立指令碼檔案內容如下: #!/bin/bash #chkconfig: - 99 20 #description:Nginx Server Control Script COM="/usr/local/nginx/sbin/nginx" PID="/usr/local/nginx/logs/nginx.pid" case "$1" in start) $COM ;; stop) kill -s QUIT $(cat $PID) ;; restart) $0 stop $0 start ;; reload) kill -s HUP $(cat $PID) ;; *) echo "Usage:$0 {start|stop|restart|reload}" exit 1 esac exit 0 chmod +x /etc/init.d/nginx chkconfig --add nginx systemctl daemon-reload #磁碟上的ngin服務更改,執行'systemctl daemon-reload'重新載入單元。 systemctl start nginx systemctl stop nginx 方法二∶ vim /lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecrReload=/bin/kill -s HUP SMAINPID ExecrStop=/bin/kill-s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target chmod 754 /lib/systemd/ system/nginx.service systemctl start nginx.service systemctl enable nginx.service 【Unit】∶服務的說明 Description∶ 描述服務 After∶依賴, 當依賴的服務啟動之後再啟動自定義的服務 【Service】服務執行引數的設定 Type=forking是後臺執行的形式,使用此啟動型別應同時指定PIDFile=,以便systemd能夠跟蹤服務的主程序。 ExecStart為服務的具體執行命令 ExecReload為重啟命令 ExecStop為停止命令 PrivateTmp=True表示給服務分配獨立的臨時空間 注意∶ 啟動、重啟、停止命令全部要求使用絕對路徑 【Install】服務安裝的相關設定,可設定為多使用者 1.2.2 編譯安裝nginx服務的步驟(實操) 第一步:關閉防火牆,將安裝nginx所需軟體包傳到/opt目錄下 1)關閉防火牆 2)傳入安裝包到/opt目錄下 第二步:安裝依賴包 第三步:建立程式使用者Nginx 第四步:編譯安裝Nginx 1)解壓Nginx軟體包 2)安裝相關模組 3)編譯安裝 4)將Nginx連結到/user/local/sbin下 第五步:檢查、啟動、重啟、停止nginx服務 1)檢查和啟動 2)關閉nginx服務 第六步:新增Nginx系統服務 1)建立指令碼檔案 2)賦予許可權 並新增到系統服務內 3)nginx啟動服務服務測試 第七步:瀏覽器訪問測試 1.3 nginx服務的主配置檔案vim vim /usr/local/nginx/conf/nginx.conf 1.全域性配置 #user nobody; #執行使用者,若編譯時未指定則預設為 nobody worker_processes 1; #工作程序數量,可配置成伺服器核心數 * 2,如果網站訪問量不大,一般設為1就夠用了 #error_log logs/error.log; #錯誤日誌檔案的位置 #pid logs/nginx.pid; #PID 檔案的位置 2.I/O事件配置 events { use epoll; #使用epoll模型,2.6及以上版本的系統核心,建議使用epoll模型以提高效能 worker_connections 4096; #每個程序處理 4096個連線 } 如提高每個程序的連線數還需執行"ulimit -n 65535"命令臨時修改本地每個程序可以同時開啟的最大檔案數。 在Linux平臺上, 在進行高併發TCP連線處理時, 最高的併發數量都要受到系統對使用者 單—一程序同時可開啟檔案數量的限制(這是因為系統為每個TCP連線都要建立一個socket控制代碼,每個socket控制代碼同時也是一個檔案控制代碼)。 可使用ulimit -a命令檢視系統允許當前使用者程序開啟的檔案數限制。 3.HTTP配置 http { include mime.types; ##副檔名與檔案型別對映表 default_type application/octet-stream; ##預設檔案型別 ##日誌格式設定 #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; #日誌格式設定 sendfile on; ##支援檔案傳送(下載) ##此選項允許或禁止使用socket的TCP cORK的選項(傳送資料包前先快取資料),此選項僅在使用sendfile的時候使用 #tcp_nopush on; ##連線保持超時時間,單位是秒 #keepalive_timeout 0; keepalive_timeout 65; #gzip on; ##gzip模組設定,設定是否開啟gzip壓縮輸出 server { listen 80; ##監聽地址及埠 server_name www.clj.com; ##站點域名,可以有多個,用空格隔開 #charset utf-8; #網頁的預設字符集 #access_log logs/host.access.log main; location / { ##根目錄配置 root html; ##網站根目錄的位置/usr/local/nginx/html index index.html index.htm; ##預設首頁檔名 } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; ##內部錯誤的反饋頁面 location = /50x.html { ##錯誤頁面配置 root html; } 日誌格式設定∶ $remote_addr與$http x forwarded for用以記錄客戶端的ip地址; $remote user∶ 用來記錄客戶端使用者名稱稱; $time local∶ 用來記錄訪問時間與時區;$request∶用來記錄請求的url與http協議; $status∶ 用來記錄請求狀態;成功是200, $body bytes sent ∶ 記錄傳送給客戶端檔案主體內容大小; $http referer∶ 用來記錄從哪個頁面連結訪問過來的; $http user agent∶記錄客戶瀏覽器的相關資訊; 通常web伺服器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,通過Sremote_add拿到的IP地址是反向代理伺服器的iP地址。反向代理伺服器在轉發請求的http頭資訊中,可以增加x_forwarded_for資訊,用以記錄原有客戶端的IP地址和原來客戶端的請求的伺服器地址。 location常見配置指令, root、alias、proxy_ pass root (根路徑配置)∶ 請求ww.clj.com/test/1.jpg,會返回檔案/usr/local/nginx/html/test/1.jpg alias (別名配置)∶請求www.clj.com/test/1.jpg,會返回檔案/usr/local/nginx/html/1.jpg proxy_pass (反向代理配置)∶ proxy_pass http://127.0.0.1:8080/; ------------- 會轉發請求到http∶//127.0.0.1∶8080/1.jpg proxy_pass http://127.0.0.1:8080; --------------會轉發請求到http∶//127.0.0.1∶8080/test/1.jpg 二、Nginx的核心配置指令 2.1 訪問狀態統計配置 2.1.1 訪問狀態統計配置的步驟(理論) 1.先使用命令/usr/local/nginx/sbin/nginx -V檢視已安裝的 Nginx 是否包含HTTP_STUB STATUS模組 2.修改 nginx.conf 配置檔案,指定訪問位置並新增 stub_status 配置(修改之前進行備份) cd /usr/local/nginx/conf/ cp nginx.conf nginx.conf.bak vim nginx.conf server { listen 80; server_name www.clj.com; charset utf-8; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } ##新增 stub_status 配置 location /status { ##訪問位置為/status stub_status on; ##開啟狀態統計功能 access_log off; ##關閉此位置的日誌記錄 } 3.重啟服務,訪問測試 systemctl restart nginx.service 瀏覽器訪問 http;//192.168.80.78/status Active connections ∶ 表示當前的活動連線數; server accepts handled requests∶表示已經處理的連線資訊,三個數字依次表示已處理的連線數、成功的TCP握手次數已處理的請求數。 可curl -s http∶//192.168.80.10/status 結合 awk與if 語句進行效能監控。 2.1.2 訪問狀態統計配置的步驟(實操) 第一步:使用命令/usr/local/nginx/sbin/nginx -V檢視已安裝的 Nginx 是否包含HTTP_STUB STATUS模組 第二步:修改主配置檔案 第三步:重啟服務後進行訪問測試 2.2 基於授權的訪問控制 2.2.1 基於授權的訪問控制步驟(理論) 1.生成使用者密碼認證檔案 yum install -y httpd-tools htpasswd -c /usr/local/nginx/passwd.db zhangsan chown nginx /usr/local/nginx/passwd.db chmod 400 /usr/local/nginx/passwd.db 2.修改主配置檔案相應的目錄,新增認真配置 vim /usr/local/nginx/conf/nginx.conf location / { root html; index index.html index.htm; #新增認證配置 auth_basic "secret"; #設定密碼提示框文字資訊 auth_basic_user_file /usr/local/nginx/passwd.db; } 3.重啟服務,訪問測試 nginx -t systemctl restart nginx.service 瀏覽器訪問 http∶//192.168.80.78 2.2.1 基於授權的訪問控制步驟(實操) 第一步:生成使用者密碼認證檔案 第二步:修改主配置檔案相應的目錄,新增認證配置 vim /usr/local/nginx/conf/nginx.conf 第三步:重啟服務,訪問測試 1)檢查配置,然後重新nginx服務 2)瀏覽器中訪問測試 2.3 基於客戶端訪問控制 2.3.1 基於客戶端的訪問控制步驟(理論) 訪問控制規則如下: deny IP/IP段:拒絕某個IP或IP段的客戶端訪問。 allow IP/IP段:允許某個IP或IP段的客戶端訪問。 規則從上往下執行,如果匹配到則停止,不會再往下繼續匹配。 vim /usr/local/nginx/conf/nginx.conf location / { root html; index index.html index.htm; auth_basic "secret"; auth_basic_user_file /usr/local/nginx/passwd.db; # 新增控制規則 deny 192.168.153.20; #拒絕訪問的客戶端IP allow all; #允許其他所有客戶端訪問 } systemctl restart nginx.service 2.3.1 基於客戶端的訪問控制步驟(實操) 第一步:在主配置檔案新增控制規則 第二步:重啟服務,然後訪問測試 1)重啟nginx服務 2)使用被拒絕的客戶端進行訪問測試:被拒絕訪問 3)使用其他客戶端進行訪問測試:可以正常訪問 (需要輸入密碼就可以) 2.4 基於域名的nginx虛擬主機 2.4.1 基於域名的nginx虛擬主機操作步驟(理論) 1.為虛擬主機提供域名和IP的對映 echo "192.168.153.30 www.nj.com www.kgc.com" >> /etc/hosts 2.為虛擬主機準備網頁文件 mkdir -p /var/www/html/nj/ mkdir -p /var/www/html/kgc/ echo "<h1>www.nj.com</h1>" > /var/www/html/nj/index.html echo "<h1>www.kgc.com</h1>" > /var/www/html/kgc/index.html 3.修改nginx主配置檔案 vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name www.bxb.com; #設定域名 charset utf-8; #設定網頁字符集 access_log logs/bxb.com.access.log; #設定日誌名 location / { root /var/www/html/bxb; #設定www.bxb.com的工作目錄 index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 80; server_name www.clj.com; #設定域名 charset utf-8; #設定網頁字符集 access_log logs/clj.com.access.log; #設定日誌名 location / { root /var/www/html/clj; #設定www.bxb.com的工作目錄 index index.html index.htm; } 4.重啟nginx後進行訪問測試 systemctl restart nginx.service 瀏覽器訪問http://www.clj.com 瀏覽器訪問http://www.bxb.com 2.4.2 基於域名的nginx虛擬主機操作步驟(實操) 第一步:為虛擬主機提供域名和IP的對映(也可以做DNS域名解析) 第二步:為虛擬主機準備網頁文件 第三步:修改主配置檔案 1)還原只配置檔案(之前做過訪問控制,所以我這邊直接將備份的配置進行還原了) 2)修改主配置檔案如下: 3)重新啟動nginx後進行訪問測試 2.5 基於IP的nginx虛擬主機 2.5.1 基於IP的nginx虛擬主機操作步驟(理論) 1.新增虛擬網絡卡,修改主配置檔案 ifconfig ens33:1 192.168.153.40/24 vim /usr/local/nginx/conf/nginx.conf server { listen 192.168.80.78:80; #修改監聽的為ip server_name www.bxb.com; charset utf-8; access_log logs/bxb.com.access.log; location / { root /var/www/html/bxb; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 192.168.80.88:80; #修改監聽的為ip server_name www.clj.com; charset utf-8; access_log logs/clj.com.access.log; location / { root /var/www/html/clj; index index.html index.htm; } 2.檢查配置檔案,重啟服務 nginx -t systemctl restart nginx.service 3.客戶端上訪問測試 瀏覽器訪問http://192.168.153.30 瀏覽器訪問http://192.168.153.40 2.5.2 基於IP的nginx虛擬主機操作步驟(實操) 第一步:新增虛擬網絡卡,然後修改主配置檔案 第二步:檢查配置檔案是否有錯後重新nginx服務 第三步:在客戶端上進行訪問測試 2.6 基於埠的nginx虛擬主機 2.6.1 基於埠的nginx虛擬主機操作步驟(理論) 1.修改主配置檔案 vim /usr/local/nginx/conf/nginx.conf server { listen 192.168.80.78:666; #修改監聽的為ip的666埠 server_name www.bxb.com; charset utf-8; access_log logs/bxb.com.access.log; location / { root /var/www/html/bxb; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 192.168.80.88:888; #修改監聽的為ip的888埠 server_name www.clj.com; charset utf-8; access_log logs/clj.com.access.log; location / { root /var/www/html/clj; index index.html index.htm; } 2.檢查配置檔案,重啟服務 nginx -t systemctl restart nginx.service 3.客戶端上訪問測試 瀏覽器訪問http://192.168.153:30:666 瀏覽器訪問http://192.168.153:30:888 2.6.2 基於埠的nginx虛擬主機操作步驟(實操) 第一步:修改主配置檔案 第二步:檢查配置檔案是否有錯後重新nginx服務 第三步:在客戶端上進行訪問測試