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天内证书到期的