基於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 一般都是許可權不足