Nginx執行控制虛擬主機和訪問控制

茄子啊發表於2020-11-29

一、Nginx服務概述

一款高效能、輕量級Web服務軟體

  • 穩定性高
  • 系統資源消耗低
  • 對HTTP併發連線的處理能力高
    單臺物理伺服器可支援30 000 ~ 50000個併發請求
  • 佔用記憶體少,併發能力強

二、Nginx安裝

1.解壓跨平臺元件包和原始碼包
將跨平臺元件包移動到原始碼包/opt目錄下
nginx-1.12.2.tar.gz

[root@server ~]# cd /opt
[root@server opt]# tar xzvf nginx-1.12.2.tar.gz

2.安裝編譯器和其他工具

[root@server opt]# yum -y install gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perl \
zlib-devel \
pcre

3.configure配置

[root@server opt]# cd nginx-1.12.2
[root@server nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

4.編譯安裝

[root@server ~]# make && make install

為了使Nginx伺服器的執行更加方便,可以為主程式nginx建立連結檔案,以便管理員直接執行“nginx”命令就可以呼叫Nginx的主程式

[root@server ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

6.建立執行使用者,組

[root@server ~]# useradd -M -s /sbin/nologin nginx

7.開啟nginx,關閉防火牆

[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# nginx
[root@localhost ~]# netstat -ntap |grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5396/nginx: master  
tcp        0      0 192.168.197.192:56680   192.168.100.3:445       ESTABLISHED  

三、Nginx的執行控制

檢查配置檔案

[root@localhost ~]# nginx -t		//配置檔案語法檢查

啟動,停止Nginx

[root@localhost ~]# nginx		//啟動服務
[root@localhost ~]# killall -1 nginx	//安全重啟	killall -s HUP nginx
[root@localhost ~]# killall -3 nginx	//停止服務	killall -s QUIT nginx

使用Nginx服務指令碼
為了使Nginx服務的啟動,停止,過載等操作更加方便,可以編寫Nginx服務指令碼,並使用chkconfig和service工具來進行管理,也更加符合RHEL系統的管理習慣。

[root@localhost ~]# vi /etc/init.d/nginx
#!/bin/bash
# chkconfig: 35 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
   start)
     $PROG
     ;;
   stop)
     kill -s QUIT $(cat $PIDF)
     ;;
   restart)
     $0 stop
     $0 start
     ;;
   reload)
     kill -s HUP $(cat $PIDF)
     ;;
   *)
     echo "Usage: $0 {start|stop|restart|relad}"
     exit 1
esac
exit 0

[root@localhost ~]# chmod +x /etc/init.d/nginx
[root@localhost ~]# chkconfig --add nginx
[root@localhost ~]# chkconfig --level 35 nginx on

這樣一來,就可以通過Nginx指令碼來啟動,停止,重啟,過載Nginx伺服器了,方法是在執行時新增相應的start,stop,restart,reload引數。

四、配置檔案nginx.conf

在Nginx伺服器的主配置檔案/usr/local/nginx/conf/nginx.conf中,包括全域性配置,I/O事件配置和HTTP配置這三大塊內容,配置語句的格式為“關鍵字 值;”(末尾以分號表示結束),以“#”開始的部分表示註釋

1.全域性配置

由各種配置語句組成,不使用特定的界定標記,全域性配置部分包括Nginx服務的執行使用者,工作程式數,錯誤日誌,PID存放位置等基本設定。

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
#user  nobody;			//執行使用者
worker_processes  1;		//工作程式數
#error_log  logs/error.log;	//錯誤日誌檔案的位置
#pid        logs/nginx.pid;		//PID檔案的位置

上述配置中,worker_processes表示工作程式數。若伺服器有多塊CPU或者使用多核處理器,可以參考CPU核心總數來指定工作程式數,如設為8;如果網站訪問量需求不大,一般設為1就夠用了。其他三項均已有註釋,表示採用預設設定,例如,Nginx的執行使用者實際是編譯時指定的nginx,若編譯時未指定則預設為nobody。

2.I/O事件配置

使用“events{ }” 界定標記,用來指定Nginx程式的I/O響應模型,每個程式的連線數等設定。對於2.6及以上版本的核心,建議使用epoll模型以提高效能;每個程式的連線數應根據實際需要來定,一般在10000以下(預設為1024)

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
events {
    use epoll;					//使用epoll模型
    worker_connections  4096;		//每程式處理4096個連線
}

若工作程式數為8,每個程式處理4096個連線,則允許Nginx正常提供服務的連線數已超過3萬個,(4096✖8=32768),當然具體還要看伺服器硬體,網路頻寬等物理條件的效能表現。

