nginx基本優化

優化服務器進程

優化進程個數javascript

全局配置>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>php

worker_processes 4; #官方建議設置爲cpu的總核數css

# ../sbin/nginx -s reloadhtml

[root@c1 conf]# ps -ef|grep nginx|grep -Ev "grep|php-fpm" java

root 6544 1 0 Apr16 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx node

nginx 8067 6544 0 07:26 ? 00:00:00 nginx: worker process linux

nginx 8068 6544 0 07:26 ? 00:00:00 nginx: worker process nginx

nginx 8069 6544 0 07:26 ? 00:00:00 nginx: worker process git

nginx 8070 6544 0 07:26 ? 00:00:00 nginx: worker process web

"worker_processes 4"可知,worker進程數爲4.nginx master主進程不包含在內,master爲管理進程,負責調度和管理worker進程

綁定不一樣的nginx進程到不一樣的cpu上

默認狀況下,nginx的多個進程可能跑到某一個cpu或cpu的某一個核上,致使nginx進程使用硬件的資源不均。此節優化是儘量地分配 不一樣的nginx進程給不一樣的cpu處理,達到充分有效利用硬件的多cpu多核資源的目的

worker_processes 4;

worker_cpu_affinity 0001 0010 0100 1000;

這裏的0001 0010 0100 1000是掩碼,分別表明第一、二、三、4核cpu,因爲worker_processes進程數爲4,所以,上述配置會把每一個進程 一核cpu處理,默認狀況下不會綁定任何cpu,參數位置爲main段

配置nginx worker進程最大打開文件數

worker_rlimit_nofile 65535; 能夠設置系統優化後的ulimit -HSn的結果,放置在main段

I/O事件配置>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

優化nginx時間處理模型

nginx的鏈接處理機制在不一樣的操做系統會採用不一樣的I/O模型,在Linux下,nginx使用epoll的I/O多路複用模型,在FreeBSD使用kqueue的I/O多路複用,在Solaris中使用/dev/poll方式,在Windows中使用的是icop等等

events {

#設置用於複用客戶端線程的輪詢方法。若是你使用Linux 2.6+,你應該使用epoll。若是你使用*BSD

use epoll;

#告訴nginx收到一個新鏈接通知後接受盡量多的鏈接

multi_accept on;

#調整nginx單個進程容許的客戶端最大鏈接數

worker_connections 20480;

}

worker_connections用於定義nginx每一個進程的最大鏈接數,默認是1024。nginx總併發鏈接數=worker數量*worker_connections,進程的最大鏈接數受linux系統進程的最大文件數限制,在執行操做系統命令「ulimit -HSn 65535」或配置相應文件後,worker_connections設置才能生效

HTTP配置>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

隱藏版本號信息

隱藏版本號 在nginx配置文件nginx.conf中的http標籤段內加入"server_tokens off;"參數,而後重載配置文件

http {

......

#隱藏 Nginx 的版本號,提升安全性。

server_tokens off;

#開啓高效文件傳輸模式,sendfile 指令指定 Nginx 是否調用sendfile 函數來輸出文件,對於普通應用設爲 on,若是用來進行下載等應用磁盤 IO 重負載應用,可設置爲 off,以平衡磁盤與網絡 I/O 處理速度,下降系統的負載。
  

sendfile on;

 #告訴 Nginx 在一個數據包裏發送全部頭文件,而不一個接一個的發送
  

tcp_nopush on;

 #告訴 Nginx 不要緩存數據,而是一段一段的發送--當須要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能當即獲得返回值。Nginx 默認會始終工做在 tcp nopush 狀態下。可是當開啓前面的 sendfile on; 時,它的工做特色是 nopush 的最後一個包會自動轉轉換到 nopush off。爲了減少那200ms的延遲,開啓 nodelay on; 將其很快傳送出去。結論就是 sendfile on; 開啓時,tcp_nopush 和 tcp_nodelay 都是on 是能夠的。
  

tcp_nodelay on;

 

}

修改軟件名稱及版本號

修改版本號須要在編譯安裝前

下載nginx並解壓後,對源碼進行修改,源碼文件都在二級目錄nginx-1.8.0/src/下,找到文件src/core/nginx.h, 而後按照下面的代碼中指出的兩行(粗體)進行修改

