文章目錄
- 1. Nginx基礎概述
- 2. Nginx安裝啟動
- 3. Nginx組態檔
- 4. Nginx搭建一個靜態資源web服務器
- 5. Nginx虛擬主機
- 5.1 多網卡多IP的方式
- 5.2 基于埠的配置方式
- 5.3 基于多個hosts名稱方式(多域名方式)
- 6. Nginx日志管理
- 7. Nginx日志切割
- 8. 自我總結
1. Nginx基礎概述
(1) Nginx是一個開源(直接獲取源代碼) 且 高性能(支持海量并發)、可靠的(服務穩定 ) Http Web服務、代理服務,
(2) Nginx采用Epool網路模型,Apache采用select模型
Epoll: 當用戶發起請求,epoll模型會直接進行處理,效率高效,并無連接限制,
Select: 當用戶發起一次請求,select模型就會進行一次遍歷掃描,從而導致性能低下,
(3) Nginx和Apache的區別
Nginx: 占用資源少、抗并發(Epool網路模型)、處理靜態檔案好(是apache的3倍以上)、高度模塊化(容易撰寫模塊)、配置簡單(可以正則配置)、可以作為web、負載,代理服務器
Apache:
Apache的rewrite(跳轉)比nginx強大、apache成熟穩定bug少(nginx較多)、apache對PHP支持簡單(nginx需要配合其他后端用)apache對處理動態有優勢(nginx雞肋,nginx適合靜態和反向)
(4) Nginx應用場景

防資源盜用: 做個防盜,不讓其他的網站用呼叫自己的圖片
正向代理: 用戶通過nginx出去上網,可以設定用戶不同的用戶,分配不同的公網ip
反向代理: nginx作為負載,負載均衡,帶著用戶訪問web
(5) 靜態和動態web軟體
靜態WEB軟體:
nginx、
apache、
IIS、
lighttpd、
tengine、
openresty-nginx、
動態web軟體:
Tomcat、
Resin、
weblogic、
Jboss
2. Nginx安裝啟動
-
安裝方式
- 原始碼編譯 (1.版本隨意 2.安裝復雜 3.升級繁瑣 4.規范 5.便于管理)
- epel倉庫(1.版本較低 2.安裝簡單 3.配置不易讀)
- 官方倉庫 (1.版本較新 2.安裝簡單 3.配置易讀)
-
配置官方yum源
-
官方網站 nginx.org
-
在官方的頁面最底部,點擊stable and mainline

-
到達centos的官方源