3.HTTP配置

使用“http { }” 界定標記,包括訪問日誌,HTTP埠,網頁目錄,預設字符集,連結保持,以及後面要講到的Web主機,PHP解析等一系列設定,其中大部分配置語句都包含在子界定標記“server { }”內。

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
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;
    #keepalive_timeout  0;
    keepalive_timeout  65;				//連線保持超時
    #gzip  on;
server {							//Web服務的監聽配置
        listen       80;					//監聽地址及埠
        server_name  localhost;			//網站名稱(FQDN)
        charset utf-8;					//網頁的預設字符集
        access_log  logs/host.access.log  main;
        location / {					//根目錄配置
            root   html;					//網站根目錄的位置
            index  index.html index.htm;	//預設首頁(索引頁)
        }
error_page   500 502 503 504  /50x.html;		//內部錯誤的反饋頁面
        location = /50x.html {					//錯誤頁面配置
            root   html;
        }
}
}

上述配置中,listen語句允許同時限定IP地址,採用“IP地址:埠”形式;root語句用來設定特定訪問位置(如“location /" 表示根目錄)的網頁文件路徑,預設為Nginx安裝目錄下的html/子目錄,根據需要可改為/var/www/html等其他路徑。

4.訪問狀態統計

ginx內建了HTTP_STUB_STATUS狀態統計模組,用來反饋當前的Web訪問情況,配置編譯引數時可新增–with-http_stub_status_module來啟用此模組支援,可使用命令/usr/local/nginx/sbin/nginx -V 來檢視以安裝的Nginx是否包含HTTP_STUB_STATUS模組。

要使用Nginx的狀態統計功能,除了啟用內建模組以外,還需要修改nginx.conf配置檔案,指定訪問位置並新增stub_status配置程式碼。

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
http {
 server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }
location ~ /status {			//訪問位置為/status
         stub_status on;		//開啟狀態統計功能
         access_log off;		//關閉此位置的日誌記錄
}
}

新的配置生效後,在瀏覽器中訪問Nginx伺服器的/status網路位置,可以看到當前的狀態統計資訊
active connections //活躍的連線數量
server accepts handled requests //總共處理了x個連線,成功握手y次,總共處理了z個請求
reading //讀取客戶端的連線數
writing //響應資料到客戶端的數量
waiting //已處理的請求數

五、Nginx訪問控制

  • Nginx與Apache一樣,可以實現基於使用者授權的訪問控制,當客戶端想要訪問相應的網站或者目錄時,要求使用者輸入使用者名稱和密碼才能正常訪問,配置步驟與Apache基本一致。
  • Apache網頁認證實現步驟可概括為:
    1.生成使用者密碼認證檔案
    2.修改主配置檔案相應目錄,新增認證配置項
    3.重啟服務,訪問測試

基於授權的訪問控制步驟

Nginx實現授權訪問控制的步驟如下:
1.使用htpasswd生成使用者認證檔案,如果沒有該命令,可使用yum安裝httpd-tools軟體包,用法與Apache認證時方式相同,如:htpasswd -c /usr/local/nginx/passwd.db test。

[root@server ~]# yum -y install httpd-tools
[root@server ~]# htpasswd -c /usr/local/nginx/passwd.db test
New password:			//輸入密碼
Re-type new password:		//輸入密碼
Adding password for user test
[root@server ~]# cat /usr/local/nginx/passwd.db
test:$apr1$AF325xkf$bo4A4LFFGhAPDfPSaQu6b1

在/usr/local/nginx/目錄下生成了passwd.db檔案,使用者名稱是test,密碼輸入2次。在passwd.db中生成使用者和密碼的密文

2.修改密碼檔案的許可權為400,將所有者改為nginx,設定nginx的執行使用者能夠讀取

[root@server ~]# chmod 400 /usr/local/nginx/passwd.db
[root@server ~]# chown nginx /usr/local/nginx/passwd.db

3.修改主配置檔案nginx.conf,新增相應認證配置項。

[root@server ~]# vi /etc/local/nginx/conf/nginx.conf
server {
locaion / {
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
}

4.檢測語法,重啟服務

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: [warn] 4096 worker_connections exceed open file resource limit: 1024
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server ~]# ulimit -n 65500
[root@server ~]# ulimit -n 65500 >> /etc/rc.local
[root@server ~]# systemctl restart nginx

5.用瀏覽器訪問網址,檢驗控制效果。

基於客戶端的訪問控制

