静态服务
server {
listen 80;
server_name static.sherlocked93.club;
# 防止中文文件名乱码
charset utf-8;
location /download {
# 静态资源目录
alias /usr/share/nginx/html/static;
# 开启静态资源列目录
autoindex on;
# on(默认)显示文件的确切大小,单位是byte;off显示文件大概大小,单位:KB、MB、GB
autoindex_exact_size off;
# off(默认)时显示的文件时间为GMT时间;on显示的文件时间为服务器时间
autoindex_localtime off;
}
}
图片防盗链
server {
listen 80;
server_name *.sherlocked93.club;
# 图片防盗链
location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
# 只允许本机 IP 外链引用
valid_referers none blocked server_names ~\.google\. ~\.baidu\. *.qq.com;
if ($invalid_referer){
return 403;
}
}
}
什么是referer
请求头?
referer
请求头包含了当前请求页面的来源地址,即表示当前页面是通过这个来源页面里的链接进入的。服务端一般使用
referer
请求头识别访问来源
,可能会以此进行统计分析、日志记录以及缓存优化等。
利用referer
防止盗链?
假设当一个
HTTP
请求头的referer
字段中包含一些不正确(期望)的值。那么可以使用
nginx
的ngx_http_referer_module
模块,禁止这个请求访问站点。也就是常说的
nginx
防盗链,不过需要注意的是,referer
请求头是可以伪造的,因此这个模块并不能 100%
的阻止这类请求。防盗链功能主要由模块中的
valid_referers
指令与$invalid_referer
变量配合使用。
请求过滤
# 非指定请求全返回 403
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
return 403;
}
location / {
# IP访问限制(只允许IP是 192.168.0.2 机器访问)
allow 192.168.0.2;
deny all;
root html;
index index.html index.htm;
}
配置图片、字体等静态文件缓存
-
有
hash
值的静态文件:缓存可以设置长一些,先设置强制缓存
,在设置协商缓存
; -
没有
hash
值的静态文件:建议不设置强制缓存,仅通过协商缓存
判断是否需要使用缓存强制缓存:浏览器不与服务端协商直接取浏览器缓存
协商缓存:浏览器会先向服务器确认资源的有效性后才决定是从缓存中取资源还是重新获取资源
# 图片缓存时间设置
location ~ .*\.(css|js|jpg|png|gif|swf|woff|woff2|eot|svg|ttf|otf|mp3|m4a|aac|txt)$ {
expires 10d;
}
# 如果不希望缓存
expires -1;
单页面项目 history 路由配置
server {
listen 80;
server_name fe.sherlocked93.club;
location / {
# 前端页面文件夹
root /usr/share/nginx/html/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html @rewrites;
# 首页一般没有强制缓存
expires -1;
add_header Cache-Control no-cache;
}
# 接口转发,如果需要的话
#location ~ ^/api {
# proxy_pass http://be.sherlocked93.club;
#}
location @rewrites {
rewrite ^(.+)$ /index.html break;
}
}
HTTP 请求转发到 HTTPS
# 两种方式:1、return 301;2、使用 rewrite
server {
listen 80;
server_name www.sherlocked93.club;
# 单域名重定向
if ($host = 'www.sherlocked93.club'){
return 301 https://www.sherlocked93.club$request_uri;
}
# 全局非 https 协议时重定向
if ($scheme != 'https') {
return 301 https://$server_name$request_uri;
}
# 或者全部重定向
return 301 https://$server_name$request_uri;
# 以上配置选择自己需要的即可,不用全部加
}
泛域名路径分离
配置一些二级或者三级域名,希望通过Nginx
自动指向对应目录,比如:
test1.doc.sherlocked93.club
自动指向/usr/share/nginx/html/doc/test1
服务器地址;test2.doc.sherlocked93.club
自动指向/usr/share/nginx/html/doc/test2
服务器地址;
server {
listen 80;
server_name ~^([\w-]+)\.doc\.sherlocked93\.club$;
root /usr/share/nginx/html/doc/$1;
}
泛域名转发
把二级或者三级域名链接重写到我们希望的路径,让后端就可以根据路由解析不同的规则:
test1.serv.sherlocked93.club/api?name=a
自动转发到127.0.0.1:8080/test1/api?name=a
;test2.serv.sherlocked93.club/api?name=a
自动转发到127.0.0.1:8080/test2/api?name=a
;
server {
listen 80;
server_name ~^([\w-]+)\.serv\.sherlocked93\.club$;
location / {
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;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8080/$1$request_uri;
}
}
最佳实践
- 为了使
Nginx
配置更易于维护,建议为每个服务创建一个单独的配置文件,存储在/etc/nginx/conf.d
目录,根据需求可以创建任意多个独立的配置文件。 - 独立的配置文件,建议遵循以下命名约定
<服务>.conf
,比如域名是sherlocked93.club
,那么你的配置文件的应该是这样的/etc/nginx/conf.d/sherlocked93.club.conf
,如果部署多个服务,也可以在文件名中加上Nginx
转发的端口号,比如sherlocked93.club.8080.conf
,如果是二级域名,建议也都加上fe.sherlocked93.club.conf
。 - 常用的、复用频率比较高的配置可以放到
/etc/nginx/snippets
文件夹,在Nginx
的配置文件中需要用到的位置 include 进去,以功能来命名,并在每个 snippet 配置文件的开头注释标明主要功能和引入位置,方便管理。比如之前的gzip
、cors
等常用配置,我都设置了 snippet。 Nginx
日志相关目录,内以域名.type.log
命名(比如be.sherlocked93.club.access.log
和be.sherlocked93.club.error.log
)位于/var/log/nginx/
目录中,为每个独立的服务配置不同的访问权限和错误日志文件,这样查找错误时,会更加方便快捷
参考地址: