配置 Nginx
Nginx 是一种轻量级、高性能、低内存的 Web 服务器和反向代理服务器。
1. 正向代理和反向代理
正向代理:客户端向服务器发送请求,并指定目标服务器地址,然后由代理服务器和原始服务器通信,转交请求并获得响应,再返回给客户端。正向代理隐藏了真实的客户端,使真实的客户端对服务器不可见。
反向代理:以代理服务器来接收互联网上的连接请求,然后将连接请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给客户端。此时的代理服务器对外就表现为一个反向代理服务器。
2. 配置 Nginx
Mac 系统可以借助 brew 安装 Nginx。brew install nginx
,安装成功后,配置文件在 /usr/local/etc/nginx 目录下。
Windows 系统可以在官网 下载 nginx。
解压缩后,配置文件在 \conf 目录下。移除掉部分被注释掉的代码(前面添加了 #
的那行代码)后,默认配置如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#access_log logs/access.log main;
sendfile on; # 设置为 on 时,Nginx 会使用 sendfile() 系统调用来传输静态文件
#tcp_nopush on;
keepalive_timeout 65; # 当这个超时 65s 到达时,如果连接上没有新的数据传输,Nginx 会关闭这个连接。
#gzip on;
server {
listen 80;
server_name localhost;
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;
}
}
}
events 和 http 在最外层,server 在 http 中,location 在 server 中。server 和 location 都可以有多个配置,多个 server 代表多个服务,location 代表多个匹配规则。
该 server 监听了 80 端口,location 指定与请求中的 URI 的 "/" 前缀相匹配。例如请求 http://localhost/80
那么 nginx 会映射到 html/index.html
文件。
3. 配置反向代理
在前端开发中经常需要配置反向代理,已解决跨域问题。修改上面配置:
location / {
proxy_pass https://www.baidu.com
}
这样访问页面就代理到百度了。
如果部署的服务是内网地址,如:192.168.0.110:10086,那么该如何配置。需要使用 upstream
,它用来定义一组服务器,这些服务器可以监听不同的端口:
upstream backend-servers {
server 192.168.0.110:10086
server 192.168.0.111:10087 # 配置多个服务器
}
这时,location 要改成:
location / {
proxy_pass http://backend-servers
}
4. 开启 gzip 压缩
gzip 是一种常用的网页压缩技术,通过 gzip 压缩之后,体积通常变为原来的一半甚至更小,节省带宽和提升传输速度。网络请求头中需要包含:Accept-Encoding: gzip
表示期望通过 gzip 压缩。
nginx 将经过 gzip 压缩过后的文件给浏览器并在响应头重添加:content-encoding: gzip
,告诉浏览器自己采用的压缩算法是 gzip。
gzip on; # 默认 off,on 表示开启 gzip
gzip_types text/plain text/csss application/json text/xml text/javascript # gzip_types 表示要采用 gzip 压缩的 MIME 文件类型
5. 图片防盗配置
由于图片可以跨域访问,所以当图片被其他网站引用时,无形中增加了自家服务器负担。
server {
# 图片防盗链
location ~* \.(png|jpeg|jpg|gif)$ {
valid_referers none blocked erver_names ~\.test\. ~\.test2\. *.qq.com;
if ($invalid_referer) {
return 403;
}
}
}
过滤请求:
# 如果是非指定请求,全返回 403
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 403;
}
location / {
# IP 地址访问限制(只允许 192.168.0.110 的机器访问)
allow 192.168.0.110
deny all;
}