1.基於客戶端的訪問控制簡介
基於客戶端的訪問控制是通過客戶端IP地址,決定是否允許對頁面訪問。Nginx基於客戶端的訪問控制要比Apache簡單,規則如下:
deny IP/IP段:拒絕某個IP或IP段的客戶端訪問。
allow IP/IP段:允許某個IP或IP段的客戶端訪問。
規則從上往下執行,如匹配則停止,不再往下匹配。
2.基於客戶端的訪問的控制步驟
Nginx實現客戶端訪問控制的步驟如下:
修改主配置檔案nginx.conf,新增相應配置項

vi /usr/local/nginx/conf/nginx.conf
server {
location / {
deny 192.168.10.1;			//客戶端IP
allow all;
}
}

Deny 192.168.10.1 表示這個IP地址訪問會被拒絕,其他IP客戶端正常訪問。
重啟伺服器訪問網址,頁面已經訪問不到(出現403錯誤)

六、Nginx虛擬主機

  • 利用虛擬主機,不用為每個要執行的網站提供一臺單獨的Nginx伺服器或單獨執行一組Nginx程式,虛擬主機提供了在同一臺伺服器,同一組Nginx程式上執行多個網站的功能。跟Apache一樣,Nginx也可以配置多種型別的虛擬主機,分別是基於IP的虛擬主機,基於域名的虛擬主機,基於埠的虛擬主機。
  • 使用Nginx搭建虛擬主機伺服器時,每個虛擬Web站點擁有獨立的:“server { }”配置段,各自監聽的IP地址,埠號可以單獨指定,當然網路名稱也是不同的。

1.基於域名的虛擬主機

1.準備各個網站的目錄和測試首頁

[root@localhost ~]# mkdir -p /var/www/html/aa.com/
[root@localhost ~]# mkdir -p /var/www/html/bb.com/
[root@localhost ~]# echo "this is aa" >>
/var/www/html/erbao/index.html
[root@localhost ~]# echo "this is bb" >>
/var/www/html/sanbao/index.html 
[root@localhost ~]# yum -y install bind
[root@localhost ~]# vim  /etc/named.conf
[root@localhost ~]# vim /etc/named.rfc1912.zones
[root@localhost ~]# cp -p /var/named/named.localhost /var/named/erbao.com.zone
[root@localhost ~]# vim /var/named/erbao.com.zone
[root@localhost ~]# cp -p /var/named/erbao.com.zone /var/named/sanbao.com.zone
[root@localhost ~]# systemctl start named

2.修改配置檔案,把配置檔案中的server { } 程式碼段全部去掉,加入2個新的server { }段,對應兩個域名

[root@server ~]# vi /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  www.aa.com;

         charset utf-8;

         access_log  logs/host.access.log  main;

        location / {
            root   /var/www/html/btcom;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
server {
        listen       80;
        server_name  www.bb.com;

         charset utf-8;

         access_log  logs/host.access.log  main;

        location / {
            root   /var/www/html/testcom;                                                              index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }


[root@server ~]# [root@server ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

3.分別訪問2個域名,檢視是否訪問到不同的頁面,測試是否成功。

2.基於IP的虛擬地址

1.一臺主機如果有多個IP地址,可以設定每一個IP對應一個站點。主機安裝多個網路卡可以有多個IP,這裡採用虛擬IP的方式使主機有多個IP
[root@server ~]# ip addr
inet 192.168.10.40/24 brd 192.168.10255 scope global ens33
目前主機有一個網路卡,IP地址是192.168.10.40。在配置一個虛擬IP為192.168.10.50。
[root@server ~]# ifconfig ens37 192.168.10.50/24
inet 192.168.10.40/24 brd 192.168.10.255 scope global ens33
inet 192.168.10.50/24 brd 192.168.10.255 scope global ens37
2.以/var/www/htmltestcom和/var/www/html/btcom為兩個站點的根目錄,修改Nginx的配置檔案,使基於IP的虛擬主機生效。這裡省略了和基於域名虛擬主機的相同配置程式碼。
vi nginx.conf
server {
listen 192.168.10.40:80;
server_name www.aa.com;
}
server {
listen 192.168.10.50:80;
server_name www.bb.com;
}
3.分別訪問2個IP地址,檢視是否訪問到不同的頁面,測試是否成功。

3.基於埠的虛擬主機

1.選擇系統中不使用的埠,將多個埠對映到同一IP地址。

vi nginx.conf
server {
listen 192.168.10.40:80;			//監聽6666埠
server_name www.aa.com;
}
server {
listen 192.168.10.50:8080;		//監聽8888埠
server_name www.bb.com;
}

2.檢測埠是否執行正常。
service nginx stop
service nginx start
netstat -anpt | grep nginx
3.分別訪問2個埠地址,檢視是否訪問到不同的頁面,測試配置是否成功。

相關文章