1、通过geoip模块屏蔽恶意IP

if ( $geoip_country_code !~  ^(CN|US)$ ) { 
    return 403; 
}

2、封杀特定URL(管理后台)

location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ { 
    rewrite ^/(.*)$  $host  permanent; 
} 

location /(admin|phpadmin|status) {
    deny all;
}

3、封杀各种user-agent

if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) { 
  return 403; 
} 

if ($http_user_agent ~* "" ) { 
  return 403; 
}

4、封杀特定HTTP方法

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

if ($http_range ~ "\d{9,}") { 
    return 444; 
}

5、强制使用域名访问

if ( $host !~* 'herlly.cn' ) { 
    return 403; 
}

6、过滤URL敏感字参数

if ($query_string ~* "union.*select.*\(") {  
  rewrite ^/(.*)$  $host  permanent; 
}  

if ($query_string ~* "concat.*\(") {  
  rewrite ^/(.*)$  $host  permanent; 
} 

7、强制要求referer

if ($http_referer = "" ) { 
    return 403; 
}

8、屏蔽nginx版本号

# 编译时
vi /src/nginx-1.19.1/src/core/nginx.h
#define nginx_version    010258
#define NGINX_VERSION "1.2.58"
#define NGINX_VER    "GOME/" NGINX_VERSION

# 安装后配置
vi /etc/nginx/conf/nginx.conf
http {
    server_tokens off;
}

9、加固$fastcgi_script_name

vi /etc/php/etc/php.ini
cgi.fix_pathinfo = 0
  
vi /etc/nginx/conf/nginx.conf/context
if ( $fastcgi_script_name ~ \..*\/.*php ) {
    return 403;
}

10、防盗链

location /images/ {  valid_referers none blocked www.example.com example.com;  
    if ($invalid_referer) {    
        return   403; 
    }
}

11、查看进程打开多少个文件句柄(centos7)

lsof -n|awk '{print$2}'|sort|uniq -c|sort -nr|more
/proc/sys/fs/file-max  内存中文件打开数
每秒处理最大请求数65535*8/65/2

12、屏蔽.git文件

vi /etc/nginx/core/git.conf
location ~ ^/.*\.git {
  deny all;
}

13、屏蔽爬虫

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") {
    return 403;
}

14、重写跳转

rewrite  "^/test/([^/]+)$" /test.php?total=$1 last;
rewrite  "^/test/([^/]+)/$" /test.php?total=$1 last;

15、屏蔽favicon.ico日志输出

location = /favicon.ico {
    log_not_found off;
    access_log off;
}

16、屏蔽隐藏文件访问

location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
}

17、访问图片、flash文件不打印日志并缓存7d

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    expires      7d; 
    access_log off;
}

18、访问js和css文件不打印日志

location ~ .*\.(js|css)?$ {
    expires      1d; 
    access_log off;
}

19、设置php-cgi

location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
}

20、文件下载服务器

server {
  location download {
    autoindex on;
    autoindex_exact_size on;
    autoindex_localtime on;
  }
}

21、默认当访问列出的txt等文件时会在浏览器上显示文件的内容,如果你想让浏览器直接下载,加上下边的配置

if ($request_filename ~* ^.*?\.(txt|pdf|jpg|png)$) {
    add_header Content-Disposition 'attachment';
}

22、默认站点

server {
    listen 80 default;
}
备注:当一个nginx服务上创建了多个虚拟主机时默认会从上到下查找,如果匹配不到虚拟主机则会返回第一个虚拟主机的内容,如果你想指定一个默认站点时,可以将这个站点的虚拟主机放在配置文件中第一个虚拟主机的位置,或者在这个站点的虚拟主机上配置listen default

23、不允许通过IP访问

server {
    listen       80 default;
    server_name  _;
    return      404;
}

server {
    rewrite ^/(.*)$ https://test.com/$1    permanent;
}
或
server {
    listen *:80 default;
    server_name _;
    return 500;
}
server {
    listen *:443 default;
    server_name _;
    ssl                  on;
    ssl_certificate      lnso.pem;
    ssl_certificate_key   lnso.key;
    return 500;
}

24、直接返回验证文件


location = /XDFy1123le6tNA.txt {
    default_type text/plain;
    return 200 'd6296a84657eb275c05c31b10924f6ea';
}

方案一:将验证文件放入txt目录下
1./vhost/*.conf引入
location ~ txt$ {
    root /tmp/txt;
    default_type text/plain;
 } 
 
 方案二:直接返回的内容统一写到一个文件管理
1.core/file.txt引入,并放入git管理
location = /Gtz5aFmk1Q.txt {
    default_type text/plain;
    return 200 'eb0276d7062f3d7115bba0995cf6785b';
}

2.server段include file.txt;

3.每次更新,file.txt加入location匹配

25、移动端判断并转发

server {
  if ($http_user_agent ~ "((MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC\-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT)|(SonyEricsson)|(NEC)|(Mobile)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC)|(SED)|(EMOL)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera))") {
    rewrite ^/(.*)$ http://m.lnso.com/$1 last;
  }
}

26、文件缓存

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    expires 30d;
}

location ~ .*\.(js|css)?$ {
    expires 1h;
}

27、404跳转到首页

server { 
    location / { 
        error_page 404 = @test; 
     } 
    
    location @test { 
        rewrite .* / permanent; 
    }
}

28、页面缓存

mkdir -pv /data/nginx/cache/web1
vim /etc/nginx/nginx.conf
proxy_cache_path /data/nginx/cache/web1 levels=1:2 keys_zone=webserver:20m max_size=1g;
server {
    listen       80;
    server_name  localhost;
    location / {
            add_header X-Via $server_addr;
        add_header X-Cache $upstream_cache_status;
        proxy_pass      http://web1;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_cache web1;
        proxy_cache_valid 200 10m;
    }
}

29、proxy_pass http://web1;与proxy_pass http://web1/;区别

目标地址中不带uri(proxy_pass http://web1)。此时新的目标url中,匹配的uri部分不做修改,原来是什么就是什么
目标地址中带uri(proxy_pass http://web1/,/也是uri),此时新的目标url中,匹配的uri部分将会被修改为该参数中的uri

30、文件上传大小限制修改

keepalive_timeout  100; # 这个参数表示http连接超时时间,默认是65s。要是上传文件比较大,在规定时间内没有上传完成,就会自动断开连接!所以适当调大这个时间
client_max_body_size; # 这个参数的设置限制了上传文件的大小,可以在http、server、location三个区域里配置

31、检查证书到期时间

echo | openssl s_client -servername ${domain} -connect ${domain}:443 2>/dev/null | openssl x509 -noout -dates

openssl x509 -in ${public} -noout -dates

for i in `ls *.crt`;do echo $i;openssl x509 -in $i -noout -dates;done
for i in `ls *.crt`;do echo $i;openssl x509 -checkend 864000 -in $i -noout; echo $?;done # 检查10天内证书到期的