- 一、Nginx的功能概述
- 二、配置文件详解
- 三、常用功能配置示例
- 五、Nginx常用命令
- 六、Nginx功能速查手册
- 1.全局变量
- 2.监听端口
- 3.域名 (server_name)
- 4.简单代理
- 5.负载均衡(简单实例)
- 6.负载均衡(权重)
- 7.upstream ip_hash
- 8.upstream fair
- 9.server 可选参数
- 10.upstream url_hash
- 11.upstream keepalive
- 12.子文件夹中的代理
- 13.反向代理
- 14.静态资源(传统 Web 服务器)
- 15.HTTPS 协议
- 16.重定向(301永久)
- 17.重定向(302临时)
- 18.永久重定向到 HTTPS 安全域
- 19.重定向参数
- 20.HTTP 请求端真实的IP
- 21.websocket 的代理 keepalive
- 22.Apache 的反向代理
- 23.Gitlab 的反向代理
- 24.重定向整个网站
- 25.重定向单页
- 26.重定向整个子路径
- 27.负载均衡
- 28.内容缓存
- 29.跨域问题
- 30.重定向 URI 来解决跨域问题
- 31.跳转到带 www 的域上面
- 32.代理转发
- 33.屏蔽 IP
- 34.强制将 http 重定向到 https
- 35.代理转发连接替换
- 36.爬虫 User-Agent 过滤
- 37.图片防盗链
- 38.虚拟目录配置
- 39.屏蔽文件目录
- 40.防盗图配置
- 41.ulimit 不继承系统设置的问题
- 42.Gzip 配置
- 43.阻止常见攻击
- 44.使网站不可索引
一、Nginx的功能概述
Nginx主要功能包括高性能的HTTP和反向代理服务、负载均衡、动静分离处理、邮件代理服务等。以下详细探讨Nginx的主要功能:
1、静态内容服务
传输速度快:Nginx设计为一个高性能的HTTP服务器,能够快速传输静态文件,如HTML、图片和视频等。
简单高效:占用系统资源少,使其在处理高并发请求时表现出色。
2、反向代理与负载均衡
反向代理功能:Nginx可以将客户端请求转发到后端服务器,并将响应结果返回给客户端,从而对客户端隐藏后端服务器的详细信息。
负载均衡策略:支持多种负载均衡算法如轮询、权重、IP哈希等,能有效分散请求压力,提升网站服务的可用性和性能。
3、动静分离处理
动态内容处理:Nginx可以与PHP、Python等后端应用服务器集成,通过FastCGI等方式处理动态内容。
静态内容优化:对于静态文件,Nginx可以直接从其缓存中高效率地服务,减少后端应用服务器的压力。
4、邮件代理服务
邮件代理功能:除了Web服务外,Nginx还提供邮件代理服务,能够代理IMAP、POP3及SMTP协议的请求。
5、SSL/TLS支持
安全性增强:支持SSL/TLS协议,可为网站提供HTTPS服务,保障数据传输过程的安全性。URL重写与虚拟主机配置
URL重写能力:可以根据规则对URL进行修改、重定向,有助于网站优化和美化。
虚拟主机支持:允许在同一服务器上部署多个网站,并根据域名分发请求,节省资源且便于管理。
6、配置文件简洁明了
易于配置:Nginx的配置文件结构清晰,注释详细,便于理解和维护。热部署与灵活性
无缝升级:Nginx支持热部署,可以在不中断服务的情况下进行软件版本的升级。
扩展性高:模块化设计和开放的插件系统使得Nginx拥有很高的自定义和扩展能力。
二、配置文件详解
Nginx的配置文件是nginx.conf,不过可以在conf.d目录下添加多个不同名称的配置文件,同时生效。生产环境有多个域名需要代理出去时,常常在conf.d目录下配置各自域名的发布或代理信息。
nginx配置文件一般包括全局块,events块,http块等组成,一个http块可包含一个或多个server块,一个server块可以包含一个或多个location块
下面是nginx配置文件的结构图:
以下是初始化安装的配置文件内容,将对配置文件各个模块进行详细解析
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
1、全局块
全局块是配置影响Nginx全局的参数。
user nginx;
worker_processes auto;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
主要参数说明:
user :指定nginx运行的用户和用户组,默认是nobody,一般会使用nginx
workker_processes :指定Nginx启动的工作进程数,建议设置为CPU核心数的两倍或设置为auto,由Nginx自行选择 。
error_log和pid一般使用默认就行,会自动将信息放置在安装时指定的位置
2、events块
设定Nginx的工作模式及连接上限
events {
# 定义每个工作进程可以处理的最大连接数
worker_connections 65535;
}
workker_connections :定义每个工作进程可以处理的最大连接数,根据服务器性能和并发需求进行适当调整。
3、http块
http块是整个配置文件的核心部分,大部分配置都在此处操作。http块可以嵌套多个server块,
包含HTTP相关的指令,如文件引入、MIME-Type定义、日志自定义、连接超时时间等。
可以嵌套多个server块,用于配置不同的虚拟主机。而server块也可以嵌套多个location块,用于配置不同的URL。
http {
include mime.types;
default_type application/octet-stream;
sendfile on; # 开启高效传输模式
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
4、server块
一个server块代表一个虚拟主机,可以配置多个,用于支持多个域名或IP地址,端口。
一个server块可以包含多个location块。
server {
listen 9080;
server_name www.test.com;
location / {
root /opt/nginx/html;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
主要参数说明:
listen:指定Nginx监听端口,可以指定任意端口,但不可以端口冲突。
server_name:指定虚拟主机的域名或IP 域名匹配的四种写法:
# 精确匹配
server_name http://www.test.com;
# 左侧匹配
server_name *.test.com;
#右侧通配
server_name www.test.*;
# 正则匹配
server_name ~^www\.test\.*$;
root : 指定静态资源目录位置,当用户访问www.test.com:9080时,实际访问的是/opt/nginx/html/index.html
error_page 404:指定 404 错误页面的位置
error_page 500 502 503 504 :指定50开头的错误页面的位置
location块
配置URL路径的指令,可以定义URL路径的匹配规则和处理方式,如反向代理、重定向等
location / {
root html;
index index.html index.htm;
}
location = /50x.html {
root html;
}
location配置有多种匹配规则
= 精确匹配
~ 正则匹配,区分大小写
~* 正则匹配,不区分大小写
^~ 匹配到就停止搜索
location配置实例
server {
listen 80;
server_name www.test.com;
# 当访问www.test.com/web02时,会匹配上/usr/local/nginx/html/index.html
location = /web02 {
root /usr/local/nginx/html;
index index.html index.htm;
}
# 只有当访问www.test.com/web01时才会匹配到/usr/local/nignx/html/web01
location = /web01 {
root /usr/local/nginx/html;
}
# 当访问www.test.com/dog.jpg等路径时会匹配到/usr/local/nginx/html/dog.jpg
location ~ \.(jpeg|jpg|png)$ {
root /usr/local/nginx/html;
}
}
三、常用功能配置示例
1、反向代理
反向代理配置主要通过proxy_pass指令实现,将请求转发到后端服务器
server {
listen 8090;
server_name www.test.com;
location / {
proxy_pass http://app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 配置后端服务器组
upstream app {
server 10.10.10.100:8090;
server 10.10.10.101:8090;
}
2、负载均衡
负载均衡是将单个服务器负载均衡到多个服务器上,使得大量并发访问或数据流量分担到多个服务器上,从而减少用户的等待响应时间。
负载均衡通过配置upstream指令定义一组后端服务器,并通过反向代理将请求分发到这些服务器,一般会给服务器添加权重,加权轮询
upstream web {
server 10.10.10.100 weight=1;
server 10.10.10.101 weight=2;
server 10.10.10.102 down;
}
server {
listen 80;
location / {
proxy_pass http://web;
}
}
3、配置https
一般公司都注册自己的域名,获取到相应的SSL证书和私钥即可快速配置
server {
listen 443 ssl;
server_name www.test.com;
ssl_certificate /path/to/your_certificate.pem; # 证书文件路径
ssl_certificate_key /path/to/your_private.key; # 私钥文件路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
五、Nginx常用命令
# 重新加载,热重启
nginx -s reload
# 关闭nginx
nginx -s stop
# 优雅关闭,等待进程处理完后再关闭
nginx -s quit
# 检查nginx配置
nginx -t
# 如果做成了systemd服务,可以使用以下命令来操作nginx
# 重启
systemctl restart nginx
# 停止nginx
systemctl stop nginx
# 启动nginx
systemctl start nginx
# 重新加载nginx
systemctl reload nginx
六、Nginx功能速查手册
这个 nginx 快速参考常用命和配置使用清单。
由于使用root用户操作太过危险,此手册使用普通用户sudo操作。
1.全局变量
变量 | 说明 |
---|---|
$args |
这个变量等于请求行中的参数,同 $query_string |
$remote_port |
客户端的端口 |
$content_length |
请求头中的 Content-length 字段 |
$remote_user |
已经经过 Auth Basic Module 验证的用户名 |
$content_type |
请求头中的 Content-Type 字段 |
$request_filename |
当前请求的文件路径,由 root 或alias指令与URI请求生成 |
$document_root |
当前请求在 root 指令中指定的值 |
$scheme |
HTTP方法(如http,https) |
$host |
请求主机头字段,否则为服务器名称 |
$hostname |
主机名 |
$http_user_agent |
客户端agent 信息 |
$http_cookie |
客户端cookie 信息 |
$server_protocol |
请求使用的协议,通常是HTTP/1.0 或HTTP/1.1 |
$server_addr |
服务器地址,在完成一次系统调用后可以确定这个值 |
$server_name |
服务器名称 |
$server_port |
请求到达服务器的端口号 |
$limit_rate |
这个变量可以限制连接速率 |
$request_method |
客户端请求的动作,如 GET/POST |
$request_uri |
包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz |
$remote_addr |
客户端的IP地址 |
$uri |
不带请求参数的当前URI,$uri 不包含主机名,如 /foo/bar.html |
$document_uri |
与 $uri 相同 |
$nginx_version |
nginx 版本 |
2.监听端口
server {
listen 80; # 标准 HTTP 协议
listen 443 ssl; # 标准 HTTPS 协议
listen 443 ssl http2; # 对于 http2
listen [::]:80; # 使用 IPv6 在 80 上收听
# 仅收听使用 IPv6
listen [::]:80 ipv6only=on;
}
3.域名 (server_name)
server {
# 监听 example.com
server_name example.com;
# 监听多个域
server_name example.com www.example.com;
# 监听所有子域
server_name *.example.com;
# 监听所有顶级域
server_name example.*;
# 监听未指定的主机名(监听 IP 地址本身)
server_name "";
}
4.简单代理
location / {
# 反向代理地址
proxy_pass http://127.0.0.1:3000;
# 代理重定向
proxy_redirect off;
# 代理请求头
proxy_set_header Host $host;
}
5.负载均衡(简单实例)
# 默认使用轮训
upstream test1 {
server 0.0.0.0:3000;
server 0.0.0.0:4000;
server 127.155.142.421;
}
6.负载均衡(权重)
upstream test2 {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
7.upstream ip_hash
upstream test3 {
ip_hash;
server localhost:8080;
server localhost:8081;
}
解决负载均衡 session
的问题
8.upstream fair
upstream test4 {
fair;
server localhost:8080;
server localhost:8081;
}
响应时间短的优先分配
9.server 可选参数
:- | :- |
---|---|
weight |
访问权重数值越高,收到请求越多 |
fail_timeout |
指定的时间内必须提供响应 |
max_fails |
尝试失败服务器连接的最大次数 |
down |
标记一个服务器不再接受任何请求 |
backup |
有服务器宕机,标记的机器接收请求 |
配置示例
upstream test5 {
server 127.0.0.1:83 weight=9; # 权重
server 127.0.0.1:83 weight=1; # 权重
# 失败超时时间
server 127.0.0.1:83 max_fails=3;
server 127.0.0.1:83 weight=3 down;
}
10.upstream url_hash
upstream test6 {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
按访问url的hash结果来分配请求
11.upstream keepalive
upstream test7 {
server 127.0.0.1:11211;
server 10.0.0.2:11211;
keepalive 32;
}
激活缓存以连接到上游服务器
12.子文件夹中的代理
location /folder/ {# / 很重要!
proxy_pass http://127.0.0.1:3000/; # / 很重要!
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
13.反向代理
1.基础
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://0.0.0.0:3000;
# 其中 0.0.0.0:3000 是绑定在
# 0.0.0.0端口3000 列表上的 Node.js 服务器
}
}
2.基础 + (upstream)
upstream test1 {
server 0.0.0.0:3000;
# 其中 0.0.0.0:3000 是绑定在
# 0.0.0.0端口3000 列表上的 Node.js 服务器
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://test1;
}
}
3.升级连接(适用于支持 WebSockets 的应用程序)
upstream test1 {
server 0.0.0.0:3000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://test1;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
适用于 Node.js、Streamlit、Jupyter 等
14.静态资源(传统 Web 服务器)
server {
listen 80;
server_name example.com;
root /data/website;
# root /path/to/website/ 示例,如果里面没有'root',它将寻找 /data/website/index.html
location / {
}
location /images/ {
root /data/website/images;
}
location /videos/ {
root /data/www/media;
}
}
15.HTTPS 协议
大多数 SSL 选项取决于您的应用程序做什么或需要什么
server {
listen 443 ssl http2;
server_name example.com;
# 开启ssl功能
ssl on;
ssl_certificate /path/to/ssl.crt;
ssl_certificate_key /path/to/ssl.key;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/fullchain.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
add_header Strict-Transport-Security max-age=15768000;
}
16.重定向(301永久)
将 www.example.com[1] 重定向到 example.com
server {
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri;
}
将 http 重定向到 https
server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri;
}
17.重定向(302临时)
server {
listen 80;
server_name yourdomain.com;
return 302 http://otherdomain.com;
}
18.永久重定向到 HTTPS 安全域
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
19.重定向参数
:- | :- |
---|---|
permanent |
永久性重定向。日志中的状态码为 301 |
redirect |
临时重定向。日志中的状态码为 302 |
20.HTTP 请求端真实的IP
location / {
proxy_set_header X-Forwarded-For $remote_addr;
}
21.websocket 的代理 keepalive
# Upstreams
upstream backend {
server 127.0.0.1:3000;
keepalive 5;
}
# HTTP Server
server {
server_name your_hostname.com;
error_log /var/log/nginx/rocketchat.access.log;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forward-Proto http;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
}
}
22.Apache 的反向代理
server {
server_name domain.tld;
access_log /log/domain.tld.access.log;
error_log /log/domain.tld.error.log;
root /var/www/domain.tld/htdocs;
# 将请求传递给 Apache 后端
location / {
proxy_pass http://backend;
}
# 使用后备处理静态文件
location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|woff2|ttf|m4a|mp4|ttf|rss|atom|jpe?g|gif|cur|heic|png|tiff|ico|zip|webm|mp3|aac|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|swf|webp)$ {
add_header "Access-Control-Allow-Origin" "*";
access_log off;
log_not_found off;
expires max;
try_files $uri @fallback;
}
# 如果找不到文件,则回退以将请求传递给 Apache
location @fallback {
proxy_pass http://backend;
}
}
23.Gitlab 的反向代理
server {
#侦听的80端口
listen 80;
server_name git.example.cn;
location / {
proxy_pass http://localhost:3000;
# 以下是一些反向代理的配置可删除
proxy_redirect off;
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
client_max_body_size 10m; # 允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; # 缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 300; # nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 300; # 后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 300; # 连接成功后,后端服务器响应时间(代理接收超时)
# 设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
# proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_buffers 4 32k;
# 高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
}
}
24.重定向整个网站
server {
server_name old-site.com;
return 301 $scheme://new-site.com$request_uri;
}
25.重定向单页
server {
location = /oldpage.html {
return 301 http://example.org/newpage.html;
}
}
26.重定向整个子路径
location /old-site {
rewrite ^/old-site/(.*) http://example.org/new-site/$1 permanent;
}
27.负载均衡
upstream example {
ip_hash;
# upstream的负载均衡,weight是权重,可以根据机器配置定义权重。
# weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.122.11:8081 ;
server 127.0.0.1:82 weight=3;
server 127.0.0.1:83 weight=3 down;
server 127.0.0.1:84 weight=3; max_fails=3 fail_timeout=20s;
server 127.0.0.1:85 weight=4;
keepalive 32;
}
server {
#侦听的80端口
listen 80;
server_name git.example.cn;
location / {
# 在这里设置一个代理,和 upstream 的名字一样
proxy_pass http://example;
}
}
28.内容缓存
允许浏览器基本上永久地缓存静态内容。Nginx 将为您设置 Expires 和 Cache-Control 头信息
location /static {
root /data;
expires max;
}
如果要求浏览器永远不会缓存响应(例如用于跟踪请求),请使用 -1
location = /empty.gif {
empty_gif;
expires -1;
}
29.跨域问题
server {
listen 80;
server_name api.xxx.com;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,HEAD';
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
30.重定向 URI 来解决跨域问题
upstream test {
server 127.0.0.1:8080;
server localhost:8081;
}
server {
listen 80;
server_name api.xxx.com;
location / {
root html; # 去请求../html文件夹里的文件
index index.html index.htm; # 首页响应地址
}
# 用于拦截请求,匹配任何以 /api/开头的地址,
# 匹配符合以后,停止往下搜索正则。
location ^~/api/{
# 代表重写拦截进来的请求,并且只能对域名后边的除去传递的参数外的字符串起作用
# 例如www.a.com/api/msg?meth=1&par=2重写,只对/api/msg重写。
# rewrite后面的参数是一个简单的正则 ^/api/(.*)$,
# $1代表正则中的第一个(),$2代表第二个()的值,以此类推。
rewrite ^/api/(.*)$ /$1 break;
# 把请求代理到其他主机
# 其中 http://www.b.com/ 写法和 http://www.b.com写法的区别如下
# 如果你的请求地址是他 http://server/html/test.jsp
# 配置一:http://www.b.com/ 后面有“/”
# 将反向代理成 http://www.b.com/html/test.jsp 访问
# 配置一:http://www.b.com 后面没有有“/”
# 将反向代理成 http://www.b.com/test.jsp 访问
proxy_pass http://test;
# 如果 proxy_pass URL 是 http://a.xx.com/platform/ 这种情况
# proxy_cookie_path应该设置成 /platform/ / (注意两个斜杠之间有空格)。
proxy_cookie_path /platfrom/ /;
# 设置 Cookie 头通过
proxy_pass_header Set-Cookie;
}
}
31.跳转到带 www 的域上面
server {
listen 80;
# 配置正常的带www的域名
server_name www.zuolaoshi.cn;
root /home/www/wabg/download;
location / {
try_files $uri $uri/ /index.html =404;
}
}
server {
# 将不带 www 的 zuolaoshi.cn
# 永久性重定向到 https://www.zuolaoshi.cn
server_name zuolaoshi.cn;
rewrite ^(.*) https://www.zuolaoshi.cn$1 permanent;
}
32.代理转发
upstream server-api {
# api 代理服务地址
server 127.0.0.1:3110;
}
upstream server-resource {
# 静态资源 代理服务地址
server 127.0.0.1:3120;
}
server {
listen 3111;
server_name localhost; # 这里指定域名
root /home/www/server-statics;
# 匹配 api 路由的反向代理到API服务
location ^~/api/ {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://server-api;
}
# 假设这里验证码也在API服务中
location ^~/captcha {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://server-api;
}
# 假设你的图片资源全部在另外一个服务上面
location ^~/img/ {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://server-resource;
}
# 路由在前端,后端没有真实路由,
# 路由不存在的 404 状态的页面返回 /index.html
# 使用场景,用在 React/Vue项目没有真实路由
location / {
try_files $uri $uri/ /index.html =404;
# 空格很重要 ^
}
}
33.屏蔽 IP
可以放到 http
, server
, location
, limit_except
语句块
include blockip.conf;
在 blockip.conf
里面输入内容,如:
deny 165.91.122.67;
deny IP; # 屏蔽单个 ip 访问
allow IP; # 允许单个 ip 访问
deny all; # 屏蔽所有 ip 访问
allow all; # 允许所有 ip 访问
deny 123.0.0.0/8; # 屏蔽整个段即从 123.0.0.1 到 123.255.255.254 访问的命令
deny 124.45.0.0/16; # 屏蔽IP段即从 123.45.0.1 到 123.45.255.254 访问的命令
deny 123.45.6.0/24; # 屏蔽IP段即从 123.45.6.1 到 123.45.6.254 访问的命令
# 如果你想实现这样的应用,除了几个IP外,其他全部拒绝
allow 1.1.1.1;
allow 1.1.1.2;
deny all;
34.强制将 http 重定向到 https
server {
listen 80;
server_name example.com;
rewrite ^ https://$http_host$request_uri? permanent; # 强制将 http 重定向到 https
# 在错误页面和“服务器”响应头字段中启用或禁用发射nginx版本。 防止黑客利用版本漏洞攻击
server_tokens off;
}
35.代理转发连接替换
location ^~/api/upload {
rewrite ^/(.*)$ /wfs/v1/upload break;
proxy_pass http://wfs-api;
}
将地址 /api/upload
替换为 /wfs/v1/upload
36.爬虫 User-Agent 过滤
location / {
if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp") {
return 503;
}
# 正常处理
# ...
}
37.图片防盗链
location ~* \.(gif|jpg|png|swf|flv)$ {
root html;
valid_referers none blocked *.nginx.com;
if ($invalid_referer) {
rewrite ^/ www.nginx.cn;
# return 404;
}
}
38.虚拟目录配置
location /img/ {
alias /var/www/image/;
}
# 访问 /img/ 目录里面的文件时,
# 会自动去 /var/www/image/ 目录找文件
location /img/ {
root /var/www/image;
}
# 访问 /img/ 目录下的文件时,
# 会去 /var/www/image/img/ 目录下找文件
39.屏蔽文件目录
通用备份和归档文件
location ~* "\.(old|orig|original|php#|php~|php_bak|save|swo|aspx?|tpl|sh|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" {
deny all;
}
拒绝访问 .git
和 .svn
目录
location ~ (.git|.svn) {
deny all;
}
拒绝访问隐藏文件和目录
location ~ /\.(?!well-known\/) {
deny all;
}
40.防盗图配置
location ~ \/public\/(css|js|img)\/.*\.(js|css|gif|jpg|jpeg|png|bmp|swf) {
valid_referers none blocked *.jslite.io;
if ($invalid_referer) {
rewrite ^/ http://zuolaoshi.cn/piratesp.png;
}
}
41.ulimit 不继承系统设置的问题
- • 执行 status 命令
sudo service nginx status
执行 status 命令,看到 Loaded: loaded (/lib/systemd/system/nginx.service;...) 这一行的nginx.service 文件位置
- • 打开 service 文件
sudo vim /lib/systemd/system/nginx.service
- • 修改 service 中的配置 找到
[Service]
部分,将LimitNOFILE=65535
添加到该部分
[Service]
...
LimitNOFILE=65535
...
解决 systemctl
管理的 ulimit 不继承系统设置的问题
42.Gzip 配置
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
gzip_disable "msie6";
43.阻止常见攻击
1.base64编码的网址
location ~* "(base64_encode)(.*)(\()" {
deny all;
}
2.javascript eval() url
location ~* "(eval\()" {
deny all;
}
44.使网站不可索引
add_header X-Robots-Tag "noindex";
location = /robots.txt {
return 200 "User-agent: *\nDisallow: /\n";
}