1、隐藏nginx header版本号
[root@ocbsap01 tmp]# curl -I 192.168.56.102:1983
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Thu, 20 Jul 2017 06:41:49 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 19 Jul 2017 07:46:59 GMT
Connection: keep-alive
ETag: "596f0e73-264"
Accept-Ranges: bytes
編譯nginx.conf配置檔案,添加server_tokens off參數
http {
...
server_tokens off; #控制http response header内的服務版本資訊的顯示,以及錯誤資訊中web服務版本資訊
}
[root@ocbsap01 ~]# curl -I 192.168.10.128:1983
Server: nginx
Date: Tue, 25 Jul 2017 15:48:00 GMT
Last-Modified: Mon, 24 Jul 2017 16:16:38 GMT
ETag: "59761d66-264"
2、更改源碼隐藏軟體名稱需要修改三個nginx源碼檔案
第一個nginx-1.12.1/src/core/nginx.h檔案
[root@ocbsap01 core]# pwd
/tmp/nginx-1.12.1/src/core
[root@ocbsap01 core]# vim nginx.h #将如下參數修改自定義的内容
#define NGINX_VERSION "1.12.1" #改成你想要的版本号,如2.4.2
#define NGINX_VER "nginx/" NGINX_VERSION #你想改成的軟體名稱,如Apache
#define NGINX_VAR "NGINX" #可以改成OWS等
第二個
vim /tmp/nginx-1.12.1/src/httpngx_http_header_filter_module.c
将這條static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
改成static u_char ngx_http_server_string[] = "Server: OWS" CRLF;
或者使用一條指令修改替換
[root@ocbsap01 nginx-1.12.1]# sed -i 's#Server: nginx#Server: OWS#g' src/http/ngx_http_header_filter_module.c
第三個ngx_http_special_response.c是否對外展示敏感資訊
[root@ocbsap01 nginx-1.12.1]# sed -n '21,30p' src/http/ngx_http_special_response.c
static u_char ngx_http_error_full_tail[] =
"<hr><center>" NGINX_VER "</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;
static u_char ngx_http_error_build_tail[] =
"<hr><center>" NGINX_VER_BUILD "</center>" CRLF
修改為如下
"<hr><center>" NGINX_VER " (http://www.baidu.com)</center>" CRLF
"<hr><center>OWS</center>" CRLF
重新編譯安裝nginx,重新開機服務
3、更改nginx預設使用者及使用者組 (建議是使用普通使用者安裝可參考我第一篇安裝文檔)
[root@ocbsap01 nginx-1.12.1]# grep '#user' /application/nginx/conf/nginx.conf.default
#user nobody; #系統預設的使用者為nobody
[root@ocbsap01 nginx-1.12.1]# useradd ocbs -s /sbin/nologin -M #建立使用者ocbs
user ocbs ocbs; #nginx.conf 中配置使用者
也可以在編譯時加入使用者和使用者組,如
--user=ocbs --group=ocbs --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.12.1/
[root@ocbsap01 nginx-1.12.1]# ps -ef|grep nginx|grep -v grep
root 1386 1 0 Jul21 ? 00:00:00 nginx: master process /home/ocbs/sbin/nginx
ocbs 24732 1386 0 23:19 ? 00:00:00 nginx: worker process
#此時worker process程序就是使用的ocbs使用者權限,master依舊是root使用者
4、配置nginx worker程序個數
worker_processes 4; #最好為伺服器CPU的邏輯核心數
[root@ocbsap01 /]# grep "cpu cores" /proc/cpuinfo|uniq #單個實體CPU 邏輯核數
cpu cores : 1
[root@ocbsap01 /]# grep "processor" /proc/cpuinfo|wc -l #邏輯核心數
1
[root@ocbsap01 /]# grep "physical id" /proc/cpuinfo|sort|uniq|wc -l #實體CPU個數
5、根據CPU核數進行nginx程序優化
親和力參數(Nginx服務可能會發生隻在同一顆CPU上起作用的情況)有幾個core就有幾位0 其中1表示運作第幾個上面
worker_processes 8;
worker_cpu_affinity 0001 0010 0100 1000; #數字代表1、2、3、4的掩碼,平均分攤程序壓力
worker_cpu_affinity 00000001 00000010...#8核心寫法
防止程序隻在一個核心上運作也可以使用 taskset 指令
taskset -c 1,2,3 /home/ocbs/sbin/nginx start
6、nginx事件處理模型優化
nginx的連接配接處理機制在不同的作業系統中會采用不同的I/O模型:Linux上使用epoll、BSD上面用kqueue、Solaris中使用/dev/poll、windows中使用icop.
events {
use epoll; #nginx官方建議,可以不指定事件處理模型,Nginx會自動選擇最佳的事件處理模型
7、調整Nginx worker單個worker_processes程序允許的用戶端最大連接配接數
worker_connections 1024;
#最大連接配接數Max_client = worker_processes * worker_connections
#程序的最大連接配接數收Linux系統程序的最大打開檔案數限制,在執行作業系統指令“ulimit -HSn 65535”後,才能生效
#連接配接數并不是越大越好,要在系統性能能接受的範圍内
8、配置Nginx worker程序最大打開檔案數
worker_rlimit_nofile 65535; #該值可設定為系統優化後的ulimit -HSn的結果
9、開啟高效的檔案傳輸模式
sendfile on; #開啟檔案的高效傳輸模式
#同時将tcp_nopush和tcp_nodelay兩個指令設定為on,減少網絡傳輸包數量、防止網絡及磁盤的I/O阻塞,提升Nginx效率
其中tcp_nopush 預設為on
10、設定連接配接逾時時間
keepalive_timeout 65; #設定用戶端連接配接保持會話的逾時時間
tcp_nodelay on; #激活tcp_nodelay,提高I/O性能,在包含keepalive參數時才有效
client_header_timeout 15; #讀取用戶端請求頭資料逾時時間,逾時則傳回“Request time out(408)”
clietn_body_timeout 15; #讀取用戶端請求主體逾時時間
send_timeout 15; #指定用戶端響應時間
#将無用的連接配接盡快設定為逾時,可以保護伺服器的系統資源(CPU、記憶體、磁盤)
11、上傳檔案大小設定(動态應用)
client_max_body_size 10m; #具體數字要根據業務需求決定
12、fastcgi調優(配合PHP引擎動态服務)
fastcgi作為靜态服務和動态服務之間的傳接口,也有cache和buffer緩存和緩沖區
fastcgi_connect_timeout 240; #連接配接到後端fastcgi的逾時時間
fastcgi_send_timeout 240; #已經和fastcgi建立連接配接後多久不傳送資料,就會被斷開
fastcgi_read_timeout 240; #接收fastcgi應答的逾時時間
fastcgi_buffer_size 64k; #指定讀取fastcgi應答第一部分需要多大的緩沖區,可以設定為gastcgi_buffers選項指定的緩沖區大小
fastcgi_busy_buffers_size 128k; #繁忙時的buffer,可以是fastcgi_buffer的兩倍
fastcgi_temp_path /data/ngx_fcgi_tmp; #在寫入fastcgi_temp_path時将用多大的資料庫,預設是fastcgi_buffer的兩倍,如果太小,可能會報502 Bad GateWay
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; #指定相關參數配比
在server标簽中配合設定相關參數
server {
location ~ .*\.(php|php5)?$ {
root html/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache ngx_fcgi_cache; #表示開啟緩存并為其指定一個名稱,開啟緩存非常有用,可以有效降低cpu的負載,并且防止502的發生,但是也可能會帶來其他問題
fastcgi_cache_valid 200 302 1h; #将對應的應答碼緩存時間
fastcgi_cache_valid 301 1d; #将301緩存1天
fastcgi_cache_valid any 1m; #将其他應答緩存1分鐘
fastcgi_cache_min_uses 1; #請求數量
fastcgi_cache_use_stale error timeout invalid_header http_500; #錯誤判斷
}
}
13、配置nginx gzip壓縮功能
###(重要!!!)幾k位元組的壓縮比在大資料量的沖擊下也可以節省不少的流量,網站内容傳輸速度更快,為使用者帶來更好的浏覽體驗
Nginx gzip壓縮子產品提供了壓縮檔案内容的功能,使用者請求的内容在發送到使用者用戶端之前,Nginx伺服器會根據一些具體的政策實施壓縮,到用戶端後由浏覽器解壓
Nginx 依賴ngx_http_gzip_module子產品
Apache 使用mod_deflate壓縮功能
gzip on; #開啟壓縮功能
gzip_min_length 1k; #允許壓縮的最小頁面位元組數,從header頭的Content-Length中擷取,不管頁面多大都進行壓縮,建議設定成大于1K,如果小于1K可能會越壓縮越大
gzip_http_version 1.1; #壓縮版本,預設為1.1,目前大部分浏覽器都支援壓縮
gzip_buffers 4 32k; #壓縮緩沖大小,允許申請4個機關為32K的記憶體作為流緩存
gzip_comp_level 9; #壓縮比例,1最小,9最大,傳輸速度最快,但是比較消耗資源
gzip_types text/css text/xml application/javascript; #指定壓縮的内容類型
gzip_vary on; #vary header支援,讓前端的緩存伺服器繼續緩存傳輸該壓縮頁面,而不提前解壓
14、配置Nginx expires緩存功能
重要!!!)
在網站的開發和營運過程中,視訊、圖檔、CSS、JS等網站元素的更改機會較少,我們可以将這些更改頻率較少的内容緩存在使用者本地,
使用者在第二次通路網站時就不用繼續去伺服器下載下傳了,節省流量,加快通路速度
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ #指定緩存檔案的類型
{
expires 3650d; #指定緩存時間
location ~ .*\.(js|css)?$
expires 3d;
expires緩存的缺點就是在網站更新相關資料後,使用者如果不清理緩存看到的就會一直是過期的資料,為了解決這個問題可以使用如下方法:
a、縮短緩存時間,比如百度的首頁圖檔緩存時間為一天;
b、服務背景更改圖檔名稱,這樣就相當于是一個新的頁面内容,使用者會重新下載下傳
c、相關的CSS、JS推送到CDN
15、Nginx日志相關優化與安全
1)每天進行日志切割,備份
#!/bin/sh
cd /home/ocbs/log/
mv access.log ocbs.access_$(date +%F -d -1day).log
mv blog_access.log blog.access_$(date +%F -d -1day).log
/home/ocbs/sbin/nginx -s reload
cat >>/var/spool/cron/root<<EOF
00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1
EOF
2)不記錄不需要的通路日志
對于健康檢查或者某些圖檔、JS、CSS日志,一般不需要記錄日志,因為在統計PV時是按照頁面計算的,而且寫入頻繁會消耗IO,降低伺服器性能
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
3)通路日志的權限設定
chown -R root:root /application/nginx/logs
chmod -R 700 /application/logs
16、Nginx站點目錄及檔案URL通路控制(防止惡意解析)
1)根據擴充名限制程式或者檔案被通路
資源檔案夾如使用者上傳的頭像,防止惡意上傳腳本病毒檔案被解析執行
location ~ ^/images/.*\.(php|php5|sh|pl|py)$ { #指定目錄限制通路
deny all;
location ~ ^/static/.*\.(php|php5|sh|pl|py)$ {
location ~ ^/data/.*\.(php|php5|sh|pl|py)$ {
location ~ .*\.(php|php5)?$ { #必須配置在解析之前
2)禁止通路目錄并傳回指定HTTP代碼
location /admin/ { return 404; }
3)限制網站來源IP
location ~ ^/admin/ {
allow 202.111.12.211;
#allow 192.168.1.0/24; #也可以限制IP段
企業問題案列:Nginx做方向代理的時候可以限制用戶端IP嗎?
方法一:用if來控制
屏蔽:
if ( $remotea_addr = 10.0.0.110 ) {
return 403;
允許:
if ( $remotea_addr = 10.0.0.111 ) {
set $allow_access_root 'true';
方法二:利用deny和allow
location / {
root html/blog;
index index.php index.html index.html;
deny 10.0.0.7;
allow all;
17、防止惡意解析通路企業網站
方法一:
listen 80 default_server;
server_name _;
return 501;
方法二:
rewrite ^(.*) http://www.lichengbing.cn$1 permanent;
方法三:
if ($host !~ ^www/.lichengbing/.com$) {
18、Nginx圖檔及目錄防盜鍊
網站圖檔被盜鍊最直接的影響就是網絡帶寬占用加大了,寬帶費用變高了,網絡流量忽高忽低,監控頻繁告警
由于購買了CDN加速,流量高了好幾個G,瞬間損失好幾萬...
利用referer防盜鍊
location ~.* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers none blocked *.lichengbing.cn lichengbing.cn;
if ($invalid_referer) {
rewrite ^/ http://www.lichengbing.cn/img/nolink.jpg
}
#或者也可以使用NginxHttpAccessKeyModule實作防盜鍊
19、Nginx錯誤頁面的優雅顯示
error_page 403 /403.html; #當出現403錯誤時,會跳轉到403.html頁面
20、Nginx防爬蟲優化
robots.txt機器人協定
網絡爬蟲排除标準,告訴搜尋引擎哪些目錄可以抓取,哪些禁止抓取
禁止下載下傳協定代理
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
return 403;
防止N多爬蟲代理通路網站
if ($http_user_agent ~*
“qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot”) {
return 403;
禁止不同浏覽器通路
if ($http_user_agent ~* “Firefox|MSIE”)
{
rewrite ^(.*) http://blog.etiantian.org/$1 permanent
21 、限制HTTP請求方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501;
22、防DOS攻擊
使用limit_conn_zone進行控制,控制單個IP或域名的通路次數,限制連續通路
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_remote_addr zone=perserver:10m;
limit_conn perip 10;
limit_conn perserver 100;
#還可以使用limit_req_zone進行控制,控制單個IP的通路速率
23、Nginx程式架構優化
解耦,一堆程式代碼按照業務用途分開,然後提供服務,例如:注冊登入、上傳、下載下傳、浏覽清單、商品内容、訂單支付等都應該是獨立的程式服務,
隻不過在用戶端看來是一個整體而已,小公司最起碼要做到的解耦是
01網頁頁面服務
02圖檔附件及下載下傳服務
03上傳圖檔服務
24、使用普通使用者安裝啟動Nginx(監牢模式),尤其是在銀行等金融機關要求是AP必須運作在普通使用者上
降級思想,Nginx的Master程序使用的是root使用者,worker程序使用的是nginx指定的普通使用者,
用root跑nginx的Master程序有兩大問題:
1、是最小化權限配置設定遇到問題;
2、網站一旦有漏洞,很容易丢掉root權限
降級執行的好處:
1、建立普通使用者ocbs,用ocbs跑Nginx服務,開發運維都使用普通帳号,隻要和ocbs同組,照樣可以管理nginx,還解決了root權限太大問題
2、職責分明,相關賬号負責維護程式和日志,出問題負首要責任
備注:以上是個人學習并整理的,一般正規運維機關都有一套針對自己環境優化方式,切不可生搬硬套。如需要優化需要針對性的靈活處理
本文轉自 yuri_cto 51CTO部落格,原文連結:http://blog.51cto.com/laobaiv1/1951049,如需轉載請自行聯系原作者