# cat nginx.h

......

#define NGINX_VERSION "1.8.0"

#define NGINX_VER "nginx/" NGINX_VERSION

.......

對於粗體部分能夠隨意修改

開啓高效文本傳輸模式

sendfile 參數用於開啓文件的高效傳輸模式。同時將tcp_nopush和tcp_nodelay兩個指令設置爲on,能夠防止網絡及磁盤I/0阻塞,提高nginx工做效率

能夠放置的標籤段[http ,server, location, if in location]

sendfile on; 提升靜態文件讀取效率

tcp_nopush on; 在sendfile開啓的狀況下,提升網絡包的傳輸效率,把多個包整合一次性發送出去

tcp_nodelay on; 和tcp_nopush對應的,在keepalive鏈接下,提升網絡包的傳輸實時性

站點目錄文件及目錄權限優化

爲了保證網站不遭受木馬入侵,全部站點目錄的用戶和組都應該爲root,全部的目錄權限是755(默認)全部的文件權限是644(默認)

以上的權限設置能夠防止黑客上傳木馬,以及修改站點文件,可是,合理的網站用戶上傳的內容也會被拒絕。那麼如何讓合法的用戶能夠上傳文件,而又不至於被黑客利用攻擊呢?

若是是單機的環境,站點目錄和文件屬性設置以下:

全部的目錄權限設置爲755

全部的文件權限設置爲644

全部的目錄,以及文件用戶和組都是root

把用戶上傳資源的目錄設置爲755,將用戶和組設置爲nginx服務的用戶

最後針對上傳資源的目錄作資源訪問限制

 

將timeout設低來防止DOS攻擊
全部這些聲明均可以放到主配置文件中

client_body_timeout 10;         #讀取請求實體的超時時間,若超過所設定的大小,返回413錯誤

client_header_timeout 10;     #讀取請求頭的超時時間,若超過所設定的大小,返回408錯誤

keepalive_timeout 55;       #設置客戶端鏈接保持活動的超時時間,在超過這個時間以後,服務器會被關閉

send_timeout 10;

限制用戶鏈接數來預防DOS攻擊(無驗證)

limit_zone slimits $binary_remote_addr 5m;     #limit_zone只能定義在http做用域

#slimits:聲明一個limit_zone的名字

#$binary_remote_addr:變量

#5m:會話狀態存儲的空間

limit_conn slimits 5;     #限制客戶端併發鏈接數爲5

在配置文件中設置自定義緩存以限制緩衝區溢出攻擊的可能性

client_body_buffer_size 1K;                           

client_header_buffer_size 1k;

client_max_body_size 1k;                                  #限制請求體的大小,若超過所設定的大小,返回413錯誤

large_client_header_buffers 2 1k;                     #

#日誌格式設定
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  #定義訪問日誌,設置爲 off 能夠關閉日誌,提升性能
  access_log /var/log/nginx/access.log main;
 

send_timeout 60;#鏈接超時後將經過向客戶端發送RST包來直接重置鏈接。這個選項打開後,Nginx會在某個鏈接超時後,不是使用正常情形下的四次握手關閉TCP鏈接,而是直接向用戶發送RST重置包,再也不等待用戶的應答,直接釋放Nginx服務器上關於這個套接字使用的全部緩存(如TCP滑動窗口)。相比正常的關閉方式,它使得服務器避免產生許多處於FIN_WAIT_一、FIN_WAIT_二、TIME_WAIT狀態的TCP鏈接。注意,使用RST重置包關閉鏈接會帶來一些問題,默認狀況下不會開啓。
  

reset_timedout_connection off;#要限制鏈接,必須先有一個容器對鏈接進行計數,"zone=" 是給它一個名字,能夠隨便叫,這個名字要跟下面的 limit_conn 一致。$binary_remote_addr 用二進制來儲存客戶端的地址,1m 能夠儲存 32000 個併發會話。

  

limit_conn_zone $binary_remote_addr zone=addr:5m;    #給定的key設置最大鏈接數。這裏key是addr,咱們設置的值是100,也就是說咱們

limit_conn one 100; #容許每個IP地址最多同時打開有100個鏈接。

limit_rate_after 10 m;下載文件前10m大小不限速,大於後限速100k