-
-
安裝Nginx服務
- yum install nginx -y
-
啟動并設定開機自啟
- systemctl start nginx
- systemctl enable nginx
-
驗證是否成功
- netstat -lntup|grep 80 (埠檢測)
- ps -ef|grep nginx (行程檢測)
- http://10.0.0.7(瀏覽器檢測)
-
檢查nginx的軟體版本
- nginx -v
-
檢查nginx的編譯引數
- nginx -V
-
Nginx兩種管理方式
- 直接輸入Nginx啟動,使用sytemctl啟動 只能使用一種方式運行,不能混合使用
- systemctl管理
- systemctl reload(restart、start、stop、status) Nginx
- nginx管理
- nginx 啟動
- nginx -s stop 停止
- nginx -s reload |restart 多載服務
3. Nginx組態檔
nginx組態檔:/etc/nginx/nginx.conf
核心模塊:
user nginx; #nginx行程運行的用戶
worker_processes 1; #nginx作業的行程數量,作業中配置為和核心數量相同
error_log /var/log/nginx/error.log warn; #nginx的錯誤日志【警告及其警告以上的都記錄】
pid /var/run/nginx.pid; #nginx行程運行后的行程id
事件模塊:
events {
worker_connections 1024; #一個work行程的最大連接數,默認1024 65535
use epool; #使用epoll網路模型
}
http核心層模塊:
http {
include /etc/nginx/mime.types; #包含資源型別檔案,媒體型別,如上面的檔案中沒有請求的型別,默認為下載
default_type application/octet-stream; #默認以下載方式傳輸給瀏覽器(前提是該資源在mime.types中無法找到)
日志格式定義
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; #包含哪個目錄下面的*.conf檔案,每個conf檔案對應一個網站
server { 定義一個網站
listen 80; #監聽埠
server_name localhost; #nginx的域名
#charset koi8-r; #字符集
location / { #位置,匹配規則,規定了用戶默認訪問的目錄是哪一個
root /usr/share/nginx/html; #代碼的主檔案位置
index index.html index.htm; #服務端默認回傳給用戶的檔案
}
location /test { #位置
root /code/test/123/; #代碼的主檔案位置
index index.html index.htm; #服務端默認回傳給用戶的檔案
}
}
http server location擴展了解項
http{}層下允許有多個Server{}層,一個Server{}層下又允許有多個Location
http{} 標簽主要用來解決用戶的請求與回應,
server{} 標簽主要用來回應具體的某一個網站,
location{} 標簽主要用于匹配網站具體URL路徑,
Nginx組態檔相關
/etc/nginx/nginx.conf # Nginx主組態檔 包含了default.conf
/etc/nginx/conf.d/default.conf # Nginx的主組態檔 屬于Nginx.conf 中的
/var/log/nginx/access.log # 訪問nginx的日志
/var/log/nginx/error.log # 訪問Nginx報錯的日志
相關檔案的路徑:



4. Nginx搭建一個靜態資源web服務器
小技巧:非常重要,寫完組態檔的時候,務必要Nginx自查!!! 如果要是沒檢查,組態檔錯錯的話,服務會直接停止
- nginx自查
- 修改完配置記得使用 nginx -t 檢查語法
- 如果沒有檢查語法,直接多載導致報錯,systemctl status nginx -l 查看錯誤資訊
(1) 撰寫Nginx組態檔
[root@web01 conf.d]# cat game.conf
server {
listen 80;
server_name game.oldboy.com;
location / {
root /code;
index index.html;
}
}
(2) 根據組態檔,創建目錄,上傳代碼
[root@web01 ~]# mkdir /code
[root@web01 ~]# cd /code
[root@web01 code]# rz html5.zip
[root@web01 code]# unzip html5.zip
(3)多載nginx服務
[root@web01 code]# systemctl reload nginx #平滑重啟
[root@web01 code]# systemctl restart nginx #立即重啟
(4) 配置域名決議
Windows: C:\Windows\System32\drivers\etc\hosts
10.0.0.7 game.oldboy.com
Mac sudo vim /etc/hosts
10.0.0.7 game.oldboy.com
(5)通過瀏覽器訪問對應的專案
game.oldboy.com
小提示:
用戶請求的路徑:http://game.oldboy.com/game/duxinshu/index.html
實際上服務器查找的路徑: /code/game/duxinshu/index.html
http://game.oldboy.com/game/yyncl/
code/game/yyncl/index.html
5. Nginx虛擬主機
小技巧:
5.1 多網卡多IP的方式
(1)配置多網卡多IP的方式
[root@web01 conf.d]# cat ip.conf
server {
listen 10.0.0.7:80;
server_name _;
location / {
root /code_ip_eth0;
index index.html;
}
}
server {
listen 172.16.1.7:80;
server_name _;
location / {
root /code_ip_eth1;
index index.html;
}
}
(2)根據配置創建目錄
[root@web01 conf.d]# mkdir /code_ip_eth0
[root@web01 conf.d]# echo "Eth0" > /code_ip_eth0/index.html
[root@web01 conf.d]# mkdir /code_ip_eth1
[root@web01 conf.d]# echo "Eth1" > /code_ip_eth1/index.html
(3)重啟nginx服務
[root@web01 conf.d]# systemctl restart nginx
(4)使用curl命令測驗
[root@web01 ~]# curl 172.16.1.7
Eth1
[root@web01 ~]# curl 10.0.0.7
Eth0
5.2 基于埠的配置方式
(1)配置多埠的虛擬主機
[root@web01 conf.d]# vim port.conf
server {
listen 81;
location / {
root /code_81;
index index.html;
}
}
server {
listen 82;
location / {
root /code_82;
index index.html;
}
}
(2)根據組態檔創建所需的目錄
[root@web01 conf.d]# mkdir /code_8{1..2}
[root@web01 conf.d]# echo "81" > /code_81/index.html
[root@web01 conf.d]# echo "82" > /code_82/index.html
(3)檢查語法并重啟服務
[root@web01 conf.d]# ngin x -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# systemctl restart nginx
(4)如何去訪問
http://10.0.0.7:82/
5.3 基于多個hosts名稱方式(多域名方式)
(1)準備多虛擬主機組態檔
[root@web01 conf.d]# cat test1.oldboy.com.conf
server {
listen 80;
server_name test1.oldboy.com;
location / {
root /code/test1;
index index.html;
}
}
[root@web01 conf.d]# cat test2.oldboy.com.conf
server {
listen 80;
server_name test2.oldboy.com;
location / {
root /code/test2;
index index.html;
}
}
(2)根據組態檔創建對應的目錄
[root@web01 conf.d]# mkdir /code/test{1..2} -p
[root@web01 conf.d]# echo "test1_server" > /code/test1/index.html
[root@web01 conf.d]# echo "test2_server" > /code/test2/index.html
[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx
(3) 配置域名決議
10.0.0.7 test1.oldboy.com
10.0.0.7 test2.oldboy.com
(4)通過瀏覽器訪問該網站
6. Nginx日志管理
(1)log_format的作用是定義日志格式語法

(2)nginx默認日志格式語法如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

(3) Nginx日志格式允許包含的內置變數
$remote_addr # 記錄客戶端IP地址
$remote_user # 記錄客戶端用戶名
$time_local # 記錄通用的本地時間
$time_iso8601 # 記錄ISO8601標準格式下的本地時間
$request # 記錄請求的方法以及請求的http協議
$status # 記錄請求狀態碼(用于定位錯誤資訊)
$body_bytes_sent # 發送給客戶端的資源位元組數,不包括回應頭的大小
$bytes_sent # 發送給客戶端的總位元組數
$msec # 日志寫入時間,單位為秒,精度是毫秒,
$http_referer # 記錄從哪個頁面鏈接訪問過來的
$http_user_agent # 記錄客戶端瀏覽器相關資訊
$http_x_forwarded_for #記錄客戶端IP地址
$request_length # 請求的長度(包括請求行, 請求頭和請求正文),
$request_time # 請求花費的時間,單位為秒,精度毫秒
# 注:如果Nginx位于負載均衡器,nginx反向代理之后, web服務器無法直接獲取到客 戶端真實的IP地址,
# $remote_addr獲取的是反向代理的IP地址, 反向代理服務器在轉發請求的http頭資訊中,
# 增加X-Forwarded-For資訊,用來記錄客戶端IP地址和客戶端請求的服務器地址,
(4)access_log日志配置語法
意思就是,你的日志的格式你定義好了,然后直接呼叫那個格式
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wmqnnSBP-1639931026003)(D31E30D30FF2491AAF185208E148D64D)]
(5)Nginx Access日志配置實踐
server {
listen 80;
server_name code.oldboy.com;
#將當前的server網站的訪問日志記錄至對應的目錄,使用main格式
access_log /var/log/nginx/code.oldboy.com.log main;
location / {
root /code;
}
#當有人請求改favicon.ico時,不記錄日志
location /favicon.ico {
access_log off;
return 200;
}
location /favicon.ico {
# 將圖示保存到指定的訪問目錄
root /data/nginx/html ;
}
}
小提示:

