掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
無論是運維、開發(fā)、測試,Nginx技術(shù)棧的學習總是必不可少的,只是不同的崗位掌握的深度與廣度不同而已。所以,民工哥利用周末休息時間,將往期推送的Nginx文章給大家重新整理出來,整理出成體系的Nginx知識體系,供大家學習與參考。

創(chuàng)新互聯(lián)建站專注于瑤海網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供瑤海營銷型網(wǎng)站建設(shè),瑤海網(wǎng)站制作、瑤海網(wǎng)頁設(shè)計、瑤海網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造瑤海網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供瑤海網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
碼字不易,如有幫助,請點在看與轉(zhuǎn)發(fā)朋友圈支持一波,感謝!?。。?/p>
Nginx 是開源、高性能、高可靠的?Web?和反向代理服務(wù)器,而且支持熱部署,幾乎可以做到 7 * 24 小時不間斷運行,即使運行幾個月也不需要重新啟動,還能在不間斷服務(wù)的情況下對軟件版本進行熱更新。性能是 Nginx 最重要的考量,其占用內(nèi)存少、并發(fā)能力強、能支持高達 5w 個并發(fā)連接數(shù),最重要的是, Nginx 是免費的并可以商業(yè)化,配置使用也比較簡單。
官方網(wǎng)站:http://www.nginx.org
高性能的WEB服務(wù)器軟件,與Apache相比,它支持更多的并發(fā)連接且占用服務(wù)器資源少,效率高
作為負載均衡服務(wù)器,它可以作為HTTP SERVER或DB等服務(wù)的代理服務(wù)器,類似Haproxy代理軟件的功能,Nginx的代理功能相對簡單,效率也不及Haproxy,同時它也是一個優(yōu)秀的郵件代理服務(wù)軟件
Nginx還可以作緩存服務(wù)器,類似于專業(yè)的緩存軟件功能
Nginx 僅能支持http、https和Email協(xié)議,這樣就在適用范圍上面小些,這個是它的缺點
對后端服務(wù)器的健康檢查,只支持通過端口來檢測,不支持通過 url來檢測。不支持 Session 的直接保持,但能通過 ip_hash 來解決
Nginx 的最重要的幾個使用場景:
對于前端來說 Node.js 并不陌生, Nginx 和 Node.js 的很多理念類似, HTTP 服務(wù)器、事件驅(qū)動、異步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以實現(xiàn),但 Nginx 和 Node.js 并不沖突,都有自己擅長的領(lǐng)域。Nginx 擅長于底層服務(wù)器端資源的處理(靜態(tài)資源處理轉(zhuǎn)發(fā)、反向代理,負載均衡等), Node.js 更擅長上層具體業(yè)務(wù)邏輯的處理,兩者可以完美組合。
用一張圖表示:
Apache和Nginx都屬于Web服務(wù)器,兩者都實現(xiàn)了HTTP 1.1協(xié)議。無論是選擇哪個,都是根據(jù)應(yīng)用場景來決定的,所以些文件僅從應(yīng)用場景出發(fā),來對比兩者之間的各自特點。要讓正確的工具,做出正確的事。
Nginx和Apache一樣,都是HTTP服務(wù)器軟件,在功能實現(xiàn)上都采用模塊化結(jié)構(gòu)設(shè)計,都支持通用的語言接口,如PHP、Perl、Python等,同時還支持正向和反向代理、虛擬主機、URL重寫、壓縮傳輸、SSL加密傳輸?shù)取?/p>
本文以CentOS 7.x 系統(tǒng)為例,使用 yum 安裝 Nginx。
yum install nginx -y
安裝完成后,通過 rpm -ql nginx 命令查看 Nginx 的安裝信息。
# Nginx配置文件
/etc/nginx/nginx.conf # nginx 主配置文件
/etc/nginx/nginx.conf.default
# 可執(zhí)行程序文件
/usr/bin/nginx-upgrade
/usr/sbin/nginx
# nginx庫文件
/usr/lib/systemd/system/nginx.service # 用于配置系統(tǒng)守護進程
/usr/lib64/nginx/modules # Nginx模塊目錄
# 幫助文檔
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/CHANGES
/usr/share/doc/nginx-1.16.1/README
/usr/share/doc/nginx-1.16.1/README.dynamic
/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10
# 靜態(tài)資源目錄
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
# 存放Nginx日志文件
/var/log/nginx
# 開機配置
systemctl enable nginx # 開機自動啟動
systemctl disable nginx # 關(guān)閉開機自動啟動
# 啟動Nginx
systemctl start nginx # 啟動Nginx成功后,可以直接訪問主機IP,此時會展示Nginx默認頁面
# 停止Nginx
systemctl stop nginx
# 重啟Nginx
systemctl restart nginx
# 重新加載Nginx
systemctl reload nginx
# 查看 Nginx 運行狀態(tài)
systemctl status nginx
# 查看Nginx進程
ps -ef | grep nginx
# 殺死Nginx進程
kill -9 pid # 根據(jù)上面查看到的Nginx進程號,殺死Nginx進程,-9 表示強制結(jié)束進程
nginx -s reload # 向主進程發(fā)送信號,重新加載配置文件,熱重啟
nginx -s reopen # 重啟
Nginxnginx -s stop # 快速關(guān)閉
nginx -s quit # 等待工作進程處理完成后關(guān)閉
nginx -T # 查看當前 Nginx 最終的配置
nginx -t # 檢查配置是否有問題
Nginx 的配置文件結(jié)構(gòu)如下:
# main段配置信息
user nginx; # 運行用戶,默認即是nginx,可以不進行設(shè)置
worker_processes auto; # Nginx 進程數(shù),一般設(shè)置為和 CPU 核數(shù)一樣
error_log /var/log/nginx/error.log warn; # Nginx 的錯誤日志存放目錄
pid /var/run/nginx.pid; # Nginx 服務(wù)啟動時的 pid 存放位置
# events段配置信息
events {
use epoll; # 使用epoll的I/O模型(如果你不知道Nginx該使用哪種輪詢方法,會自動選擇一個最適合你操作系統(tǒng)的)
worker_connections 1024; # 每個進程允許最大并發(fā)數(shù)
}
# http段配置信息
# 配置使用最頻繁的部分,代理、緩存、日志定義等絕大多數(shù)功能和第三方模塊的配置都在這里設(shè)置
http {
# 設(shè)置日志模式
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; # Nginx訪問日志存放位置
sendfile on; # 開啟高效傳輸模式
tcp_nopush on; # 減少網(wǎng)絡(luò)報文段的數(shù)量
tcp_nodelay on;
keepalive_timeout 65; # 保持連接的時間,也叫超時時間,單位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; # 文件擴展名與類型映射表
default_type application/octet-stream; # 默認文件類型
include /etc/nginx/conf.d/*.conf; # 加載子配置項
# server段配置信息
server {
listen 80; # 配置監(jiān)聽的端口
server_name localhost; # 配置的域名
# location段配置信息
location / {
root /usr/share/nginx/html; # 網(wǎng)站根目錄
index index.html index.htm; # 默認首頁文件
deny 172.168.22.11; # 禁止訪問的ip地址,可以為all
allow 172.168.33.44;# 允許訪問的ip地址,可以為all
}
error_page 500 502 503 504 /50x.html; # 默認50x對應(yīng)的訪問頁面
error_page 400 404 error.html; # 同上
}
}
更多關(guān)于Nginx配置文件的介紹可以參考下列文章:
其實核心內(nèi)容主要是通過修改 Nginx 配置文件來進行調(diào)優(yōu)的!
在我們的日常工作學習中,我們會該如何去優(yōu)化自己的Nginx服務(wù)器?遇到以下問題我們該如何處理呢?
Nginx 是如何實現(xiàn)并發(fā)的?為什么 Nginx 不使用多線程?Nginx常見的優(yōu)化手段有哪些?502錯誤可能原因有哪些?這種面試問題你肯定是經(jīng)常被問到。
最后給大家分享2個基于HTTPS優(yōu)化案例:
介紹完了安裝、配置、優(yōu)化這些常用的場景之后,日志這塊也是非常重要的,大家都知道日常排錯,日志起著舉足輕重的作用。
Nginx日志主要分為兩種:access_log(訪問日志)和error_log(錯誤日志)。通過訪問日志我們可以得到用戶的IP地址、瀏覽器的信息,請求的處理時間等信息。錯誤日志記錄了訪問出錯的信息,可以幫助我們定位錯誤的原因。
error_log /var/log/nginx/error.log warn;
#配置錯誤日志的級別及存儲目錄
events {
worker_connections 1024;
}
http {
..................
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;
#配置訪問日志存儲目錄
}
由于nginx功能強大,性能突出,越來越多的web應(yīng)用采用nginx作為http和反向代理的web服務(wù)器。而nginx的訪問日志不管是做用戶行為分析還是安全分析都是非常重要的數(shù)據(jù)源之一。如何有效便捷的采集nginx的日志進行有效的分析成為大家關(guān)注的問題。
這里我們來聊一聊,在企業(yè)實際生產(chǎn)環(huán)境中經(jīng)常遇到的一個情況,如何升級Nginx到新的版本和如何回滾至舊版本。
版本升級其實就是針對二進制文件的升級,過程如下:
[root@nginx ~]# /usr/local/nginx-1.12.2/sbin/nginx -v
nginx version: nginx/1.12.2
[root@nginx ~]# cd /usr/local/nginx-1.12.2/sbin/
[root@nginx sbin]# mv nginx nginx-1.12.2
#首先備份原來的舊版本nginx二進制文件
[root@nginx sbin]# cp /usr/local/nginx-1.14.2/sbin/nginx ./
#拷貝新版本的二進制文件到當前目錄
注:其實升級新版本,最重要的就是平滑升級,讓前端用戶無感知(也就是不中斷服務(wù),這個其實不難,生產(chǎn)中多臺依次灰度升級)。
對于升級來說,最難的不是升級,而是回滾,因為在實際生產(chǎn)環(huán)境回滾的機率是存在,比如:新版本由于某些未知bug導(dǎo)致與現(xiàn)有應(yīng)用不兼容、或出現(xiàn)運行不穩(wěn)定的情況等等。
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器。反向代理是為服務(wù)端服務(wù)的,反向代理可以幫助服務(wù)器接收來自客戶端的請求,幫助服務(wù)器做請求轉(zhuǎn)發(fā),負載均衡等。
反向代理對服務(wù)端是透明的,對我們是非透明的,即我們并不知道自己訪問的是代理服務(wù)器,而服務(wù)器知道反向代理在為他服務(wù)。
http {
.............
upstream product_server{
127.0.0.1:8081;
}
upstream admin_server{
127.0.0.1:8082;
}
upstream test_server{
127.0.0.1:8083;
}
server {
#默認指向product的server
location / {
proxy_pass http://product_server;
}
location /product/{
proxy_pass http://product_server;
}
location /admin/ {
proxy_pass http://admin_server;
}
location /test/ {
proxy_pass http://test_server;
}
}
}
。nginx 每個location都是一個匹配目錄,nginx的策略是:訪問請求來時,會對訪問地址進行解析,從上到下逐個匹配,匹配上就執(zhí)行對應(yīng)location大括號中的策略,并根據(jù)策略對請求作出相應(yīng)。
nginx能實現(xiàn)負載均衡,什么是負載均衡呢?就是說應(yīng)用部署在不同的服務(wù)器上,但是通過統(tǒng)一的域名進入,nginx則對請求進行分發(fā),將請求分發(fā)到不同的服務(wù)器上去處理,這樣就可以有效的減輕了單臺服務(wù)器的壓力。
upstream server_pools {
server 192.168.1.11:8880 weight=5;
server 192.168.1.12:9990 weight=1;
server 192.168.1.13:8989 weight=6;
#weigth參數(shù)表示權(quán)值,權(quán)值越高被分配到的幾率越大
}
server {
listen 80;
server_name mingongge.com;
location / {
proxy_pass http://server_pools;
}
}
Nginx動靜分離是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動靜資源做好了拆分以后,我們就可以根據(jù)靜態(tài)資源的特點將其做緩存操作,這就是網(wǎng)站靜態(tài)化處理的核心思路。
server {
listen 80;
server_name mingongge.com;
location /static {
root /wwww/web/web_static_site;
}
}
也可以使用下面的方法
location /image {
alias /web/nginx/static/image/;
}
注意:使用alias末尾一定要添加/,并且它只能位于location中
使用前后端分離后,可以很大程度提升靜態(tài)資源的訪問速度,即使動態(tài)服務(wù)不可用,靜態(tài)資源的訪問也不會受到影響。
location / {
return 404; #直接返回狀態(tài)碼
}
location / {
return 404 "pages not found"; #返回狀態(tài)碼 + 一段文本
}
location / {
return 302 /blog ; #返回狀態(tài)碼 + 重定向地址
}
location / {
return https://www.mingongge.com ; #返回重定向地址
}
示例如下
server {
listen 80;
server_name www.mingongge.com;
return 301 http://mingongge.com$request_uri;
}
server {
listen 80;
server_name www.mingongge.com;
location /cn-url {
return 301 http://mingongge.com.cn;
}
}
server{
listen 80;
server_name mingongge.com; # 要在本地hosts文件進行配置
root html;
location /search {
rewrite ^/(.*) https://www.mingongge.com redirect;
}
location /images {
rewrite /images/(.*) /pics/$1;
}
location /pics {
rewrite /pics/(.*) /photos/$1;
}
location /photos {
}
}
需求:將生產(chǎn)環(huán)境的流量拷貝到預(yù)上線環(huán)境或測試環(huán)境,這樣做有很多好處,比如:
Nginx按請求速率限速模塊使用的是漏桶算法,即能夠強行保證請求的實時處理速度不會超過設(shè)置的閾值。
Nginx官方版本限制IP的連接和并發(fā)分別有兩個模塊:
Nginx 緩存作為性能優(yōu)化的一個重要手段,可以極大減輕后端服務(wù)器的負載。下面我們將介紹 Nginx 緩存配置的相關(guān)指令以及 http 緩存機制,以及 Nginx 緩存實踐案例分析。
執(zhí)行過程:
看了 nginx 的訪問日志,發(fā)現(xiàn)每天有好多國外的 IP 地址來訪問我的網(wǎng)站,并且訪問的內(nèi)容基本上都是惡意的。因此我決定禁止國外 IP 來訪問我的網(wǎng)站
Keepalived軟件起初是專為LVS負載均衡軟件設(shè)計的,用來管理并監(jiān)控LVS集群系統(tǒng)中各個服務(wù)節(jié)點的狀態(tài),后來又加入了可以實現(xiàn)高可用的VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗余協(xié)議)功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作為其他服務(wù)(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件。keepalived高可用集群服務(wù)
介紹用來提高Nginx服務(wù)器的安全性,穩(wěn)定性和性能的12種操作。
監(jiān)控Web服務(wù)器對于查看網(wǎng)站上發(fā)生的情況至關(guān)重要。關(guān)注最多的便是日志變動,查看實時日志文件變動大家第一反應(yīng)應(yīng)該是'tail -f /path/to/log'命令吧,但是如果每個網(wǎng)站的訪問日志都是使用這種方式查看也是相當崩潰的,今天小編就跟大家分享一個強大的Nginx日志監(jiān)控工具。
日常生產(chǎn)環(huán)境搭建了Nginx集群后,就需要繼續(xù)深入研究的就是日常Nginx監(jiān)控。Nginx如何監(jiān)控?相信百度就可以找到:nginx-status
通過Nginx-status,實時獲取到Nginx監(jiān)控數(shù)據(jù)后,如何和現(xiàn)有監(jiān)控系統(tǒng)集成?一個很好的解決方案:Nginx+Telegraf+Influxdb+Grafana
即通過Telegraf監(jiān)控插件定時收集Nginx的監(jiān)控狀態(tài),存儲到時序數(shù)據(jù)庫Influxdb中,然后通過Grafana展現(xiàn)即可。
這是我發(fā)現(xiàn)的又一款管理神器,可以實現(xiàn)配置管理,和性能監(jiān)控。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流