limit_rate 100k;     限制下載速度100K

 
  #include 是一個在當前文件中包含另外一個文件內容的指令。這裏咱們使用它來加載文件擴展名與文件類型映射表。nginx根據映射關係,設置http請求響應頭的Content-Type值。當在映射表找不到時,使用nginx.conf中default-type指定的默認值。
  

include /etc/nginx/mime.types;

 
  #設置文件使用的默認的MIME-type
  default_type text/html;
 
  #默認編碼
  charset UTF-8;
 
  #該模塊能夠讀取預先壓縮的gz文件,這樣能夠減小每次請求進行gzip壓縮的CPU資源消耗。該模塊啓用後,nginx首先檢查是否存在請求靜態文件的gz結尾的文件,若是有則直接返回該gz文件內容。
  gzip_static off; 
 
  #開啓 gzip 壓縮。
  gzip on;
 
  # 禁用客戶端爲 IE6 時的 gzip功能。
  gzip_disable "msie6";
 
  #Nginx作爲反向代理的時候啓用。可選值:off|expired|no-cache|no-sotre|private|no_last_modified|no_etag|auth|any
  gzip_proxied any;
 
  #設置容許壓縮的頁面最小字節數,頁面字節數從header頭中的Content-Length中進行獲取。建議設置成大於1k的字節數,小於1k可能會越壓越大。
  gzip_min_length 1024;
 
  #設置數據的壓縮等級。這個等級能夠是1-9之間的任意數值,9是最慢可是壓縮比最大的。
  gzip_comp_level 5;
 
  #設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。 例如 4 4k 表明以4k爲單位,按照原始數據大小以4k爲單位的4倍申請內存。若是沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲gzip壓縮結果。
  gzip_buffers 4 16k;
 
  #設置須要壓縮的數據格式。Nginx默認只對text/html進行壓縮。
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
 
  #爲打開文件指定緩存,默認是沒有啓用的,max 指定緩存數量,建議和打開文件數一致,inactive 是指通過多長時間文件沒被請求後刪除緩存。
  

open_file_cache max=65535 inactive=30s;

 
  #多長時間檢查一次緩存的有效信息
  

open_file_cache_valid 30s;

 
  #open_file_cache指令中的inactive參數時間內文件的最少使用次數,若是超過這個數字,文件描述符一直是在緩存中打開的。出現 Last-Modified 不變的狀況,就是由於當nginx對一個靜態文件緩存後,若是30s內還在訪問它,那麼它的緩存就一直存在,直到30s內你不訪問了爲止。
  open_file_cache_min_uses 2;
  #是否記錄cache錯誤
  open_file_cache_errors on;
 
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;

 

SERVER 模塊>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

server {
  #監聽端口,nginx 會根據請求的 HOST 來決定使用哪一個 SERVER 段的配置。若是沒有匹配的 server_name,則默認使用配置文件中第一個。加上 default_server 則能夠以指定沒有匹配時的默認規則。
  #listen 80;
  listen 80 default_server;
 
  #域名能夠有多個,用空格隔開
  server_name www.test.com test.com;
  root /user/share/nginx/html/test;
 
  #404頁面配置
  error_page  404  /404.html;
 
  #配置 ssl,有須要時開啓。
  ssl on;
  ssl_certificate /etc/nginx/ssl/server.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;
 

location / { index index.html index.php; }

 
  #圖片緩存時間設置
  location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
    expires 10d;
  }
 
  #JS和CSS緩存時間設置
  location ~ .*.(js|css)?$ {
    expires 1h;
  }
 
  location ~ [^/]\.php(/|$) {
    fastcgi_index  index.php;
    #開啓 PATH_INFO 支持,做用就是把參數按照給定的正則表達式分割成 $fastcgi_script_name 和 $fastcgi_path_info。
    #例如:請求 index.php/id/1 不加此行配置時,fastcgi_script_name 是 /index.php/id/1,fastcgi_path_info 是空。
    #加上以後,fastcgi_script_name 是 index.php,fastcgi_path_info 是 /id/1
    fastcgi_split_path_info ^(.+\.php)(.*)$;
 
    #此值便是 PHP 中 $_SERVER['SCRIPT_FILENAME'] 的值
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO        $fastcgi_path_info;
    fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
 
    #指定FastCGI服務器監聽端口與地址。須和 PHP-FPM 的設置相同。
    #fastcgi_pass  127.0.0.1:9000;
    fastcgi_pass  unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
  }
}

