nginx
nginx基礎知識介紹
nginx服務的軟件特點:
- 支持高併發,消耗內存資源少
- 具有多種功能
- 網站web服務功能
- 網站負載均衡功能
- 網站緩存功能
- 在多個系統平臺都可以部署
nginx實現網絡通訊是使用的是異步網絡IO模型:epoll模型(apache-select模型)
- epoll模型:
宿舍管理員: 找人,查看人員登記信息
幼兒園阿姨: 小朋友上廁所, 都站在教室的某個位置 - select模型:
宿舍管理員: 找人,一個一個屋子去問, --線性輪詢
幼兒園阿姨: 小朋友上廁所, 一個一個小朋友去詢問
nginx軟件的安裝部署過程(此時採用yum安裝)
-
更新nginx官方yum源
vim /etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key
-
yum安裝nginx軟件
yum -y install nginx
-
啓動nginx服務,並設置開機自啓,打開瀏覽器檢查nginx是否安裝成功
systemctl start nginx systemctl enable nginx
查看軟件的目錄結構
- /etc/logrotate.d 實現nginx日誌文件定時切割處理
- /etc/nginx 配置文件
- /var/log/nginx 日誌文件
- /usr/bin/nginx 命令文件
- /usr/share/nginx/html 站點目錄
日誌切割
-
利用腳本實現切割 (定時任務)
#!/bin/bash mv /var/log/nginx/access.log /var/log/nginx/access_$(date +%F).log systemctl restart nginx #重啓nginx是爲了讓其重新產生access.log文件
-
利用專用的切割程序-logrotate
vim /etc/logrotate.conf # rotate log files weekly weekly #--- 定義默認日誌切割的週期 # keep 4 weeks worth of backlogs rotate 4 #--- 定義只保留幾個切割後的文件 # create new (empty) log files after rotating old ones create #--- 創建出一個相同的源文件 # use date as a suffix of the rotated file dateext #--- 定義角標(擴展名稱信息) # uncomment this if you want your log files compressed #compress #--- 是否對切割後的文件進行壓縮處理 # RPM packages drop log rotation information into this directory include /etc/logrotate.d #--- 加載包含/etc/logrotate.d/目錄中文件配置 # no packages own wtmp and btmp -- we'll rotate them here /var/log/wtmp { #--- 單獨對某個文件進行切割配置 monthly create 0664 root utmp minsize 1M #--- 最小大小爲1M,小於1M不進行切割 rotate 1 }
nginx服務配置文件詳細解析
vim /etc/nginx/nginx.conf #--- 主配置文件
#第一個部分: 配置文件主區域配置
user www; #--- 定義worker進程管理的用戶 (此時改爲www 所以要確保系統上有此用戶)
補充: nginx的進程
master process: 主進程 #---管理服務是否能夠正常運行 boss
worker process: 工作進程 #---處理用戶的訪問請求 員工
worker_processes 2; #---定義有幾個worker進程 == CPU核數 / 核數的2倍
error_log /var/log/nginx/error.log warn; #--- 定義錯誤日誌路徑信息
pid /var/run/nginx.pid; #--- 定義pid文件路徑信息
#第二個部分: 配置文件事件區域
events {
worker_connections 1024; #--- 一個worker進程可以同時接收1024訪問請求
}
#第三個部分: 配置http區域
http {
include /etc/nginx/mime.types; #--- 加載一個配置文件
default_type application/octet-stream; #--- 指定默認識別文件類型
log_format jiage '$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 jiage;# 這裏的jiage 引用上面jiage 的日誌格式
#--- 指定日誌路徑
sendfile on; ???
#tcp_nopush on; ???
keepalive_timeout 65; #--- 超時時間
#gzip on;
include /etc/nginx/conf.d/*.conf; #--- 加載一個配置文件
}
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
grep -Ev '^$|#' /etc/nginx/conf.d/default.conf.bak > /etc/nginx/conf.d/default.conf
vim /etc/nginx/nginx.d/default #--- 擴展配置(虛擬主機配置文件)
#第四個部分: server區域信息(配置一個網站 www/bbs/blog -- 一個虛擬主機)
server {
listen 80; #--- 指定監聽的端口
server_name www.jiage.com; #--- 指定網站域名
root /usr/share/nginx/html; #--- 定義站點目錄的位置
index index.html index.htm; #--- 定義首頁文件
error_page 500 502 503 504 /50x.html; #--- 優雅顯示頁面信息
location = /50x.html {
root /usr/share/nginx/html;
}
}
nginx日誌功能配置解析
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; 調用日誌格式
$remote_addr 顯示用戶訪問源IP地址信息
$remote_user 顯示認證的用戶名信息
[$time_local] 顯示訪問網站時間
"$request" 請求報文的請求行信息
$status 用戶訪問網站狀態碼信息
$body_bytes_sent 顯示響應的數據尺寸信息
$http_referer 記錄調用網站資源的連接地址信息(防止用戶盜鏈)
老男孩nginx---access.log---莫文傑(荒原飲露---老男孩圖片鏈接)---http_referer(鏈接)
$http_user_agent 記錄用戶使用什麼客戶端軟件進行訪問頁面的 (谷歌 火狐 IE 安卓 iphone)
$http_x_forwarded_for 負載均衡相關,記錄真實客戶端的ip地址
錯誤日誌存放的位置及級別
錯誤日誌: /var/log/nginx/error.log --- Core functionality
Syntax: error_log file [level]; 指定錯誤日誌路徑以及錯誤日誌記錄的級別
Default: error_log logs/error.log error;
Context: main, http, mail, stream, server, location
error_log /var/log/nginx/error.log warn;
錯誤級別:
debug :調試級別, 服務運行的狀態信息和錯誤信息詳細顯示 信息越多
info :信息級別, 只顯示重要的運行信息和錯誤信息
notice :通知級別: 更加重要的信息進行通知說明
warn :警告級別: 可能出現了一些錯誤信息,但不影響服務運行
error :錯誤級別: 服務運行已經出現了錯誤,需要進行糾正 推薦選擇
crit :嚴重級別: 必須進行修改調整
alert :嚴重警告級別: 即警告,而且必須進行錯誤修改
emerg :災難級別: 服務已經不能正常運行 信息越少
PS: 日誌文件信息需要做切割處理防止容量過大分析麻煩
nginx服務location作用說明
location進行uri匹配
錯誤頁面優雅顯示 error_page
vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.jiage.com;
location / {
root /html/www;
index jiage.html;
error_page 404 /404.jpg
}
}
location詳細配置優先級
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
location = / { --- 精確匹配 優先級01 最高
[ configuration A ]
}
location / { --- 默認匹配 優先級04 最低
[ configuration B ]
}
location /documents/ { --- 按照目錄進行匹配 優先級03
[ configuration C ]
}
location ^~ /images/ { --- 優先匹配/不識別uri信息中符號信息 優先級02
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ { --- 不區分大小寫進行匹配 優先級03
[ configuration E ]
}
例子:
server{
listen 80;
server_name test.location.com;
location = / {
return 404;
}
location / {
return 403;
}
location /documents/ {
return 500;
}
location ^~ /images/ {
return 502;
}
location ~* \.(gif|jpg|jpeg)$ {
return 504;
}
}
nginx服務的企業應用
利用nginx服務搭建一個網站
- 編寫虛擬主機配置文件
vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.jiage.com;
location /jiage {
root /usr/share/nginx/html;
index jiage.html;
}
}
-
編寫主頁文件以html結尾
vim /usr/share/nginx/html/jiage.html <!DOCTYPE html> <html> <meta charset="utf-8"> <head> <title>這個是標題</title> </head> <body> <h1>這是一個一個簡單的HTML,h1 <p>Hello </p> </h1> </h5> </body> </html>
-
重啓nginx服務(平滑重啓)
mkdir -p /usr/share/nginx/html/jiage/jiage.html systemctl reload nginx
nginx 命令參數
-t : test configuration and exit
檢查測試配置文件語法
-s : send signal to a master process: stop, quit, reopen, reload
控制服務停止或者重新啓動
-
編寫DNS配置信息 /etc/hosts
-
進行訪問測試
瀏覽器中:http://www.jiage.com/jiage
文本界面: curl www.jiage.com/jiage
-
部署搭建網站常見錯誤:
-
網站服務配置文件編寫不正確
404 錯誤
解決方法一: 修改nginx配置文件---location
解決方法二: 在站點目錄中創建相應目錄或文件數據信息
403 錯誤
解決方法一: 不要禁止訪問
解決方法二: 因爲沒有首頁文件 -
DNS信息配置不正確
- nginx配置文件修改一定要重啓服務;
站點目錄中代碼文件信息調整,不需要重啓服務
-
利用nginx服務搭建一個多網站(www bbs blog)
- 創建多個虛擬主機配置文件 以.conf結尾
[root@web02 conf.d]# vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.jiage.com;
location / {
root /html/www;
index index.html;
}
}
[root@web02 conf.d]# vim /etc/nginx/conf.d/bbs.conf
server {
listen 80;
server_name bbs.jiage.com;
location / {
root /html/bbs;
index index.html;
}
}
[root@web02 conf.d]# vim /etc/nginx/conf.d/blog.conf
server {
listen 80;
server_name blog.jiage.com;
location / {
root /htmlblog;
index index.html;
}
}
[root@web02 conf.d]#systemctl reload nginx
- 創建站點目錄和目錄中首頁文件
[root@web02 conf.d]# mkdir -p /html/{www,bbs,blog}
[root@web02 conf.d]# for name in {www,bbs,blog}; do echo "10.0.0.8 $name.jiage.com" > /html/$name/index.html;done
[root@web02 conf.d]# for name in {www,bbs,blog};do cat /html/$name/index.html ;done
10.0.0.8 www.jiage.com
10.0.0.8 bbs.jiage.com
10.0.0.8 blog.jiage.com
-
在客戶端上編寫hosts解析文件
10.0.0.8 www.jiage.com bbs.jiage.com blog.jiage.com
-
進行訪問測試
注意:利用瀏覽器訪問是要清除緩存,或者使用無痕模式訪問
ps:服務配置文件中涉及到地址修改,必須重啓nginx服務,不能平滑重啓
網站的安全訪問設置
根據用戶訪問的地址進行控制
例: 10.0.0.0/24 www.jiage.com/AV 不能訪問
172.16.1.0/24 www.jiage.com/AV 可以訪問
nginx訪問模塊: ngx_http_access_module
舉例配置:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
指令用法
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
[root@web02 conf.d]# vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.jiage.com;
location / {
root /html/www;
index index.html;
}
location /AV {
deny 10.0.0.0/24;
allow 172.16.1.0/24;
root /html/www;
index index.html;
}
}
ps: location 外面的信息,全局配置信息
location裏面的信息,局部配置信息
根據用戶訪問進行認證
nginx認證模塊: ngx_http_auth_basic_module
舉例配置:
location / {
auth_basic "closed site"; --- 開啓認證功能
auth_basic_user_file conf/htpasswd; --- 加載用戶密碼文件
}
- 編寫虛擬主機配置文件
server {
listen 80;
server_name www.jiage.com;
location / {
root /html/www;
index index.html;
auth_basic "jiage"; #密碼忘了之後的提醒信息
auth_basic_user_file password/htpasswd;
}
-
創建密碼文件(文本中密碼信息必須是密文的)
使用命令: htpasswd 創建一個有密文信息的密碼文件 該命令系統默認是沒有安裝的
[root@web02 conf.d]# provides htpaswd httpd-tools-2.4.6-89.el7.centos.x86_64 #可以看到htpasswd的安裝包爲這個 htpasswd命令參數說明: -c Create a new file. ***** 創建一個密碼文件 -n Don't update file; display results on stdout. 不會更新文件; 顯示文件內容信息 -b Use the password from the command line rather than prompting for it. ***** 免交互方式輸入用戶密碼信息 -i Read password from stdin without verification (for script usage). 讀取密碼採用標準輸入方式,並不做檢查 ??? -m Force MD5 encryption of the password (default). md5的加密算法 -B Force bcrypt encryption of the password (very secure). 使用bcrypt對密碼進行加密 -C Set the computing time used for the bcrypt algorithm (higher is more secure but slower, default: 5, valid: 4 to 31). 使用bcrypt algorithm對密碼進行加密 -d Force CRYPT encryption of the password (8 chars max, insecure). 密碼加密方式 -s Force SHA encryption of the password (insecure). 加密方式 -p Do not encrypt the password (plaintext, insecure). 不進行加密 -D Delete the specified user. 刪除指定用戶 -v Verify password for the specified user.
- 利用htpasswd命令免交互添加用戶並修改權限
[root@web02 conf.d]# htpasswd -bc /html/www/password/htpasswd jiage 123456 [root@web02 conf.d]# chmod 600/html/www/password/htpasswd ps:根據配置文件創建加密文件 用戶名: jiage; 密碼:123456
- 訪問測試
[root@web02 password]# curl www.jiage.com -u jiage:123456
10.0.0.8 www.jiage.com
利用nginx服務搭建文件共享服務器
- 編寫配置文件
nginx模塊功能: ngx_http_autoindex_module
Syntax: autoindex on | off;
Default:
autoindex off;
Context: http, server, location
server {
listen 80;
server_name www.jiage.com;
location / {
root /html/www;
#index index.html;
auth_basic "jiage"; #密碼忘了之後的提醒信息
auth_basic_user_file password/htpasswd;
autoindex on; #開啓nginx站點索引功能
charset utf-8; # 修改目錄結構中出現的中文亂碼問題
}
ps:文件共享服務器不需要有主頁文件,或者修改配置文件中主頁文件的名字與站點目錄下的不一致。
利用nginx服務器配置文件別名功能
例子:訪問www.jiage.com 直接輸入jia.com 就直接訪問大www服務器
-
編寫配置文件
server_name www.jiage.com jia.com;
- 在客戶端做好域名解析信息
作用:
1. 編寫網站訪問測試
- 定位要訪問的網站服務器
利用nginx狀態模塊功能對網站進行監控
狀態模塊: ngx_http_stub_status_module
location = /basic_status {
stub_status;
}
-
編寫配置文件
[root@web01 conf.d]# vim state.conf server { listen 80; server_name state.jiage.com stub_status; }
-
重啓nginx服務,並在客戶端寫好域名解析
ps: 頁面顯示信息介紹
Active connections: 激活的連接數信息 4000用戶 3500
accepts: 接收的連接數彙總(綜合) TCP
handled: 處理的連接數彙總(綜合) TCP
requests: 總計的請求數量 HTTP協議請求
Reading: nginx服務讀取請求報文的數量 100人點餐
Writing: nginx服務響應報文信息數量 100人響應
Waiting: nginx隊列機制,要處理(讀取或者響應保存進行保存) 監控
利用nginx實現頁面跳轉功能
利用rewrite模塊實現跳轉功能: http_rewrite_module
Syntax: rewrite regex replacement [flag]; rewite 匹配的正則信息 替換成什麼信息
Default: —
Context: server, location, if
出現無限跳轉如何解決:
第一種方法: 利用不同server區塊配置打破循環
server{
server_name jiage.com;
rewrite ^/(.*) http://www.jiage.com/$1 permanent;
}
第二種方法: 利用if判斷實現打破循環
if ($host ~* "^jiage.com$"){
rewrite ^/(.*) http://www.jiage.com/$1 permanent;
}
例子: www.jiage.com/abc/index.html
^/ 表示的是www.jia.com
(.*) 表示的是abc/index.html
$host 表示的是用戶訪問的URL信息