请启用 Javascript 以查看内容

Nginx 常用配置以及安全配置案例

 ·   ·  ☕ 3 分钟  ·  ✍ CNSRE · 👀... 阅读

作者:SRE运维博客
博客地址:https://www.cnsre.cn
文章地址:https://www.cnsre.cn/posts/210810958573/
相关话题:https://www.cnsre.cn/tags/nginx/


Nginx 是用于 Web 服务、反向代理、缓存、负载平衡、媒体流等的开源软件。在这将提到一些经常使用的 Nginx 经典配置以及安全性的一些配置。请根据您的实际需求对这些配置进行调整。

侦听端口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
server {
  # 标准HTTP协议
  listen 80;

  # 标准HTTPS协议
  listen 443 ssl;

  # 使用 http2
  listen 443 ssl http2;

  # 使用IPv6 监听 80
  listen [::]:80;

  # 仅限使用IPv6
  listen [::]:80 ipv6only=on;
}

访问日志

1
2
3
4
5
6
7
server {
  # 日志文件的相对或完整路径
  access_log /path/to/file.log;

  # 选择 'on' 或者 'off'
  access_log on;
}

域名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server {
  # 监听单个域名
  server_name cnsre.cn;

  # 监听多个域名
  server_name cnsre.cn www.cnsre.cn;

  # 监听所有域名
  server_name *.cnsre.cn;

  # 监听所有顶级域名
  server_name cnsre.*;

  # 监听未指定的主机名(侦听IP地址本身)
  server_name "";

}

静态资源

1
2
3
4
5
6
7
8
server {
  listen 80;
  server_name cnsre.cn;

  location / {
          root /path/to/website;
  } 
}

重定向

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server {
  listen 80;
  server_name www.cnsre.cn;
  return 301 http://cnsre.cn$request_uri;
}

server {
  listen 80;
  server_name www.cnsre.cn;

  location /redirect-url {
     return 301 http://otherdomain.com;
  }
}

反向代理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
server {
  listen 80;
  server_name cnsre.cn;

  location / {
     proxy_pass http://0.0.0.0:3000;
     # 其中 0.0.0.0:3000 是您的应用程序服务器(例如:node.js)绑定在 0.0.0.0 上,监听端口 3000
  }

}

负载均衡

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
upstream node_js {
  server 0.0.0.0:3000;
  server 0.0.0.0:4000;
  server 1.1.1.1;
}

server {
  listen 80;
  server_name cnsre.cn;

  location / {
     proxy_pass http://www.cnsre.cn;
  }
}

SSL 协议

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
  listen 443 ssl;
  server_name cnsre.cn;

  ssl on;

  ssl_certificate /path/to/cert.pem;
  ssl_certificate_key /path/to/privatekey.pem;

  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_trusted_certificate /path/to/fullchain.pem;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_session_timeout 1h;
  ssl_session_cache shared:SSL:50m;
  add_header Strict-Transport-Security max-age=15768000;
}

# HTTP 到 HTTPS 的永久重定向
server {
  listen 80;
  server_name cnsre.cn;
  return 301 https://$host$request_uri;
}

禁止任何敏感的请求路径

1
2
3
4
5
6
7
8
9
location ~ /\.git {
  deny all;
}
## Disable .htaccess and other hidden files
location ~ /\.(?!well-known).* {
    deny all;
    access_log off;
    log_not_found off;
}

禁止不必要的 HTTP 请求方法

最常用的 HTTP 请求方法是 GET、POST、HEAD。对于任何其他未使用的方法,我们应该返回 444。

1
2
3
4
5
#只允许这些请求方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
         return 444;
}
# 不接受删除,搜索和其他方法

添加请求速率限制

限速 会拦截很多恶意请求,也是防御网站的网络级和应用级DDoS攻击的常用工具。我们可以为单个 IP 添加最大请求限制。

1
2
3
4
5
6
7
8
9
limit_req_zone $binary_remote_addr zone=ip:10m rate=5r/s;

server {
    listen 80;
    location / {
        limit_req zone=ip burst=12 delay=8;
        proxy_pass http://cnsre.cn;
    }
}

点击劫持攻击

点击劫持攻击 会导致用户在不知不觉中下载恶意软件、访问恶意网页、提供凭据或敏感信息。
我们可以X-FRAME-OPTIONSHTTP Header 中注入以防止点击劫持攻击(甚至可以通过某些方式绕过)。这是通过在 nginx.conf 文件中添加以下内容来实现的

1
add_header X-Frame-Options "SAMEORIGIN";

X-XSS 保护

注入具有 X-XSS 保护的 HTTP 标头以减轻跨站点脚本攻击。修改 nginx.conf 文件添加以下内容

1
add_header X-XSS-Protection "1; mode=block";

如果你还对安全标头感兴趣,点击这里了解这些标头。


作者:SRE运维博客
博客地址:https://www.cnsre.cn
文章地址:https://www.cnsre.cn/posts/210810958573/
相关话题:https://www.cnsre.cn/tags/nginx/


您的鼓励是我最大的动力
alipay QR Code
wechat QR Code

Avatar
作者
CNSRE
一位只会重启的运维






目录