2、常見的方式

  • 讓木立刻傳後不能執行:針對上傳目錄,在nginx配置文件中加入配置,使此目錄沒法解析php
  • 讓木馬執行後看不到非網站目錄文件:取消php-fpm運行帳戶對於其餘目錄的讀取權限
  • 木馬執行後命令不能執行:取消php-fpm帳戶對於sh的執行權限
  • 命令執行後權限不能太高:php-fpm帳戶不要用root或者加入root組

3、具體的配置

一、禁止php文件的訪問及執行

location ~ /(attachments|upload)/.*\.(php|php5)?$ {
  deny all;
}

禁止IP的訪問

//禁止的寫法
deny 10.0.0.0/24;
 
//容許的寫法
allow 10.0.0.0/24; 
deny all;
 

、根據用戶的真實 IP 作鏈接限制

## 這裏取得原始用戶的IP地址
map $http_x_forwarded_for $clientRealIp {
  "" $remote_addr;
  ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
}
 

## 針對原始用戶 IP 地址作限制 limit_conn_zone $clientRealIp zone=TotalConnLimitZone:20m ; limit_conn TotalConnLimitZone 50; limit_conn_log_level notice;

 
## 針對原始用戶 IP 地址作限制
limit_req_zone $clientRealIp zone=ConnLimitZone:20m rate=10r/s;
#limit_req zone=ConnLimitZone burst=10 nodelay;
limit_req_log_level notice;
 

## 具體服務器配置 server { listen 80; location ~ \.php$ { ## 最多 5 個排隊, 因爲每秒處理 10 個請求 + 5個排隊,你一秒最多發送 15 個請求過來,再多就直接返回 503 錯誤給你了

limit_req zone=ConnLimitZone burst=5 nodelay;                           fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } }

四、 通過多層CDN以後取得原始用戶的IP地址,nginx 配置

map $http_x_forwarded_for $clientRealIp {
    ## 沒有經過代理,直接用 remote_addr
  "" $remote_addr; 
    ## 用正則匹配,從 x_forwarded_for 中取得用戶的原始IP
    ## 例如  X-Forwarded-For: 202.123.123.11, 208.22.22.234, 192.168.2.100,...
    ## 這裏第一個 202.123.123.11 是用戶的真實 IP,後面其它都是通過的 CDN 服務器
  ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
}
 
## 經過 map 指令,咱們爲 nginx 建立了一個變量 $clientRealIp ,這個就是 原始用戶的真實 IP 地址,
## 不論用戶是直接訪問,仍是經過一串 CDN 以後的訪問,咱們都能取得正確的原始IP地址

五、隱藏版本信息

server_tokens  off;
proxy_hide_header    X-Powered-By;
//或者編譯的時候修改源代碼

六、禁用非必要的方法

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
  return  444;
}

七、禁用擴展名

location ~* .(txt|doc|sql|gz|svn|git)$ {
  deny all;
}

八、合理配置響應頭

add_header Strict-Transport-Security "max-age=31536000";
add_header X-Frame-Options deny;
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://a.disquscdn.com; img-src 'self' data: https://www.google-analytics.com; style-src 'self' 'unsafe-inline'; frame-src https://disqus.com";

Strict-Transport-Security(簡稱爲 HSTS)能夠告訴瀏覽器,在指定的 max-age 內,始終經過 HTTPS 訪問

X-Frame-Options 用來指定此網頁是否容許被 iframe 嵌套,deny 就是不容許任何嵌套發生

九、拒絕一些User-Agents

if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
  return 403;
}

十、防止圖片盜鏈

valid_referers blocked www.example.com example.com;
if ($invalid_referer) {
  rewrite ^/images/uploads.*\.(gif|jpg|jpeg|png)$ http://www.examples.com/banned.jpg last
}

十一、控制緩衝區溢出攻擊 client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k; client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10;

