標簽:nginx
建站分享COS對象存儲和CI數據萬象未開啟CDN,但是卻有CDN回源流量
發現的問題對象存儲簡稱COS,數據萬象簡稱CI。由于5月數據萬象突然征收“CDN回源流量費”,由于先森圖片請求量不大,且還是需要使用數據萬象的圖片處理功能,所以先森在CDN->COS的中間加了一個Nginx做反向代理,由于Nginx所在的服務器和先森的COS存儲桶是同地域的,所以服務器到COS的流量是內網,因此講道理COS和CI都不會產生CDN回源流量了。但是,先森過了幾天又來看數據萬象控制臺,發現每天還是有產生CDN回源流量,先森這波就無語了,明明都沒用CDN了,怎么還會有CDN回源流量呢,這不是無中生有么。數據萬象控制臺問題原因定位經過排查確認,是由于先森的Nginx直接透傳了CDN的回源請求,導致COS和CI判定流量是來自CDN回源。。。先森在服務器上進行抓包確認。同一個圖片,CDN回源到CVM服務器:抓包:CDN回源到CVM服務器CVM回源到COS:抓包:CVM回源到COS可以看到,CDN回源到CVM比較有特殊性的請求頭是以下兩個,在CVM請求到COS時也是帶著的: X-NWS-LOG-UUID: 630013543448005765 X-Tencent-Ua: Qcloud那么,就要想辦法把這兩個請求頭去掉,不讓其透傳。去除Nginx請求頭先森百度了一下,Nginx內置的模塊中沒有刪除指定請求頭的,只能編譯增加headers-more-nginx-module模塊。先森圖省事,服務器安裝了寶塔,Nginx是通過寶塔安裝的。看了一下,寶塔安裝的Nginx不像Redis等軟件,可以在網頁上動態添加支持模塊,只能命令行編譯添加模塊。當然編譯之前需要看一下寶塔的Nginx會不會已經很好心的幫忙編譯了headers-more-nginx-module。查看Nginx已經安裝的模塊 ./sbin/nginx -V nginx version: nginx/1.22.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.1.1o 3 May 2022 TLS SNI support enabled configure arguments: --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module肉眼可見的,并沒有headers-more-nginx-module模塊,只能重新編譯一下了。由于寶塔編譯的Nginx沒有留configure文件,所以先森參考這篇文章:寶塔面板安裝的Nginx(已安裝)如何添加echo-nginx-module模塊,操作了一下編譯。其中,有一些點需要注意一下。1、模塊的下載地址,下載后解壓得到的目錄,就是編譯時指定的目錄: wget https://github.com/openresty/headers-more-nginx-module/archive/refs/tags/v0.33.tar.gz tar -zxvf v0.33.tar.gz -C /www/server/module/ ls /www/server/module/headers-more-nginx-module-0.332、下載的模塊目錄不要放在/www/server/nginx目錄下,使用先森參考的這個方法寶塔在更新Nginx時會清空該目錄;修改反向代理配置文件進入寶塔的網站配置頁,找到反向代理的配置文件,增加想要去除的請求頭即可。 more_clear_input_headers "X-Tencent-Ua"; more_clear_input_headers "X-NWS-LOG-UUID";修改反向代理配置重新抓包確認請求頭沒有透傳修改好了之后,重新抓個包,看看請求頭還有沒有透傳。CDN回源到CVM服務器,可以看到這兩個請求頭還是在的(肯定在,先森又沒刪)。CDN回源到CVM然后再看CVM服務器訪問COS的請求頭,指定清除的兩個請求頭已經沒有了。先森只是剛改好,由于數據萬象的控制臺對于“CDN回源流量”的監控粒度是1天,所以起碼要明天才能看到效果,希望有效。
系統運維, 經驗雜筆CentOS 7中的Nginx控制腳本
先森安裝Nginx都是編譯安裝,所以不像yum安裝的自帶控制腳本,也就是不能通過service nignx start這種方式啟動Nginx。不過在CentOS 6中,Nginx的啟動腳本早已備好,增加控制腳本輕輕松松。不過,先森公司的客戶要求新的服務器全用CentOS 7的操作系統,如此一來,先森之前的控制腳本就沒用了。雖然先森當初培訓的時候學習的就是RedHat 7,但是參加工作以來,一直使用的CentOS 6的操作系統,早已把7版本的命令習慣忘完。先森覺得,CentOS 6和CentOS 7的變化最明顯的就是控制服務啟動關閉的命令,由service換成了systemctl。雖然在CentOS 7中service命令依舊可以用,但是使用的效果已經大打折扣了。在網上找了半天,想要找到與CentOS 6類似的控制腳本,用service啟動的,但是效果差強人意,甚至可以說無效。最后終于找到了使用systemctl的控制腳本,下面分享一波。控制腳本第一步:編輯vim /usr/lib/systemd/system/nginx.service文件,添加以下內容:注意要修改nginx的目錄,先森的是放在默認的/usr/local/nginx中。[Unit]Description=nginx - high performance web serverDocumentation=http://nginx.org/en/docs/After=network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.confExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target第二步:添加可執行權限:chmod 755 /usr/lib/systemd/system/nginx.service第三步:添加開機啟動:systemctl enable nginx控制Nginx:systemctl start nginx # 啟動Nginxsystemctl stop nginx # 關閉Nginxsystemctl status nginx # 查看Nginx狀態總結唉,CentOS 7咋用咋不習慣,但是系統版本的升級總是大勢所趨,還是得慢慢習慣。運維的路,還很長。
腳本編程, 系統運維, 經驗雜筆Nginx日志切割
Nginx日志默認情況下統統寫入到一個文件中,文件會變的越來越大,非常不方便查看分析,也會造成服務器硬盤占用越來越大。我們通常是每天對Nginx的日志做切割。Nginx日志切割方法有很多種,本文主要講的是用shell腳本對日志壓縮切割。Nginx日志切割-單個日志有時候我們的日志只有兩個,一個access的,一個error的。可能只有access的日志比較大,通常錯誤日志又不會太大,那么需求只對access的日志進行切割。這時候用這個單個日志切割的腳本即可,優點是比較簡單。#!/bin/shcd /usr/local/nginx/logs/#壓縮并按日期命名access.log日志tar -zcvf log_history/access_`date +%Y%m%d`.log.tar.gz access.log#刪除源日志rm -fr access.log#刪除15天前的切割日志find /usr/local/nginx/logs/ -name "*.log.tar.gz" -type f -mtime +15 -exec rm {} \; > /dev/null 2>&1#向 Nginx 的進程發送 USR1 信號以重新打開日志文件killall -s USR1 nginxNginx日志切割-多個日志若Nginx配置了虛擬主機等會保存多個日志的,可能還需要對多個日志進行切割,那么就可以使用以下腳本進行多個日志切割。#!/bin/shif [ ! -d /usr/local/nginx/logs/log_history ]; then mkdir /usr/local/nginx/logs/log_historyficd /usr/local/nginx/logs/array=(access error host.access host.error host.ssl-access host.ssl-error)for data in ${array[@]} dotar -zcvf log_history/${data}_`date +%Y%m%d`.log.tar.gz ${data}.log >> /dev/nullrm -fr ${data}.log donefind /usr/local/nginx/logs/log_history/ -name "*.log.tar.gz" -type f -mtime +15 -exec rm {} \; > /dev/null 2>&1killall -s USR1 nginxNginx日志切割-定時任務無論是單個日志切割,還是多個日志切割,都需要使用cron服務定期執行該腳本,下面設置成的是每晚23點59執行,這樣nginx訪問日志正好記錄的是全天的訪問記錄。#crontab -e59 23 * * * /usr/local/nginx/logs/nginx_access_log.sh定時任務
系統運維, 經驗雜筆解決Nginx報錯The plain HTTP request was sent to HTTPS port
先森給現網業務搭建了Nginx做反向代理服務,包括http協議和https協議,結果申請公網IP后訪問發現報錯“The plain HTTP request was sent to HTTPS port”。經過一番研究后解決了問題,這里做個記錄。Nginx 400錯誤解決問題解決方式1:使用https://ip:port/*方式訪問,如果直接ip:port/*則是http協議,所以會報錯The plain HTTP request was sent to HTTPS port(普通的HTTP請求被發送到HTTPS端口)解決方式2:打開配置文件,查看HTTPS server段的配置:修改前:server { listen 443 ssl; server_name localhost; ...}修改方式,將監聽端口后的“ssl”刪除,即:server { listen 443; server_name localhost; ...}這樣再直接用ip:port/*訪問則不會再報The plain HTTP request was sent to HTTPS port錯誤了。

川公網安備 51011202000104號