1、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
2、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服務
第三步:在客戶端上進行訪問測試