Nginx快速入門
Nginx作用
- 動(dòng)靜分離
- 反向代理
- 負(fù)載均衡
- ...
概念理解
正向代理
正向代理,意思是一個(gè)位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個(gè)請求并指定目標(biāo)(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端。
正向代理是為我們服務(wù)的,即為客戶端服務(wù)的,客戶端可以根據(jù)正向代理訪問到它本身無法訪問到的服務(wù)器資源。正向代理對我們是透明的,對服務(wù)端是非透明的,即服務(wù)端并不知道自己收到的是來自代理的訪問還是來自真實(shí)客戶端的訪問。不理解是吧,上圖!

反向代理
反向代理*(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端,此時(shí)代理服務(wù)器對外就表現(xiàn)為一個(gè)反向代理服務(wù)器。
反向代理是為服務(wù)端服務(wù)的,反向代理可以幫助服務(wù)器接收來自客戶端的請求,幫助服務(wù)器做請求轉(zhuǎn)發(fā),負(fù)載均衡等。
反向代理對服務(wù)端是透明的,對我們是非透明的,即我們并不知道自己訪問的是代理服務(wù)器,而服務(wù)器知道反向代理在為他服務(wù)。
反向代理的優(yōu)勢:
- 隱藏真實(shí)服務(wù)器
- 負(fù)載均衡便于橫向擴(kuò)充后端動(dòng)態(tài)服務(wù)
- 動(dòng)靜分離,提升系統(tǒng)健壯性

動(dòng)靜分離
動(dòng)動(dòng)靜分離,在我們的軟件開發(fā)中,有些請求是需要后臺處理的,有些請求是不需要經(jīng)過后臺處理的(如:css、html、jpg、js等等文件),這些不需要經(jīng)過后臺處理的文件稱為靜態(tài)文件。讓動(dòng)態(tài)網(wǎng)站里的動(dòng)態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動(dòng)靜資源做好了拆分以后,我們就可以根據(jù)靜態(tài)資源的特點(diǎn)將其做緩存操作。提高資源響應(yīng)的速度。

一般來說,都需要將動(dòng)態(tài)資源和靜態(tài)資源分開,由于 Nginx 的高并發(fā)和靜態(tài)資源緩存等特性,經(jīng)常將靜態(tài)資源部署在 Nginx 上。如果請求的是靜態(tài)資源,直接到靜態(tài)資源目錄獲取資源,如果是動(dòng)態(tài)資源的請求,則利用反向代理的原理,把請求轉(zhuǎn)發(fā)給對應(yīng)后臺應(yīng)用去處理,從而實(shí)現(xiàn)動(dòng)靜分離。
使用前后端分離后,可以很大程度提升靜態(tài)資源的訪問速度,即使動(dòng)態(tài)服務(wù)不可用,靜態(tài)資源的訪問也不會受到影響。
負(fù)載均衡
一般情況下,客戶端發(fā)送多個(gè)請求到服務(wù)器,服務(wù)器處理請求,其中一部分可能要操作一些資源比如數(shù)據(jù)庫、靜態(tài)資源等,服務(wù)器處理完畢后,再將結(jié)果返回給客戶端。
這種模式對于早期的系統(tǒng)來說,功能要求不復(fù)雜,且并發(fā)請求相對較少的情況下還能勝任,成本也低。隨著信息數(shù)量不斷增長,訪問量和數(shù)據(jù)量飛速增長,以及系統(tǒng)業(yè)務(wù)復(fù)雜度持續(xù)增加,這種做法已無法滿足要求,并發(fā)量特別大時(shí),服務(wù)器容易崩。
很明顯這是由于服務(wù)器性能的瓶頸造成的問題,除了堆機(jī)器之外,最重要的做法就是負(fù)載均衡。
請求爆發(fā)式增長的情況下,單個(gè)機(jī)器性能再強(qiáng)勁也無法滿足要求了,這個(gè)時(shí)候集群的概念產(chǎn)生了,單個(gè)服務(wù)器解決不了的問題,可以使用多個(gè)服務(wù)器,然后將請求分發(fā)到各個(gè)服務(wù)器上,將負(fù)載分發(fā)到不同的服務(wù)器,這就是負(fù)載均衡,核心是「分?jǐn)倝毫Α埂?Nginx 實(shí)現(xiàn)負(fù)載均衡,一般來說指的是將請求轉(zhuǎn)發(fā)給服務(wù)器集群。

Nginx 實(shí)現(xiàn)負(fù)載均衡的策略:
- 輪詢策略:默認(rèn)情況下采用的策略,將所有客戶端請求輪詢分配給服務(wù)端。這種策略是可以正常工作的,但是如果其中某一臺服務(wù)器壓力太大,出現(xiàn)延遲,會影響所有分配在這臺服務(wù)器下的用戶。
- 最小連接數(shù)策略:將請求優(yōu)先分配給壓力較小的服務(wù)器,它可以平衡每個(gè)隊(duì)列的長度,并避免向壓力大的服務(wù)器添加更多的請求。
- 最快響應(yīng)時(shí)間策略:優(yōu)先分配給響應(yīng)時(shí)間最短的服務(wù)器。
- 客戶端
ip綁定策略:來自同一個(gè)ip的請求永遠(yuǎn)只分配一臺服務(wù)器,有效解決了動(dòng)態(tài)網(wǎng)頁存在的session共享問題。



如何安裝
1、安裝gcc
安裝 nginx 需要先將官網(wǎng)下載的源碼進(jìn)行編譯,編譯依賴 gcc 環(huán)境,如果沒有 gcc 環(huán)境,則需要安裝:
yum install gcc-c++
2、PCRE pcre-devel 安裝
PCRE(Perl Compatible Regular Expressions) 是一個(gè)Perl庫,包括 perl 兼容的正則表達(dá)式庫。nginx 的 http 模塊使用 pcre 來解析正則表達(dá)式,所以需要在 linux 上安裝 pcre 庫,pcre-devel 是使用 pcre 開發(fā)的一個(gè)二次開發(fā)庫。nginx也需要此庫。命令:
yum install -y pcre pcre-devel
3、zlib 安裝
zlib 庫提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內(nèi)容進(jìn)行 gzip ,所以需要在 Centos 上安裝 zlib 庫。
yum install -y zlib zlib-devel
4、OpenSSL 安裝
OpenSSL 是一個(gè)強(qiáng)大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及 SSL 協(xié)議,并提供豐富的應(yīng)用程序供測試或其它目的使用。
nginx 不僅支持 http 協(xié)議,還支持 https(即在ssl協(xié)議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫。
yum install -y openssl openssl-devel
5、下載安裝包
手動(dòng)下載.tar.gz安裝包,地址:https://nginx.org/en/download.html
下載完上傳到/root里。
6、解壓
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
7、配置
使用默認(rèn)配置,在nginx根目錄下執(zhí)行
./configure
make
make install
查找安裝路徑: whereis nginx
Nginx常用命令
systemctl 系統(tǒng)命令:
# 開機(jī)配置
systemctl enable nginx # 開機(jī)自動(dòng)啟動(dòng)
systemctl disable nginx # 關(guān)閉開機(jī)自動(dòng)啟動(dòng)
# 啟動(dòng)Nginx
systemctl start nginx # 啟動(dòng)Nginx成功后,可以直接訪問主機(jī)IP,此時(shí)會展示Nginx默認(rèn)頁面
# 停止Nginx
systemctl stop nginx
# 重啟Nginx
systemctl restart nginx
# 重新加載Nginx
systemctl reload nginx
# 查看 Nginx 運(yùn)行狀態(tài)
systemctl status nginx
# 查看Nginx進(jìn)程
ps -ef | grep nginx
# 殺死Nginx進(jìn)程
kill -9 pid # 根據(jù)上面查看到的Nginx進(jìn)程號,殺死Nginx進(jìn)程,-9 表示強(qiáng)制結(jié)束進(jìn)程
Nginx 應(yīng)用程序命令:
nginx -s reload # 向主進(jìn)程發(fā)送信號,重新加載配置文件,熱重啟
nginx -s reopen # 重啟 Nginx
nginx -s stop # 快速關(guān)閉
nginx -s quit # 等待工作進(jìn)程處理完成后關(guān)閉
nginx -T # 查看當(dāng)前 Nginx 最終的配置
nginx -t # 檢查配置是否有問題
注意:如何連接不上,檢查阿里云安全組是否開放端口,或者服務(wù)器防火墻是否開放端口!
相關(guān)命令:
# 開啟
service firewalld start
# 重啟
service firewalld restart
# 關(guān)閉
service firewalld stop
# 查看防火墻規(guī)則
firewall-cmd --list-all
# 查詢端口是否開放
firewall-cmd --query-port=8080/tcp
# 開放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重啟防火墻(修改配置后要重啟防火墻)
firewall-cmd --reload
# 參數(shù)解釋
1、firwall-cmd:是Linux提供的操作firewall的一個(gè)工具;
2、--permanent:表示設(shè)置為持久;
3、--add-port:標(biāo)識添加的端口;
Nginx 配置
# user 指定運(yùn)行 nginx 的用戶和組(第一個(gè)參數(shù)為用戶第二個(gè)為組,這里只有用戶)
#user nobody;
# 指定工作進(jìn)程數(shù)(一般設(shè)置為CPU核數(shù))
worker_processes 1;
# 指定錯(cuò)誤日志為 logs/ 目錄下的 error.log 文件
#error_log logs/error.log;
# 指定錯(cuò)誤日志,并指定寫入格式為 notice
#error_log logs/error.log notice;
# 指定錯(cuò)誤日志,并指定寫入格式為 info
#error_log logs/error.log info;
# 指定 pid 文件(存放主進(jìn)程 pid 號)
#pid logs/nginx.pid;
# nginx 連接配置模塊
events {
# 指定每個(gè)工作進(jìn)程最大連接數(shù)為 1024
worker_connections 1024;
}
# http 配置模塊
http {
# 通過 include 加載 mime.types 文件,里面的 types {} 模塊將文件擴(kuò)展名映射到響應(yīng)的 MIME 類型
include mime.types;
# 定義響應(yīng)的默認(rèn) MIME 類型
default_type application/octet-stream;
# 寫入格式 main 的內(nèi)容格式如下
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 指定訪問日志和寫入格式為 main
#access_log logs/access.log main;
# 啟用或者禁用 sendfile()
sendfile on;
# 啟用或者禁用使用套接字選項(xiàng)(僅在 sendfile 使用時(shí)使用)
#tcp_nopush on;
# 0 值禁用保持活動(dòng)的客戶端連接
#keepalive_timeout 0;
# 65 s 超時(shí)
keepalive_timeout 65;
# 啟用或者禁用 gzip
#gzip on;
# 虛擬主機(jī)配置模塊
server {
# 監(jiān)聽 80 端口
listen 80;
# 監(jiān)聽域名為 localhost
server_name localhost;
# 將指定的 charset 添加到 “Content-Type” 響應(yīng)頭字段。如果此charset與source_charset指令中指定的charset不同,則執(zhí)行轉(zhuǎn)換。
#charset koi8-r;
# 指定該虛擬主機(jī)的訪問日志
#access_log logs/host.access.log main;
# 將特定的文件或目錄重新定位,如 php 文件,image 目錄等
location / {
# 設(shè)置請求的根目錄
root html;
# 定義索引,按順序匹配
index index.html index.htm;
}
# 定義顯示 404 錯(cuò)誤的 uri
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
# location 精準(zhǔn)匹配 '/50x.html'
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
# 正則表達(dá)式匹配 php 文件
#location ~ \.php$ {
# 設(shè)置代理服務(wù)器的協(xié)議和地址,以及應(yīng)該映射位置的可選URI。作為協(xié)議,可以指定“http”或“https”。該地址可以指定為一個(gè)域名或IP地址,以及一個(gè)可選端口
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# 設(shè)置 FastCGI 服務(wù)器的地址。地址可以指定為一個(gè)域名或 IP 地址,以及一個(gè)端口
# fastcgi_pass 127.0.0.1:9000;
# 設(shè)置將在以斜杠結(jié)尾的URI之后追加的文件名,
# fastcgi_index index.php;
# 設(shè)置一個(gè)應(yīng)該傳遞給FastCGI服務(wù)器的參數(shù)。
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# 加載 conf/fastcgi_params 文件
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
# ssl 配置,要啟用 ssl 模塊需要在編譯 nginx 時(shí)加上 --with-http_ssl_module 參數(shù)
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}