1. 程式人生 > 其它 >Nginx搭建與相關配置

Nginx搭建與相關配置

目錄

一、Nginx簡介

1.1 概述

1.Nginx是一款高效能、輕量級Web服務軟體

2.穩定性高

3.系統資源消耗低

4.對HTTP併發連線的處理能力高,單臺物理伺服器可支援30000-50000個併發請求

1.2 Nginx與Apache的差異

Nginx Apache
基於事件 基於流程
所有請求由一個執行緒處理 單個執行緒處理單個請求
避免子程序 基於子程序
在記憶體消耗和連線方面更好 一般
效能和可伸縮性不依賴於硬體 依賴於CPU和記憶體等硬體
支援熱部署 不支援熱部署
對於靜態檔案處理更具效率 一般
在反向代理場景更具優勢 一般

二、編譯安裝Nginx服務

2.1 將nginx軟體包傳到主機/opt目錄下

2.2、安裝依賴包

yum install -y pcre-devel zlib-devel gcc gcc-c++ make    #Nginx的配置及執行需要pcre、zlib等軟體包的支援,因此需要安裝這些安裝的開發包,以便提供相應的庫和標頭檔案

2.3、新增模組編譯安裝

cd /opt
tar zxvf nginx-1.12.0.tar.gz

cd nginx-1.12.0/
./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的操作命令

2.4、建立執行使用者、組

useradd -M -s /sbin/nologin nginx       #Nginx服務程式預設以nobody身份執行,建議為其建立專門的使用者賬號,以便更準確地控制其訪問許可權

2.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

2.6、新增nginx系統服務

方法一使用shell指令碼

vim /etc/init.d/nginx           #系統服務檔案下建立指令碼

#!/bin/bash
#chkconfig: 35 99 20  #指定35級別開機自啟動 第99個開啟 第20個關閉
#description:Nginx Server Control Script
COM="/usr/local/nginx/sbin/nginx"     #指定命令路徑
PID="/usr/local/nginx/logs/nginx.pid" #指定pid檔案
case "$1" in #case語句編寫
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

方法二:編寫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 daemon-reload
systemctl start nginx.service
systemctl enable nginx.service
注:
1.【Unit】∶服務的說明 Description∶ 描述服務 After∶依賴, 當依賴的服務啟動之後再啟動自定義的服務
2.【Service】:服務執行引數的設定
Type=forking是後臺執行的形式,使用此啟動型別應同時指定PIDFile=,以便systemd能夠跟蹤服務的主程序
ExecStart為服務的具體執行命令 ExecReload為重啟命令 ExecStop為停止命令
PrivateTmp=True表示給服務分配獨立的臨時空間 注意∶ 啟動、重啟、停止命令全部要求使用絕對路徑
【Install】:服務安裝的相關設定,可設定為多使用者

2.7、測試nginx

三、nginx服務的主配置檔案

vim /usr/local/nginx/conf/nginx.conf

3.1、全域性配置

user nobody                 #執行使用者,若編譯時未指定則預設為nobody
worker_processes 1           #工作程序數量,可配置成伺服器核心數 * 2,如果網站訪問量不大,一般設為1就夠用了
error_log logs/error.log    #錯誤日誌檔案的位置
pid logs/nginx.pid          #PID檔案的位置

3.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.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;                             #支援檔案傳送(下載)
   #tcp_nopush on;                          #此選項允許或禁止使用socket的TCP_CORK的選項(傳送資料包前先快取資料),此選項僅在使用sendfile的時候使用
#keepalive_timeout 0;
   #keepalive_timeout 65;                      #連線保持超時時間,單位是秒