解釋說明
一、client_body_buffer_size 1k-(默認8k或16k)這個指令能夠指定鏈接請求實體的緩衝區大小。若是鏈接請求超過緩存區指定的值,那麼這些請求實體的總體或部分將嘗試寫入一個臨時文件。
二、client_header_buffer_size 1k-指令指定客戶端請求頭部的緩衝區大小。絕大多數狀況下一個請求頭不會大於1k,不過若是有來自於wap客戶端的較大的cookie它可能會大於1k,Nginx將分配給它一個更大的緩衝區,這個值能夠在large_client_header_buffers裏面設置。
三、client_max_body_size 1k-指令指定容許客戶端鏈接的最大請求實體大小,它出如今請求頭部的Content-Length字段。若是請求大於指定的值,客戶端將收到一個」Request Entity Too Large」 (413)錯誤。記住,瀏覽器並不知道怎樣顯示這個錯誤。
四、large_client_header_buffers-指定客戶端一些比較大的請求頭使用的緩衝區數量和大小。請求字段不能大於一個緩衝區大小,若是客戶端發送一個比較大的頭,nginx將返回」Request URI too large」 (414)

一、client_body_timeout 10;-指令指定讀取請求實體的超時時間。這裏的超時是指一個請求實體沒有進入讀取步驟,若是鏈接超過這個時間而客戶端沒有任何響應,Nginx將返回一個」Request time out」 (408)錯誤。
二、client_header_timeout 10;-指令指定讀取客戶端請求頭標題的超時時間。這裏的超時是指一個請求頭沒有進入讀取步驟,若是鏈接超過這個時間而客戶端沒有任何響應,Nginx將返回一個」Request time out」 (408)錯誤。
三、keepalive_timeout 5 5; – 參數的第一個值指定了客戶端與服務器長鏈接的超時時間,超過這個時間,服務器將關閉鏈接。參數的第二個值(可選)指定了應答頭中Keep-Alive: timeout=time的time值,這個值可使一些瀏覽器知道何時關閉鏈接,以便服務器不用重複關閉,若是不指定這個參數,nginx不會在應答頭中發送Keep-Alive信息。(但這並非指怎樣將一個鏈接「Keep-Alive」)參數的這兩個值能夠不相同。
四、send_timeout 10; 指令指定了發送給客戶端應答後的超時時間,Timeout是指沒有進入完整established狀態,只完成了兩次握手,若是超過這個時間客戶端沒有任何響應,nginx將關閉鏈接。

十二、控制併發鏈接

limit_zone slimits $binary_remote_addr 5m; limit_conn slimits 5;

1三、sysctl.conf配置

# Avoid a smurf attack
net.ipv4.icmp_echo_ignore_broadcasts = 1
 
# Turn on protection for bad icmp error messages
net.ipv4.icmp_ignore_bogus_error_responses = 1
 
# Turn on syncookies for SYN flood attack protection
net.ipv4.tcp_syncookies = 1
 
# Turn on and log spoofed, source routed, and redirect packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
 
# No source routed packets here
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
 
# Turn on reverse path filtering
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
 
# Make sure no one can alter the routing tables
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
 
# Don't act as a router
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
 
# Turn on execshild
kernel.exec-shield = 1
kernel.randomize_va_space = 1
 
# Tuen IPv6
net.ipv6.conf.default.router_solicitations = 0
net.ipv6.conf.default.accept_ra_rtr_pref = 0
net.ipv6.conf.default.accept_ra_pinfo = 0
net.ipv6.conf.default.accept_ra_defrtr = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.default.dad_transmits = 0
net.ipv6.conf.default.max_addresses = 1
 
# Optimization for port usefor LBs
# Increase system file descriptor limit
fs.file-max = 65535
 
# Allow for more PIDs (to reduce rollover problems); may break some programs 32768
kernel.pid_max = 65536
 
# Increase system IP port limits
net.ipv4.ip_local_port_range = 2000 65000
 
# Increase TCP max buffer size setable using setsockopt()
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
 
# Increase Linux auto tuning TCP buffer limits
# min, default, and max number of bytes to use
# set max to at least 4MB, or higher if you use very high BDP paths
# Tcp Windows etc
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1

1四、在防火牆級限制每一個IP的鏈接數

/sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
/sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 15 -j DROP

1五、限制Nginx鏈接傳出

/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW
 

 

對上傳資源的目錄作資源訪問限制

