什么是Nginx?
Nginx是一款免費(fèi)開(kāi)源的高性能HTTP服務(wù)器
以及反向代理服務(wù)器
(Reverse Proxy),同時(shí)可以提供IMAP/POP3/SMATP代理服務(wù)等功能。能夠快速的響應(yīng)靜態(tài)頁(yè)面請(qǐng)求和支持第三方功能模塊擴(kuò)展弄诲。
Nginx的優(yōu)點(diǎn)
- 高并發(fā)易遣、高性能(官方給出的并發(fā)數(shù)據(jù)5萬(wàn)济竹,實(shí)際中可以達(dá)到2-4萬(wàn))
- 輕量級(jí)趴荸、內(nèi)存消耗少
- 穩(wěn)定性高晌梨,宕機(jī)概率低
- 支持熱部署
- 模塊化設(shè)計(jì)钙姊,擴(kuò)展性較好
- cpu親和
Nginx常用的場(chǎng)景
- 靜態(tài)資源服務(wù)器
- 動(dòng)態(tài)匹配
- 反向代理
- Gzip壓縮
- 負(fù)載均衡
Nginx的安裝配置
mac下鏡像飛速安裝Homebrew教程: https://zhuanlan.zhihu.com/p/90508170
$ brew install nginx
Nginx常用的命令
- 啟動(dòng):
nginx
- 查看版本號(hào):
nginx -v
- 查看nginx 編譯的參數(shù):
nginx -V
- 重新啟動(dòng)nginx:
nginx -s reload
- 優(yōu)雅重啟毯辅,并重新載入配置文件nginx.conf:
/usr/local/nginx/sbin/nginx -s reload
- 優(yōu)雅停止nginx,有連接時(shí)會(huì)等連接請(qǐng)求完成再殺死worker進(jìn)程
/usr/local/nginx/sbin/nginx -s quit
具體常用的命令參考如下:
nginx -s stop 快速關(guān)閉Nginx煞额,可能不保存相關(guān)信息思恐,并迅速終止web服務(wù)。
nginx -s quit 平穩(wěn)關(guān)閉Nginx膊毁,保存相關(guān)信息胀莹,有安排的結(jié)束web服務(wù)。
nginx -s reload 因改變了Nginx相關(guān)配置婚温,需要重新加載配置而重載描焰。
nginx -s reopen 重新打開(kāi)日志文件。
nginx -c filename 為 Nginx 指定一個(gè)配置文件栅螟,來(lái)代替缺省的荆秦。
nginx -t 不運(yùn)行逆日,僅測(cè)試配置文件。nginx 將檢查配置文件的語(yǔ)法的正確性萄凤,并嘗試打開(kāi)配置文件中所引用到的文件室抽。
nginx -v 顯示 nginx 的版本。
nginx -V 顯示 nginx 的版本靡努,編譯器版本和配置參數(shù)坪圾。
成功看到歡迎頁(yè)面~!(對(duì)應(yīng)的html是/usr/local/var/www/index.html)
Nginx的默認(rèn)配置
Nginx 安裝目錄下的nginx.conf就是Nginx全局的配置文件惑朦,我們主要修改這里的內(nèi)容兽泄。nginx.conf.default作為配置文件的備份。
nginx默認(rèn)使用8080端口 如果發(fā)現(xiàn)端口被占用了漾月,可以殺掉使用使用改端口的進(jìn)程病梢,也可以修改/usr/local/etc/nginx/nginx.conf
下的
http {
server {
listen 8181;
server_name localhost;
#charset koi8-r;
.....
}
}
其中nginx.conf
中的配置信息如下:
#user nobody;
#設(shè)置工作進(jìn)程的數(shù)量
worker_processes 1;
#錯(cuò)誤日志存放目錄
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#進(jìn)程pid存放位置
#pid logs/nginx.pid;
# 處理連接
events {
# 設(shè)置連接數(shù),單個(gè)后臺(tái)進(jìn)程的最大并發(fā)數(shù)
worker_connections 1024;
}
http {
# 文件拓展名查找集合
include mime.types;
# 當(dāng)查找不到對(duì)應(yīng)類型的時(shí)候默認(rèn)值
default_type application/octet-stream;
# 日志格式,定義別名為 main
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#nginx訪問(wèn)日志存放位置
#access_log logs/access.log main;
# 調(diào)用 sendfile 系統(tǒng)傳輸文件
sendfile on; #開(kāi)啟高效傳輸模式
#tcp_nopush on; #減少網(wǎng)絡(luò)報(bào)文段的數(shù)量
# 客戶端與服務(wù)器連接超時(shí)時(shí)間梁肿,超時(shí)自動(dòng)斷開(kāi)
#keepalive_timeout 0;
keepalive_timeout 65;
# 開(kāi)啟gizip 壓縮
#gzip on;
# 虛擬主機(jī)
server {
listen 8181;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 路由
location / {
root html;
index index.html index.htm;
#第一種情況 拒絕訪問(wèn)ip地址段為 50-100 的ip訪問(wèn)
deny 192.168.10.50/100;
# 第二種情況 只允許ip地址為 192.168.10.50 的ip訪問(wèn)
allow 192.168.10.50;
deny all;
# 第三種情況 這樣配置都不能訪問(wèn)蜓陌,從上到下依次匹配
deny all;
allow 192.168.10.50;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# 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;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# 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
#
#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;
# }
#}
include servers/*;
}
搭建靜態(tài)站點(diǎn)
# 虛擬主機(jī)server塊
server {
# 端口
listen 8080;
# 匹配請(qǐng)求中的host值
server_name localhost;
# 監(jiān)聽(tīng)請(qǐng)求路徑
location / {
# 查找目錄
root /source;
# 默認(rèn)查找
index index.html index.htm;
}
}
字段說(shuō)明:
- server 配置虛擬主機(jī)的相關(guān)參數(shù),可以有多個(gè)
- server_name 通過(guò)請(qǐng)求中的host值 找到對(duì)應(yīng)的虛擬主機(jī)的配置
- location 配置請(qǐng)求路由吩蔑,處理相關(guān)頁(yè)面情況
- root 查找資源的路徑
配置完成后執(zhí)行 nginx -t
看是否有錯(cuò)誤钮热,如果看到的是下面這種就是成功了
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
然后執(zhí)行nginx -s reload
更新Nginx配置文件,這時(shí)候打開(kāi)瀏覽器 輸入 localhost:8080 應(yīng)該就能看到你的頁(yè)面了。
動(dòng)態(tài)匹配(請(qǐng)求過(guò)濾)
通常在開(kāi)發(fā)環(huán)境或者測(cè)試環(huán)境的時(shí)候呢我們修改了代碼烛芬,因?yàn)闉g覽器緩存隧期,可能不會(huì)生效,需要手動(dòng)清除緩存赘娄,才能看到修改后的效果仆潮,這里我們做一個(gè)配置讓瀏覽器不緩存相關(guān)的資源。
location ~* \.(js|css|png|jpg|gif)$ {
add_header Cache-Control no-store;
}
~* .(js|css|png|jpg|gif)$
是匹配以相關(guān)文件類型然后單獨(dú)處理遣臼。 add_header
是給請(qǐng)求的響應(yīng)加上一個(gè)頭信息Cache-Control no-store
性置,告知瀏覽器禁用緩存,每次都從服務(wù)器獲取 效果如下:
匹配規(guī)則
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
location =|~|~*|^~| /uri/
- = 表示精確匹配暑诸。只有請(qǐng)求的url路徑與后面的字符串完全相等時(shí)蚌讼,才會(huì)命中(優(yōu)先級(jí)最高)。
- ^~ 表示如果該符號(hào)后面的字符是最佳匹配个榕,采用該規(guī)則,不再進(jìn)行后續(xù)的查找芥喇。
- ~ 表示該規(guī)則是使用正則定義的西采,區(qū)分大小寫。
- ~* 表示該規(guī)則是使用正則定義的继控,不區(qū)分大小寫械馆。
- / 通用匹配胖眷,任何請(qǐng)求都會(huì)匹配到
通過(guò)狀態(tài)碼來(lái)過(guò)濾請(qǐng)求
# 通過(guò)狀態(tài)碼,返回指定的錯(cuò)誤頁(yè)面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /source/error_page;
}
反向代理解決跨域
在前后端分離的開(kāi)發(fā)中霹崎,跨域問(wèn)題是一個(gè)非常常見(jiàn)的問(wèn)題珊搀,現(xiàn)在解決跨域問(wèn)題比較常用的兩種方式為:
- 跨域資源請(qǐng)求(CORS)
-
Nginx反向代理
先來(lái)看上面的圖 ,當(dāng)用戶請(qǐng)求xx.720ui.com/server1的時(shí)候尾菇,Nginx會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給Server1這個(gè)服務(wù)器上的具體應(yīng)用境析,從而達(dá)到跨域的目的
同時(shí)nginx解決跨域時(shí)常用的參數(shù)配置。
location /api {
# 請(qǐng)求host傳給后端
proxy_set_header Host $http_host;
# 請(qǐng)求ip 傳給后端
proxy_set_header X-Real-IP $remote_addr;
# 請(qǐng)求協(xié)議傳給后端
proxy_set_header X-Scheme $scheme;
# 路徑重寫
rewrite /api/(.*) /$1 break;
# 代理服務(wù)器
proxy_pass http://localhost:9000;
}
- 攔截路徑/api, 可以通過(guò)正則匹配
- proxy_set_header 允許重新定義或添加字段傳遞給代理服務(wù)器的請(qǐng)求頭
-
$http_host
scheme 為Nginx內(nèi)置變量 - rewrite 根據(jù)rewrite后的請(qǐng)求URI劳淆,將路徑重寫,如:接口路徑為 /user, 我們可以請(qǐng)求 /api/user默赂。(為什么需要重寫uri沛鸵?因?yàn)樵谑褂肗ginx做反向代理的時(shí)候,需要匹配到跨域的接口再做轉(zhuǎn)發(fā)缆八,為了方便匹配曲掰,會(huì)人為的在原接口中添加一段路徑(或標(biāo)示, 如例子中的api)奈辰,因此需要在匹配之后蜈缤、轉(zhuǎn)發(fā)之前把添加的那段去掉,因此需要rewrite)
- break 繼續(xù)本次請(qǐng)求后面的處理 ,停止匹配下面的location冯挎。需要注意的是與之類似的last執(zhí)行過(guò)程則是停止當(dāng)前這個(gè)請(qǐng)求底哥,并根據(jù)rewrite匹配的規(guī)則重新發(fā)起一個(gè)請(qǐng)求,從上到下依次匹配location后面的規(guī)則
- proxy_pass 代理服務(wù)器
原理:Nginx攔截到相關(guān)匹配規(guī)則, Nginx再將請(qǐng)求轉(zhuǎn)發(fā)到http://localhost:9090房官,Nginx得到請(qǐng)求后再響應(yīng)到前端趾徽,可以直接請(qǐng)求/api/user完成請(qǐng)求。
nginx跨域請(qǐng)求一個(gè)簡(jiǎn)單的dome:
server
{
listen 80;
server_name www.1212.com;
location ^~ /blog/ {
proxy_pass http://blog.12121.com/;
}
}
總結(jié):大功告成????????????????????????????????????????
參考鏈接: