windows nginx站点分割日志_Nginx 基础用途拾遗
本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要注明來源。 署名 4.0 國際 (CC BY 4.0)
本文作者: 蘇洋
創建時間: 2020年05月20日 統計字數: 5175字 閱讀時間: 11分鐘閱讀 本文鏈接: https://soulteary.com/2020/05/20/nginx-basic-use-supplement.html
Nginx 基礎用途拾遺
Nginx 是一款大家日常在熟悉不過的軟件,穩定高效是這款軟件的標簽。日常使用中常見 Nginx 做為地址轉發服務和提供文件托管能力。但是 Nginx 的用法其實不止于此,原生 Nginx 還有許多實用的功能,能夠實現一些業務中麻煩的小細節。
本文將介紹三種基礎用法,如果你熟悉 Nginx 和容器,閱讀時間大概是五分鐘。
寫在前面
本次使用的示例環境,均使用容器進行模擬。如果你對容器還不是很熟悉,歡迎瀏覽之前的Docker 相關文章內容。
配合 compose 輕松創建健康檢查
一些前端類的容器,本身并沒有服務能力,但是為了能夠享受容器服務的基礎健康檢查,以及提供給外部諸如負載均衡等服務使用,我們可能不得不啟動一個語言運行時,比如 Node / PHP / Java,不過如果你使用 Nginx 作為前端使用的 Web 服務軟件,他本身就自帶了基礎的路由功能和定制響應碼和內容的能量,可以避免我們引入龐大的語言運行時。
我們只需要在配置內添加一個名為 /health 的路由,然后配合 default_type 和 return 指令就可以完成我們想要的“當服務健康時,返回HTTP CODE 200,并輸出一些內容”。
server {listen 80;location = /health {access_log off;default_type text/html;return 200 'alive';} }你或許會說,我們可以讓健康檢查軟件檢查業務路由,但是我想告訴你的是,當我們把路由獨立之后,你會發現健康檢查的響應時間更快了,除此之外,我們還可以對日志進行丟棄。如果你將健康檢查路由和業務路由放在一起,海量的健康檢查日志和業務日志在一起,會讓你調試的時候痛不欲生。
配合 compose 進行健康檢查也很容易:
version: "3.6"services:health.test.soulteary.com:image: nginx:1.18.0-alpinevolumes:- ./default.conf:/etc/nginx/conf.d/default.conf:rohealthcheck:# 老版本使用# test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:80/health || exit 1"]test: ["CMD-SHELL", "curl -f localhost/health || exit 1"]interval: 3sretries: 12當你使用 docker ps 查看容器進程的時候,你會看到我們的容器會標記為“healthy”,之后可以配合各種策略進行容器服務基礎容災等基本操作。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2afd71cd562e nginx:1.18.0-alpine "nginx -g 'daemon of…" 10 minutes ago Up 3 seconds (healthy) 80/tcp health.test.soulteary.com_1使用 Nginx 聚合不同站點內容
日常開發過程中,在遇到“前端跨域”、“短信模版中鏈接固定”、“既有程序調用來源限制”等場景下,會遇到需要聚合站點域名或路徑的情況。
我們知道使用編程語言,可以實現遠程內容獲取和轉寫,但是實際上使用 Nginx 的反向代理功能可以更加輕松地做到內容聚合。
比如,在做內容聚合前,我們需要訪問的內容在 http://apple.test.soulteary.com 和 http://banana.test.soulteary.com ,而我們希望聚合后的內容在 http://test.soulteary.com 中展示。
為了方便模擬環境,我們先創建一個 compose 配置文件:
version: "3.6"services:test.soulteary.com:image: nginx:1.18.0-alpineports:- 8080:8080volumes:- ./default.conf:/etc/nginx/conf.d/default.conf:roapple.test.soulteary.com:image: nginx:1.18.0-alpinevolumes:- ./apple.test.soulteary.com.conf:/etc/nginx/conf.d/default.conf:robanana.test.soulteary.com:image: nginx:1.18.0-alpinevolumes:- ./banana.test.soulteary.com.conf:/etc/nginx/conf.d/default.conf:ro配置文件中的 services 的三個子項分別代表聚合后的站點,以及兩個需要被聚合的站點,可以想象為現實中網絡相通的三臺服務器。
繼續創建 apple.test.soulteary.com.conf 這個 Nginx 配置文件。
server {listen 80;server_name apple.test.soulteary.com;default_type text/html;location / {return 200 'apple.test.soulteary.com';} }可以看到,站點功能很簡單,訪問 / 的時候,返回 HTTP CODE 200,并輸出文本內容 apple.test.soulteary.com,同理我們創建另外一個站點的 Nginx 配置文件 banana.test.soulteary.com。
最后,創建用于聚合配置文件的 Nginx 配置。
server {listen 8080;server_name test.soulteary.com;location = / {return 302 /apple;}location /apple {proxy_pass http://apple.test.soulteary.com/;proxy_set_header Host "apple.test.soulteary.com";proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location /banana {proxy_pass http://banana.test.soulteary.com/;proxy_set_header Host "banana.test.soulteary.com";proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;} }可以看到配置十分簡單,通過 proxy_pass 配合 proxy_set_header 兩個指令,我們就將不同站點聚合到了一塊。
將 test.soulteary.com 綁定至本地,然后啟動服務,使用命令行訪問站點,可以看到配置符合預期。
# curl http://test.soulteary.com:8080/apple apple.test.soulteary.com# curl http://test.soulteary.com:8080/banana banana.test.soulteary.com轉發 Git SSH 這類 TCP 請求
Nginx 除了能夠處理 HTTP 請求外,對于 TCP 類型的數據一樣能做到聚合/轉發。比如這里我們想將生產環境的某臺 GitLab 的訪問權限限制到具體的 IP,除了使用云平臺的防火墻規則外,使用 Nginx 一樣可以做到。
這里要使用的是 Nginx 的 ngx_stream_proxy_module 模塊。
Nginx 容器默認配置僅包含了 HTTP 服務模式,所以這次修改不能和上面一樣,僅修改 “vhost” 配置,需要修改 nginx.conf 主配置,在修改之前,我們先使用腳本看看默認的配置長什么樣。
docker run --rm -it nginx:1.18.0-alpine cat /etc/nginx/nginx.conf執行上面的命令,可以看到默認的配置很簡單:
user nginx; worker_processes auto;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include /etc/nginx/mime.types;default_type application/octet-stream;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; }為了能夠讓讀者輕松驗證,我們假設目標倉庫是 GitHub,在對配置文件簡單修改后:
user nginx; worker_processes auto;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {worker_connections 1024; }stream{server{listen 2223;proxy_pass github.com:22;proxy_connect_timeout 10s;proxy_timeout 20s;proxy_buffer_size 512k;} }我們繼續創建一個 compose 配置文件:
version: "3.6"services:proxy-git.test.soulteary.com:image: nginx:1.18.0-alpineports:- 2223:2223volumes:- ./nginx.conf:/etc/nginx/nginx.conf:ro使用 docker-compose up 將服務啟動之后,我們使用經典的 Git 測試命令行對服務進行驗證:
# ssh -T git@127.0.0.1 -p 2223 The authenticity of host '[127.0.0.1]:2223 ([127.0.0.1]:2223)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added '[127.0.0.1]:2223' (RSA) to the list of known hosts.Hi soulteary! You've successfully authenticated, but GitHub does not provide shell access.你會發現此刻我們想要的目標已經達到了,不信的話,你可以使用相同命令去測試下原始 Git 服務地址。
# ssh -T git@github.com Hi soulteary! You've successfully authenticated, but GitHub does not provide shell access.小節開始前提過,想進行來源限制,可以搭配 Nginx 原生的 allow / deny 指令來完成:
location / {deny 192.168.1.1;allow 192.168.1.0/24;allow 10.1.1.0/16;allow 2001:0db8::/32;deny all; }最后
Nginx 好玩、實用的用法其實還有不少,時間原因,就不在此展開了。
--EOF
我現在有一個小小的折騰群,里面聚集了一些喜歡折騰的小伙伴。
在不發廣告的情況下,我們在里面會一起聊聊軟件、HomeLab、編程上的一些問題,也會在群里不定期的分享一些技術沙龍的資料。
喜歡折騰的小伙伴歡迎掃碼添加好友。(請注明來源和目的,否則不會通過審核)
蘇洋:關于折騰群入群的那些事?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的windows nginx站点分割日志_Nginx 基础用途拾遗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity两个项目合并 同名_从实际项目
- 下一篇: vs2017运行显示系统找不到指定的文件