nginx基礎篇之虛擬主機實戰

叶长尧發表於2024-04-07

基於nginx部署網站

虛擬主機指的就是一個獨立的站點,具有獨立的域名,有完整的www服務,例如網站、FTP、郵件等。

Nginx支援多虛擬主機,在一臺機器上可以執行完全獨立的多個站點。

一、為什麼配置虛擬主機

一些草根流量站長,常會搭建個人站點進行資源分享交流,並且可能有多個不同業務的站點,如果每臺伺服器只執行一個網站,那麼將造成資源浪費,成本浪費。

利用虛擬主機的功能,就不用為了執行一個網站而單獨配置一個Nginx伺服器,或是單獨再執行一組Nginx程序。

虛擬主機可以在一臺伺服器,同一個Nginx程序上執行多個網站。

nginx.conf主配置檔案中,最簡單的一段虛擬主機配置如下

1.單虛擬主機(靜態資源網站)

nginx.conf

原配置檔案
[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

降低操作許可權
[root@test-88 ~]#id www
uid=666(www) gid=666(www) groups=666(www)
[root@test-88 ~]#vim /etc/nginx/nginx.conf 
[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
[root@test-88 ~]#

huoying.conf

建立虛擬主機子配置檔案

把資料放在/www/huoying/index.html
vim /etc/nginx/conf.d/huoying.conf
server{
listen 80;
# nginx 會匹配http://huoying.linux.cc:80
server_name huoying.linux.cc;
charset utf-8;

location / {
  # 根據root引數,填寫網頁根目錄資訊
  # 表示訪問http://huoying.linux.cc:80自動來這個目錄下來找資料
  root /www/huoying/;
  #預設找/www/huoying/ 的名字叫做index.html的檔案
  index index.html;
}
}

[root@test-88 ~]#vim /etc/nginx/conf.d/huoying.conf
[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;

location / {
  root /www/huoying/;
  index index.html;
}
}
[root@test-88 ~]#


# 建立網頁靜態檔案,index.html鳴人.jpg
# 部署一個靜態網站,最基本的提供,html,jpg,txt等靜態資料
# nginx都可以返回,解析請求


[root@test-88 ~]#mkdir -p /www/huoying
[root@test-88 ~]#ls /www
huoying


[root@test-88 ~]#cat > /www/huoying/index.html << EOF
> <meta charset=utf-8>
> 我是火影頁面
> EOF
[root@test-88 ~]#cat /www/huoying/index.html 
<meta charset=utf-8>
我是火影頁面
[root@test-88 ~]#


[root@test-88 ~]#cd /www/huoying
[root@test-88 /www/huoying]#wget -O 鳴人.jpg https://up.deskcity.org/pic_source/c5/8b/4f/c58b4fef1632c6dfa686815adc581c8a.jpg
[root@test-88 /www/huoying]#ls
index.html  鳴人.jpg

echo '佐助打不過鳴人' > 鳴人與佐助的秘密.txt

測試nginx配置檔案語法,然後啟動

[root@test-88 /www/huoying]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@test-88 /www/huoying]#systemctl restart nginx

根據域名訪問虛擬主機

檔案在C:\Windows\System32\drivers\etc下
10.0.0.88 huoying.linux.cc

如果有故障

先排查配置檔案
靜態檔案的許可權
[root@test-88 /www/huoying]#chown -R www.www /www/
檢視域名與配置的是否一致

如果檔案型別是其他異常型別,nginx預設不解析,直接下載

nginx識別的檔案型別都在這個檔案定義好了

[root@test-88 /www/huoying]#cat /etc/nginx/mime.types 

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

2.基於IP多虛擬主機

Linux作業系統都能夠支援給網路卡繫結多個IP地址,可以使得一塊網路卡上執行多個基於IP的虛擬主機。

新增IP

檢視ip
[root@test-88 /]#ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.88  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fe8e:3483  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:8e:34:83  txqueuelen 1000  (Ethernet)
        RX packets 4202  bytes 2765894 (2.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3268  bytes 1494289 (1.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

新增ip
[root@test-88 /]#ip addr add 10.0.0.89/24 dev eth0
[root@test-88 ~]#ping 10.0.0.89
PING 10.0.0.89 (10.0.0.89) 56(84) bytes of data.
64 bytes from 10.0.0.89: icmp_seq=1 ttl=64 time=0.014 ms
64 bytes from 10.0.0.89: icmp_seq=2 ttl=64 time=0.020 ms


修改conf.d下配置檔案,支援多虛擬主機,編寫多個server{}標籤即可。

[root@test-88 ~]#vim /etc/nginx/conf.d/pord_89.conf
[root@test-88 ~]#cat /etc/nginx/conf.d/pord_89.conf 
server{
  listen 10.0.0.89:80;
  server_name localhost;
  charset utf-8;
  location / {
	root /www/port_89;
	index index.html;
}
}
[root@test-88 ~]#

建立測試資料

[root@test-88 ~]#mkdir -p /www/port_89/
[root@test-88 ~]#echo '這是89埠' > /www/port_89/89.txt
[root@test-88 ~]#chown -R www.www /www/
[root@test-88 ~]#ll /www
total 0
drwxr-xr-x 2 www www 78 Mar 31 15:54 huoying
drwxr-xr-x 2 www www 20 Apr  1 10:11 port_89

重啟nginx,訪問測試

[root@test-88 ~]#systemctl reload nginx

報錯查詢

目標資料夾下index.html檔案沒有
[root@test-88 ~]#mv /www/port_89/89.txt /www/port_89/index.html
修正後可正常展示

3.基於域名的多虛擬主機

基於多IP的虛擬主機可能會造成IP地址不足的問題,如果沒有特殊需求,更常用的是基於多域名的形式。

只需要你單獨配置DNS伺服器,將主機名對應到正確的IP地址,修改Nginx配置,可以識別到不同的主機即可,這樣就可以使得多個虛擬主機用同一個IP,解決了IP不足的隱患。

修改conf.d下的配置檔案

server{
listen 80;
server_name lol.linux.cc;
charset utf-8;

location / {
  root /www/lol/;
  index index.html;
}
}

server{
listen 80;
server_name dnf.linux.cc;
charset utf-8;

location / {
  root /www/dnf/;
  index index.html;
}
}

建立測試資料

[root@test-88 ~]#mkdir -p /www/lol
[root@test-88 ~]#mkdir -p /www/dnf
[root@test-88 ~]#echo '這是lol' > /www/lol/index.html 
[root@test-88 ~]#echo '這是dnf' > /www/lol/index.html
[root@test-88 ~]#chown -R www.www /www/


解析域名

10.0.0.88 huoying.linux.cc lol.linux.cc dnf.linux.cc

重啟nginx,訪問測試

systemctl restart nginx

4.基於多埠的虛擬主機

基於埠的配置在生產環境比較少見,用於特殊場景,例如公司內部測試平臺網站,使用特殊埠的後臺,OA系統、網站後臺,CRM後臺等。

案例:執行基於80、81埠的虛擬主機執行

修改conf.d下配置檔案

[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;

location / {
  root /www/huoying/;
  index index.html;
}
}
[root@test-88 ~]#vim /etc/nginx/conf.d/huoying.conf 
[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;

location / {
  root /www/huoying/;
  index index.html;
}
}

server{
listen 81;
server_name _;
charset utf-8;

location / {
  root /www/haizeiwang/;
  index index.html;
}
}
[root@test-88 ~]#

建立測試資料

[root@test-88 ~]#mkdir -p /www/haizeiwang
[root@test-88 ~]#echo '這是81埠' > /www/haizeiwang/index.html 
[root@test-88 ~]#chown -R www.www /www/

重啟nginx,訪問測試

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

[root@test-88 ~]#systemctl restart nginx


[root@test-88 ~]#netstat -tunlp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3231nginx: master  
tcp        0      0 0.0.0.0:81              0.0.0.0:*               LISTEN      3231nginx: master  
[root@test-88 ~]#

5.虛擬主機配置檔案最佳化(include)

如果所有配置都寫入一個檔案,維護起來很麻煩,修改錯了某一個conf檔案,導致所有頁面都報錯,因此拆分為單個的檔案更為合適。

二、建立nginx訪問日誌

日誌對於程式設計師很重要,可用於問題排錯,記錄程式執行狀態,一個好的日誌能夠給與精確的問題定位。

Nginx日誌功能需要在nginx.conf中開啟相關指令log_format,設定日誌格式,以及設定日誌的儲存位置access_log,指定日誌的格式,路徑,快取大小。

1.日誌格式欄位解釋

nginx.conf中有關訪客日誌定義如下
 #a
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 :記錄訪問網站的客戶端IP地址
$remote_user :記錄遠端客戶端使用者名稱稱
$time_local :記錄訪問時間與時區
$request :記錄使用者的 http 請求起始行資訊(請求方法,http協議)
$status :記錄 http 狀態碼,即請求返回的狀態,例如 200 、404 、502 等
$body_bytes_sent :記錄伺服器傳送給客戶端的響應 body 位元組數
$http_referer :記錄此次請求是從哪個連結訪問過來的,可以根據 referer 進行防盜鏈設定
$http_user_agent :記錄客戶端訪問資訊,如瀏覽器、手機客戶端等
$http_x_forwarded_for :當前端有代理伺服器時,設定 Web 節點記錄客戶端地址的配置,此引數生效的前提是代理伺服器上也進行了相關的 x_forwarded_for 設定

備註
$remote_addr 可能拿到的是反向代理IP地址
$http_x_forwarded_for 可以獲取客戶端真實IP地址

2.開啟關閉日誌功能

主配置檔案nginx.conf

[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
[root@test-88 ~]#

主配置檔案日誌access_log  /var/log/nginx/access.log

檢視虛擬主機配置檔案,除了default.conf預設檔案,其他並未使用日誌功能
[root@test-88 /etc/nginx/conf.d]#grep 'access_log' ./*.conf
./default.conf:    #access_log  /var/log/nginx/host.access.log  main;

主配置檔案日誌格式資訊

[root@test-88 /etc/nginx/conf.d]#tail -f /var/log/nginx/access.log

關閉日誌功能

access_log  off;

3.多虛擬主機的日誌

由於企業會有多個網站業務,日誌也必然需要分開記錄。

單獨寫入到各自的server{}標籤內即可。

⚠️開啟access_log日誌的引數,可以寫在server{}區域內,但是日誌格式化的引數,只能寫在http{}區域中

1.全域性配置

全域性定義好日誌格式,子頁面配置中定義日誌路徑即可。

更改配置測試

原全域性配置
[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
[root@test-88 ~]#

現全域性配置
[root@test-88 ~]#vim /etc/nginx/nginx.conf 
[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
[root@test-88 ~]#


原虛擬主機檔案配置
[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;

location / {
  root /www/huoying/;
  index index.html;
}
}

server{
listen 81;
server_name _;
charset utf-8;

location / {
  root /www/haizeiwang/;
  index index.html;
}
}
[root@test-88 ~]#


現虛擬主機配置檔案
[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
log_format  main1  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;
access_log  /var/log/nginx/huoying_80_access.log  main1;

location / {
  root /www/huoying/;
  index index.html;
}
}

server{
listen 81;
server_name _;
charset utf-8;
access_log  /var/log/nginx/huoying_81_access.log  main1;

location / {
  root /www/haizeiwang/;
  index index.html;
}
}
[root@test-88 ~]#


測試log日誌

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

[root@test-88 ~]#systemctl reload nginx

三、錯誤日誌

Nginx能夠將自身執行故障的資訊也寫入到指定的日誌檔案中。對於錯誤資訊的除錯,是維護Nginx的重要手段,指令是error_log,可以放在http{}全域性中,也可以單獨為虛擬主機記錄。

關於該引數的官網文件,以及具體的用法

https://nginx.org/en/docs/ngx_core_module.html#error_log

和access_log用法一樣

Syntax:	error_log file [level];
Default:	
error_log logs/error.log error;
Context:	main, http, mail, stream, server, location
語法:
error_log file  level;

日誌級別在乎debug|info|notice|warn|error|crit|alert|emerg
級別越高,日誌記錄越少,生產常用模式是warn|error|crit級別
日誌的記錄,會給伺服器增加額外大量的IO消耗,按需修改
crit表示nginx已經出現嚴重錯誤以及崩潰,才記錄日誌,記錄日誌太少

測試語法

[root@test-88 ~]#vim /etc/nginx/conf.d/pord_89.conf 
[root@test-88 ~]#cat /etc/nginx/conf.d/pord_89.conf 
log_format main2 '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
server{
  listen 10.0.0.89:80;
  server_name localhost;
  charset utf-8;
  access_log /var/log/nginx/port_89.log main2;
  error_log /var/log/nginx/port_89_error.log error;

  location / {
	root /www/port_89;
	index index.html;
}
}
[root@test-88 ~]#
[root@test-88 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

自動生成配置檔案模板

https://www.digitalocean.com/community/tools/nginx?domains.0.php.wordPressRules=true&domains.0.logging.acces

四、404頁面最佳化

nginx指令error_page的作用是當發生錯誤的時候能夠顯示一個預定義的uri;

語法1
error_page 404 /404.html;

語法2
error_page 404 https://error.taobao.com/app/tbhome/common/error.html;
錯誤頁面最佳化,nginx,預設訪問出錯後,會返回不同的錯誤頁面
40X系列的頁面
	404 not found 伺服器上找不到資源
	403 Forbidden 一般都是許可權不足

相關文章