最近在公司進行API網關重寫,公司內採用serverMesh進行服務註冊,調用,這裏結合以前學習對API網關服務進行簡單的總結與分析。html
因爲採用了大量的nginx相關的東西,因此在此記錄一下:nginx
配置鏈接數git
worker_processes:表示開啓nginx的worker進程的個數,nginx啓動會開兩種進程,master進程用來管理調度,worker進程用來處理請求,github
優化手段,算法
方法一:worker_processes auto;瀏覽器
表示設置服務器cpu核數匹配開啓nginx開啓的worker進程數緩存
查看cpu核數:cat /proc/cpuinfobash
方法二:nginx設置cpu親和力【進行手動設置】服務器
worker_processes 8;負載均衡
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
00000001表示啓用第一個CPU內核,00000010表示啓用第二個CPU內核,以此類推
這種設置方法更高效,因將每一個cpu核提供給固定的worker進程服務,減小cpu上下文切換帶來的資源浪費
好比,2核CPU,開啓2個進程,設置以下
worker_processes 2; worker_cpu_affinity 01 10;
好比:4核CPU,開啓4個進程,設置以下
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
網關功能之一 :日誌
使用log_format指令進行配置文件格式
nginx的log_format有不少可選的參數用於指示服務器的活動狀態,默認的是:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
192.168.31.247 - - [11/Apr/2019:16:26:43 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3350.0 Safari/537.36" "-"
參數說明
參數 說明 示例 $remote_addr 客戶端地址 211.28.65.253 $remote_user 客戶端用戶名稱 -- $time_local 訪問時間和時區 11/Apr/2019:16:26:43 +0800 $request 請求的URI和HTTP協議 "GET /article-10000.html HTTP/1.1" $http_host 請求地址,即瀏覽器中你輸入的地址(IP或域名) www.wang.com 192.168.100.100 $status HTTP請求狀態 200 $upstream_status upstream狀態 200 $body_bytes_sent 發送給客戶端文件內容大小 1547 $http_referer url跳轉來源 https://www.baidu.com/ $http_user_agent 用戶終端瀏覽器等信息 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C; $ssl_protocol SSL協議版本 TLSv1 $ssl_cipher 交換數據中的算法 RC4-SHA $upstream_addr 後臺upstream的地址,即真正提供服務的主機地址 10.10.10.100:80 $request_time 整個請求的總時間 0.205 $upstream_response_time 請求過程當中,upstream響應時間 0.002 $http_x_forwarded_for 是反向代理服務器轉發客戶端地址的參數
假設將Nginx服務器做爲Web服務器,位於負載均衡設備、Squid、Nginx反向代理以後,不能獲取到客戶端的真實IP地址了。
緣由是通過反向代理後,因爲在客戶端和Web服務器之間增長了中間層,所以Web服務器沒法直接拿到客戶端的IP。
經過$remote_addr變量拿到的將是反向代理服務器的IP地址。
可是,反向代理服務器在轉發請求的HTTP頭信息中,能夠增長X-Forwarded-For信息,用以記錄原有的客戶端IP地址和原來客戶端請求的服務器地址。
這時候,要用log_format指令設置日誌格式,讓日誌記錄X-Forearded-For信息中的IP地址,即客戶的真實IP。
日誌文件路徑配置
access_log指令
語法: access_log path [format [buffer=size [flush=time]]];
access_log path format gzip[=level] [buffer=size] [flush=time];
access_log off;
默認值: access_log logs/access.log combined;
配置段:
gzip : 壓縮等級。
buffer : 設置內存緩存區大小。
flush : 保存在緩存區中的最長時間。
access_log off : 不記錄日誌:
使用默認combined格式記錄日誌:access_log logs/access.log 或 access_log logs/access.log combined;
值得注意的是,Nginx進程設置的用戶和組必須對日誌路徑有建立文件的權限,不然,會報錯。
此外,對於每一條日誌記錄,都將是先打開文件,再寫入日誌,而後關閉。可使用open_log_file_cache來設置日誌文件緩存(默認是off)。
3)日誌文件切割
server1.log
----> server1-2019-04-09.log
----> server1-2019-04-10.log
----> server1-2019-04-11.log
經過mv命令 把當前log文件重命令
再用信號控制指令 發送重讀日誌指令 產生了新的日誌log文件
能夠利用sh腳本的方式執行日誌分割,在天天凌晨執行一個計劃任務 調用sh腳本,就完成的系統自動切割日誌文件
例如腳本:
# touch cutlog.sh腳本 # vi cutlog.sh #!/bin/bash LOGS_PATH=/usr/local/nginx/logs YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid) # 向 Nginx 主進程發送 USR1 信號。USR1 信號是從新打開日誌文件
設定定時任務:
設置定時任務 # vi /etc/crontab 0 0 * * * root /usr/local/nginx/logs/cutlog.sh
nginx模塊安裝
查看nginx安裝的現有模塊指令
/usr/local/nginx/sbin/nginx -V nginx version: nginx/1.13.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) configure arguments:
下載須要的echo模塊
https://github.com/openresty/echo-nginx-module/tags # wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz # tar zxvf v0.61.tar.gz # mv echo-nginx-module-0.61 nginx-tools/
從新編譯nginx,安裝echo-nginx模塊
進入nginx源文件,從新編譯
# ./configure --add-module=nginx安裝目錄下面/echo-nginx-module-0.61 #安裝echo模塊(文件夾名echo-nginx-module-0.61) # make
平滑升級 nginx
備份一下舊的nginx
# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
# cp -f objs/nginx /usr/local/nginx/sbin/nginx
平滑升級:
# make upgrade
# make clean (清除編譯產生的文件)
echo用法舉例:
location /module { echo 'hello world'; } -------------------- location /module { echo_exec /set; } location /set { set $foo 'hello world'; #自定義變量 echo "$request_uri"; #顯示nginx全局變量的內容 echo $foo; }