Nginx配置
Nginx 配置文件说明
# 启动进程,通常设置成和 CPU 的核心数量相等
worker_processes 1;
events {
# epoll 是多路复用 IO(I/O Multiplexing) 中的一种方式
# 但是仅用于 linux2.6 以上内核,可以大大提高 nginx 的性能
use epoll;
# 单个后台 worker process 进程的最大并发链接数
worker_connections 1024;
}
http {
# 引用外部的mime.types文件,设定类型;
# 此文件中定义了对于不同后缀的文件,http使用不同的响应方式(
# 如.js文件直接加载,而.mp4文件则是下载)
include mime.types;
# 若文件类型没在mime.types中指定,则使用默认octet-stream方式
# 传输给客户端
default_type application/octet-stream;
# sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)
# 来输出文件,对于普通应用,必须设为 on,如果用来进行下载等应用磁盘
# IO 重负载 应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,
# 降低系统的 uptime.
sendfile on;
# http长连接空闲保持时间,在此时间内客户端若有新的请求,则保持连接;(默认60s)
keepalive_timeout 65s;
# 一个长连接最大处理请求数量;一个长连接建立之后,Nginx就会为这个连接设置一个计数器,
# 若请求超过最大值,Nginx会强行关闭这个长连接,逼迫客户端重新建立连接。(默认值100)
keepalive_requests 100;
# 设定请求缓冲
client_header_buffer_size 2k;
# 配置虚拟主机 192.168.75.145
server {
# 监听的ip和端口,配置 192.168.75.145:80
listen 80;
# 虚拟主机名称,可以是单个或多个ip、域名;
server_name 192.168.75.145;
# 所有的请求都以 / 开始,所有的请求都可以匹配此 location
location / {
# 使用 root 指令指定虚拟主机目录即网页存放目录
root /usr/share/nginx/wwwroot/html80;
# 指定欢迎页面,按从左到右顺序查找
index index.html index.htm;
}
# 错误页
error_page 404 500 502 /404.html;
location /404.html {
root html
}
}
# 配置虚拟主机
server {
listen 8080;
server_name 192.168.75.145;
location / {
root /usr/share/nginx/wwwroot/html8080;
index index.html index.htm;
}
}
}Nginx 虚拟主机(静态服务器)
基于域名
提示
域名可以使用通配符*,表示任意字符;也可以使用正则
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name admin.service.com;
location / {
root /usr/share/nginx/wwwroot/myshop;
index index.html index.htm;
# 列出文件夹内容,可在网页上查看
autoindex on;
# 设置本地浏览器缓存3天;会自动对比版本并替换为最新;
expires 3d;
}
}
server {
listen 80;
server_name *.web.com;
location / {
root /usr/share/nginx/wwwroot/myshop/myapp;
index index.html index.htm;
# 列出文件夹内容,可在网页上查看
autoindex on;
# 设置本地浏览器缓存3天;会自动对比版本并替换为最新;
expires 3d;
}
}
}注意
location 和 root 配合使用:
root 若是相对路径,相对路径根目录为 nginx 安装目录
root 若是绝对路径,则对应的文件目录为: root + location
基于端口
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 127.0.0.1;
location / {
root /usr/share/nginx/wwwroot/myshop;
index index.html index.htm;
}
}
server {
listen 8080;
server_name 127.0.0.1;
location / {
root /usr/share/nginx/wwwroot/myshop/myapp;
index index.html index.htm;
}
}
}Nginx 反向代理
反向代理主要通过 proxy_pass 实现, 注意其位置在 location 内
提示
一旦 location 中配置了 proxy_pass,则 root 和 index 配置项将不再生效!
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 简单匹配:访问 localhost:8080 反向代理到 http://victor.spring-cloud.cn
server {
listen 8080;
# server_name 使用 _ 结尾,会匹配任何未被其他 server 块显式捕获的请求
# _ 结尾适用于兜底;如本机局域网 IP 为192.168.1.100,由于设置了 localhost、127.0.0.1 匹配,
# 访问 192.168.1.100:8080 时,若以 _ 结尾,则能正常访问,否则访问失败。
# server_name localhost 127.0.0.1 _;
server_name localhost 127.0.0.1;
location / {
proxy_pass http://victor.spring-cloud.cn/;
# 以下配置均无效
root /usr/share/nginx/wwwroot/myshop;
index index.html index.htm;
}
}
# 匹配规则 -- location
# 以下示例表示: 访问 127.0.0.1:8081/api/a 反向代理到 http://victor.spring-cloud.cn/api/a
# location /api/ 和 location /api 的区别是匹配精度不同
# /api 能匹配 /api、/apis、/apiss/s 等路径,但 /api/ 只能匹配类似 /api/xxx 的路径
server {
listen 8081;
server_name 127.0.0.1;
location /api/ {
proxy_pass http://victor.spring-cloud.cn;
}
}
# 匹配规则 -- proxy_pass
# 以下示例表示: 访问 127.0.0.1:8081/api/aa 反向代理到 http://victor.spring-cloud.cn/aa
# proxy_pass 是否以 / 结尾,表示是否保留 location 指定的路径;/ 结尾不保留,否则保留
# 通常的做法是将 location 指定的路径和 proxy_pass 的 url 保持一致,更容易理解
# 如 location /api/ 搭配 proxy_pass http://victor.spring-cloud.cn/api/;
server {
listen 8082;
server_name 127.0.0.1;
location /api/ {
proxy_pass http://victor.spring-cloud.cn/; # 注意此处末尾以 / 结尾
}
}
}Nginx 负载均衡
负载均衡需结合反向代理使用,并使用 upstream 配置项
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
server 192.168.75.145:9090 weight=10;
server 192.168.75.145:9091 weight=5;
# 设置到上游服务器保持的最大长连接数量;
# 这里可以简单理解为连接池可以缓存1000个连接;
keepalive 1000;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
# 设置超时断开连接
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 300s;
# 若下游传递Connection close头,防止关闭长连接。
proxy_set_header Connection "";
}
}
}负载均衡策略
轮询:默认配置,在 upstream 中不指定策略即可
权重:添加
weight= 数值 ,数值越大,几率越大down:添加
down关键字,则不参与负载均衡backup:添加
backup关键字,不参与负载均衡,但当其他机器不可用时,使用当前机器
ip_hash
同一个IP的请求只会访问到一个机器上;若访问者IP会变,要注意是否会产生问题
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
ip_hash;
server 192.168.75.145:9090;
server 192.168.75.145:9091;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
}
}
}fair
根据服务器响应时间分配请求,响应时间短的优先分配
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
server 192.168.75.145:9090;
server 192.168.75.145:9091;
fair;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
}
}
}其他 hash
Cookie
根据请求头携带的 Cookie 值,相同 Cookie 访问同一台机器;此配置需注意浏览器禁用 Cookie 的问题
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
hash $cookie_jsessionid;
server 192.168.75.145:9090;
server 192.168.75.145:9091;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
}
}
}uri
同一 uri 访问相同机器
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
hash $request_uri;
server 192.168.75.145:9090;
server 192.168.75.145:9091;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
}
}
}UrlRewrite 伪静态配置
若原本的 url 为 http://www.test.com/index.jsp?pageNum=10,且参数为动态
现在想在浏览器输入 http://www.test.com/10.html 达到相同的效果,则可以使用以下配置
主要由 rewrite 配置项实现:
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
server 192.168.75.145:9090 weight=10;
server 192.168.75.145:9091 weight=5;
}
server {
listen 80;
server_name www.test.com;
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
proxy_pass http://myapp;
}
location ~*/(js|img|css) {
root html;
}
}
}提示
- 观察 rewrite 配置项中的
$1,它表示动态获取第一个正则的值,即([0-9]+)匹配的值 - break 关键字表示 本条规则匹配完成即终止,不再匹配后面的任何规则
其他关键字:
last #本条规则匹配完成后,继续向下匹配新的 location URI 规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址
permanent #返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址
防盗链
若站内的图片、css、js 等资源不想让其他站点直接访问,可通过防盗链设置实现
例如在 html 中通过 url 直接引用外部 js,js 请求头中会携带 refer 属性,用于标明引用者的身份;nginx 可通过判断 refer 属性值是否合法,来决定放行与否;
防盗链 valid_referers 配置项说明
valid_referers none | blocked | server_names | strings ....;- none, 设置为 none,没有 refer 属性直接放行;只有间接引用,header 中才会有 refer 属性;浏览器直接打开,则没有 refer 属性;
- blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头;此配置不太常用;
- server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
不让其他站点引用资源
只允许 www.test.com 引用或浏览器直接访问访问图片、css、js
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.test.com;
location ~*/(js|img|css) {
valid_referers none www.test.com;
if ($invalid_referer) {
return 403;
}
root html;
}
}
}提示
return 403 表示禁止访问,直接返回状态码给浏览器;也可以是错误页、图片等
错误页
再单独配置一个错误页处理
error_page 403 /403.html; location /403.html { root html }图片
return 403 替换成如下
rewrite ^/ /img/error.png
配置 websocket
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
# websocket接口
location /api/log/test_log {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8080/api/log/test_log;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}nginx 解决跨域问题
以下示例表示前端和后台都部署在同一台服务器中:
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name test.zjx.com;
# 前端部署路径
location / {
root D:/cloudServer/nginx/front;
# root /usr/local/app/front
index index.html index.htm;
}
# 后端接口允许跨域访问
location /api/ {
proxy_pass http://localhost:8080/api/;
# 允许跨域
add_header Access-Control-Allow-Methods *;
# 预检命令的缓存,如果不缓存每次会发送两次请求
add_header Access-Control-Max-Age 3600;
# 带cookie请求需要加上这个字段,并设置为true
add_header Access-Control-Allow-Credentials true;
# 表示允许这个域跨域调用(客户端发送请求的域名和端口)
# $http_origin 动态获取请求客户端请求的域;不用*的原因是带cookie的请求不支持*号【报错but only one is allowed说明和服务端的CorsFilter冲突,删掉这条就行】
add_header Access-Control-Allow-Origin $http_origin;
# 表示请求头的字段 动态获取
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
# OPTIONS预检命令,预检命令通过时才发送请求
# 检查请求的类型是不是预检命令
if ( $request_method = OPTIONS ) {
return 200;
}
}
}
}