7. Nginx日志切割
使用logrotate切割日志
[root@nginx conf.d]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天切割日志
missingok # 日志丟失忽略
rotate 52 # 日志保留52天
compress # 日志檔案壓縮
delaycompress # 延遲壓縮日志
notifempty # 不切割空檔案
create 640 nginx adm # 日志檔案權限
sharedscripts
postrotate # 切割日志執行的命令
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
日志切割后的效果
[root@oldboy ~]# ll /var/log/nginx/
total 4044
-rw-r----- 1 www adm 54438 Oct 12 03:28 access.log-20181012.gz
-rw-r----- 1 www adm 28657 Oct 13 03:48 access.log-20181013.gz
-rw-r----- 1 www adm 10135 Oct 12 03:28 error.log-20181130.gz
-rw-r----- 1 www adm 7452 Oct 13 03:48 error.log-20181201.gz
8. 自我總結
(1)微服務:就類似于soa 京東的模式,把多個功能分塊壞,不至于壞一個功能,整個功能都壞掉,云架構、中間層:代理的形式
(2)一臺服務器最大的連接時65535,只有這么多的埠,一個連接可能會打開多個檔案描述符,檔案描述符可以調大一點,
(3)動靜分離:動態的資料和靜態的資料分開處理
nginx能做快取服務,很多cdn公司拿nginx做的快取
(4)web服務都僅僅處理靜態資源html css js 字體 doc mp4都屬于靜態資源
直接通過磁盤,回傳給用戶,然后瀏覽器做一次加載,人類可識別的
(5)動態資源:需要查詢資料庫 ,通過記憶體,加載決議,然后回傳要給頁面給用用戶的
–lock-path=/var/run/nginx.lock鎖路徑就是nginx啟動,就會touch一個檔案出來,防止再次啟動
(6)nginx -t 檢查語法錯誤
systemctl status nginx -l 可以詳細的看看報錯
(7)nginx 回車啟動–>再原始碼編譯的時候會使用,再原始碼編譯的時候,并沒有給我們提供,nginx啟動和停止的管理組態檔, systemctl 用yum裝會提供
注意: 這兩種方式不能混著用,只能用一種
(8)如果cpu的核心數是16,就會把work_pricesses 改成16,每個核心可以處理2-3w,這個不好說,
(9)再event時間模塊nginx默認使用的就是epoll網路模式,可以再時間里面不用寫
(10)長連接的超時時間:如果用戶不在點擊頁面,超過了超時時間,然后自動斷開連接
(11)/etc/nginx/mime.types 資源型別與我呢間的對應,如果訪問的檔案沒有對應關系,直接點擊的話,會下載檔案,如果有的話可以在線訪問,也可以下載(滑鼠右擊選下載),
(12)再生產上面一般用平滑重啟,windows域名決議 /windows/system32/drivers/etc/hosts
(13)直接再/etc/nginx/conf.d/ 多加一個組態檔,多加一個server相當于多加一個網站 ,server_name ;""代表是空,可以用ip去訪問
(14)
listen 10.0.0.7:80 只能通過10.0.0.7才能訪問我的80埠,如果只寫80埠,不管是eth0
還是eth1都能訪問我的網站
(15)這里把default.conf檔案給洗掉了,如果不想刪,則使用gzip default.conf進行壓縮,因為這個和ip.conf都是通過ip訪問的,以免沖突,所以以后再測驗的時候,一面沖突,把不需要的改個名字,或者壓縮一個壓縮包
(16)在/etc/nginx/nginx.conf 下 nginx -t 檢查語法 沒問題了在進行重啟nginx,就這個檔案中有/etc/nginx/conf.d/*.conf
(17)多IP的方式不好記,訪問一個IP,一個IP對應不同埠,不同的埠對應不同的專案,
在公司的內部用的還是比較多的,因為沒有域名,訪問不同的埠來實作,這個不適合對外,埠被人記不住,這幾個專案是公司內部人使用的,這時候沒有域名,這時
就用埠的方式解決,只限于企業內部用,對外不用這個
(18)基于多個hosts名稱方式(多域名方式)最最常用的一種方式
可以把多個server寫入一個檔案中,也可以分成多個檔案 比如 vhost1.conf vhost2.conf
如果不想開哪個站點,直接gzip關掉即可
每一個域名寫一個組態檔
(19)
會把請求拋給http,http會詢問誰的server_name是 test3.oldboy.com,當找不到server_name域名
匹配的時候,又把域名決議到我的服務器上面來了,選擇一個組態檔名最靠前的檔案名給你
(20)nginx -t 是檢查的是這一個組態檔/etc/nginx/nginx.conf
如果是第三行出問題了,則vim +3 1.sh 直接定位到第三行
在重啟nginx的時候一定要檢查語法,一旦寫錯了,在檢查nginx會把nginx殺掉了,起不來了,這個網站馬上就崩了,一定要先檢查語法,然后再systemctl reload nginx
(21)服務沒起來怎么查(nginx -t),服務起來怎么查(/var/log/nginx/error_)
(22)日志切割:用yum安裝之后,就會有個程式
這個logrotate服務默認系統是有的,只是nginx提供一個日志切割檔案,來
使用這個服務,給nginx主機名發送一個信號,告訴他重新把日志檔案
reload一下
(23)zcat 可以查看.zip壓縮包里面的內容 但是僅次于壓縮包里只有一個檔案
(24)/etc/logrotate.d/nginx 這個檔案不用調整,不用動
用yum安裝的話不用寫腳本,直接提供組態檔
用原始碼安裝的可能會寫腳本
(25)虛擬主機:一個nginx上面跑多個專案,多域名虛擬主機(重要),其他的不重要
(26)ping -c1 -W1 10.0.0.1
-c 1 要求回應的次數(1次)
-W 1 在1秒后退出
(27)curl -I 10.0.0.7:/index.html 使用這個回傳的是頭部訊息
(28) nginx的行程

(29) 連接放到頁面上就是網頁 ,/var/log/httpd/error
(30) 查看dns的程序
yum -y install bind-utils
nslookup
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389114.html
標籤:其他