#gzip on;                                #gzip模組設定,設定是否開啟gzip壓縮輸出 
server {
   listen 80;                               #監聽地址及埠
   server_name www.gxd.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.123.com/test/1.jpg,會返回檔案/usr/local/nginx/html/test/1.jpg
  alias (別名配置)∶請求www.123.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

四、訪問狀態統計配置

4.1、操作步驟

①檢查是否安裝STUB_STATUS模組

nginx -V

②修改nginx.conf配置檔案,指定訪問位置並新增stub_status配置

cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.bak
vim /usr/local/nginx/conf/nginx.conf
  ......
  http {
  ......
  server {
	listen 80;
	server_name www.gxd.com;
	charset utf-8;
	location / {
		root html;
		index index.html index.php;
	}
	##新增 stub_status 配置##
	location /status { 					#訪問位置為/status
		stub_status on; 				#開啟狀態統計功能
		access_log off; 				#關閉此位置的日誌記錄
	   }
   }
}
systemctl restart nginx.service             #重啟服務

③瀏覽器驗證

http://192.168.80.12/status 

1.Active connections ∶ 表示當前的活動連線數

2.server accepts handled requests∶表示已經處理的連線資訊,三個數字依次表示已處理的連線數、成功的TCP握手次數已處理的請求數

3.可curl -s http∶//192.168.80.12/status 結合 awk與if 語句進行效能監控

五、基於授權的訪問控制

5.1、生成使用者密碼認證檔案

yum -y install httpd-tools
htpasswd -c /usr/local/nginx/passwd.db gxd
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nginx/passwd.db 

5.2、修改主配置檔案相應的目錄,新增認證配置

vim /usr/local/nginx/conf/nginx.conf
......
server {
	location / {
		......
		##新增認證配置##
		auth_basic "secret";
		auth_basic_user_file /usr/local/ngin/passwd.db;
	}
}


nginx -t                            #驗證配置
systemctl restart nginx             #重啟服務

5.3、客戶機測試

六、基於客戶端訪問控制

6.1、配置要求

訪問控制規則如下:
  deny IP/IP段:拒絕某個IP或IP段的客戶端訪問        #黑名單
  allow IP/IP段:允許某個IP或IP段的客戶端訪問       #白名單
  規則從上往下執行,如果匹配到則停止,不會再往下繼續匹配

vim /usr/local/nginx/conf/nginx.conf
......
  server {
	location / {
		......
		##新增控制規則##
		deny 192.168.80.12; 					#拒絕訪問的客戶端 IP
		allow all;								#允許其它IP客戶端訪問
	           }
   }

systemctl restart nginx

6.2、客戶機測試

七、構建Nginx虛擬web主機

7.1、 基於域名的虛擬主機

①為虛擬主機提供域名解析

第一種:部署DNS域名解析伺服器
第二種:臨時新增
  echo "192.168.80.12 www.aaa.com www.bbb.com" >> /etc/hosts

②為虛擬主機準備網頁文件

mkdir -p /var/www/html/aaa
mkdir -p /var/www/html/bbb

echo "<h1>aaaaaaa</h1>" > /var/www/html/aaa/index.html
echo "<h1>bbbbbbb</h1>" > /var/www/html/bbb/index.html

③新增虛擬主機配置

vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
	listen 80;
	server_name www.aaa.com;					#設定域名www.aaa.com
	charset utf-8;
	access_log logs/www.aaa.access.log; 
	location / {
		root /var/www/html/aaa;				    #設定www.aaa.com 的工作目錄
		index index.html index.php;
	}
	error_page 500 502 503 504 /50x.html;
	location = 50x.html{
		root html;
	}
}

server {
	listen 80;
	server_name www.bbb.com;					#設定域名www.bbb.com
	charset utf-8;
	access_log logs/www.bbb.access.log; 
	location / {
		root /var/www/html/bbb;                 #設定www.bbb.com 的工作目錄
		index index.html index.php;
	}
	error_page 500 502 503 504 /50x.html;
	location = 50x.html{
		root html;
	}
  }	
}

④驗證配置並重啟服務

nginx -t
systemctl restart nginx

⑤客戶機測試

7.2、基於IP地址的虛擬主機

①新增一張虛擬網絡卡

ifconfig ens33:0 192.168.80.100/24   #這邊新增虛擬網絡卡

②修改配置檔案

步驟和前面類似

③驗證配置並重啟服務

nginx -t
systemctl restart nginx

④客戶機測試

7.3、基於埠的虛擬主機

①修改配置檔案

步驟一樣,只是改變埠號

②驗證配置並重啟服務

nginx -t
systemctl restart nginx

③客戶機測試