有些網站不但容許用戶發佈內容到服務器,還容許用戶發圖片設置上傳附件到服務器上,因爲爲用戶開了上傳的功能,所以給服務器帶來了很大的安全風險。雖然不少程序在上傳前會作必定的控制,例如:文件大小,類型等,可是,一不當心就會被黑客鑽了空子,上傳了木馬程序。下面將利用nginx配置禁止訪問上傳資源目錄下的PHP、SHELL、Perl、Python程序文件,這樣用戶即便上傳了木馬文件也無法執行,從而增強了網站的安全。

配置nginx,禁止解析指定目錄下的指定程序

location ~ ^/images/.*\.(php|php5|sh|pl|py)$

{

deny all;

}

location ~ ^/static/.*\.(php|php5|sh|pl|py)$

{

deny all;

}

location ~ ^/data/(attachment|avatar)/.*\.(php|php5)$

{

deny all;

}

 

以上目錄的限制必須寫在nginx處理php服務配置前面

禁止非法域名解析訪問企業網站

nginx如何防止用戶ip訪問網站(惡意域名解析,也至關於直接IP訪問企業網站)?

方法1:讓使用ip訪問或者惡意解析域名的用戶,收到501錯誤,命令以下:

server {

listen 80 default_server;

server_name _;

return 501;

}

#說明:直接報501錯誤,從用戶體驗上不是很好

方法2:經過301跳轉到主頁,命令以下:

server {

listen 80 default_server;

server_name _;

rewrite ^(.*) http://www.heboan.com$1 permanent;

}

方法3:發現某域名惡意解析到公司的服務器ip,在server標籤裏添加一下代碼便可,如有多個server則要多處添加:

if ($host !~ ^www/.heboan/.com$){

rewrite ^(.*) http://www.heboan.com$1 permanent;

}

圖片及目錄防盜鏈

根據HTTP referer實現防盜鏈

HTTP referer是header的一部分,當瀏覽器向web服務器發送請求時,通常會帶上referer,告訴服務器我是從哪一個頁面連接過來的,服務器藉此得到一些信息用於處理。Apache、Nginx、Lighttpd三者都支持HTTP referer實現防盜鏈,referer是目前網站圖片、附件、html等最經常使用的防盜鏈手段。

location ~* \.(jpg|gif|png|swf|flv|wma|asf|mp3|mmf|zip|rar)$ {

valid_referers none blocked *.heboan.com;

if ($invalid_referer){

rewrite ^/ http://www.heboan.com/img/nolink.jpg;

#return 404;

}

}

網頁壓縮

gzip on;

#用於開啓gzip,默認是關閉的

gzip_min_length 1k;

#設置容許壓縮的頁面最小字節數,頁面字節數從header頭的content-length中進行獲取。默認值是0,無論頁面多大都壓縮。建議設置大於1k的字節數,小於1k可能會越壓越大

gzip_buffers 4 16k;

#這是系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流,4 16k表明以16k爲單位,安裝原始數據大小以16k爲單位的4倍申請內存

gzip_http_version 1.1;

#識別http的協議版本

gzip_comp_level2;

#設置壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢,比較消耗cpu資源

gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif images/png;

#匹配mime類型進行壓縮,不管是否指定,」text/html」類型老是會被壓縮的

gzip_vary on;

#和http頭有關係,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,因此避免浪費不支持的也壓縮,因此根據客戶端的HTTP頭來判斷,是否須要壓縮.

gzip_disable 「MSIE [1-6]\.」;

#同時因爲IE6不支持gizp解壓縮,因此在IE6下要關閉gzip壓縮功能

 

nginx日誌切割>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

access_log

用log_format指令設置了日誌格式以後,須要用access_log指令指定日誌文件存放路徑。

格式以下所示

 

access_log path(存放路徑) [format(自定義日誌格式名稱) [buffer=size | off]]

在Nginx中有本身默認的日誌路徑,以下內容:

 

#access_log logs/access.log main;

若是想關閉日誌,能夠以下:

access_log off;

access.log 切割腳本

#!/bin/bash# 設置日誌文件存放目錄logs_path="/var/log/nginx/"# 設置pid文件pid_path="/var/run/nginx.pid"# 重命名日誌文件mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log# 向nginx主進程發信號從新打開日誌kill -USR1 `cat ${pid_path}`

相關文章
相關標籤/搜索