资讯专栏INFORMATION COLUMN

nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等

JayChen / 369人阅读

摘要:经由超文本传输协议通信,但是数据包由安全协议加密,实现加密数据与认证功能。该模块指令定义相关设置证书文件,私钥文件,会话缓存等内容。允许在客户端建立会话时传递请求服务器名称,这样服务器就会知道该发送哪个虚拟主机下的证书文件。

1、nginx基本状态信息页面

配置示例:

location  /basic_status {
                            stub_status;
                        }

页面展示含义:

Active connections: 291 
server accepts handled requests
    16630948 16630948 31070465 
Reading: 6 Writing: 179 Waiting: 106     

Active connections: 活动状态的连接数;
accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的总的请求数;
Reading:处于读取客户端请求报文首部的连接的连接数;
Writing:处于向客户端发送响应报文过程中的连接数;
Waiting:处于等待客户端发出请求的空闲连接数;
2、记录请求日志

指令:

log_format
作用域: http

access_log
作用域: http, server, location, if in location, limit_except

open_log_file_cache
作用域: http, server, location

2.1 log_format

在http区域定制日志格式
用法:log_format name string ...;
name指定一个格式名称,string可以使用nginx核心模块及其它模块内嵌的变量指定格式。

2.2 access_log

可在每个server中,或location中指定一个日志存放路径
用法:

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;

指定日志存放路径path,格式format,缓冲区大小buffer,也可启用压缩日志,指定压缩级别gzip

2.3 open_log_file_cache

定义一个缓存保存活跃的日志文件描述符数据
用法:

open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;

max:缓存的最大文件描述符数量;
min_users:在inactive指定的时长内访问大于等于此值方可被当作活动项;
inactive:非活动时长;
valid:验证缓存中各缓存项是否为活动项的时间间隔;
配置示例:

log_format combined "$remote_addr - $remote_user [$time_local] "
                       ""$request" $status $bytes_sent "
                       ""$http_referer" "$http_user_agent" "$gzip_ratio"";

access_log /var/logs/nginx-access.log combined buffer=32k;
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
3、rewrite重写

将用户请求的URI基于regex所描述的模式进行检查,而后完成替换;
URL重写是一个非常有用的功能,如果一个网站在改进的过程中结构发生变化,无需客户端更改已保存访问地址仍可正常访问;提升网站安全性,如放盗链行为。

3.1 rewrite
syntax: rewrite regex replacement [flag]
Context:    server, location, if

将用户请求的URI基于regex所描述的模式匹配检查,匹配到时将其替换成replacement指定的新URI;
rewrite指令在同一级配置块中存在多条rewrite规则,会按照顺序自上而下逐一执行;被某一规则替换完成后,重新开始新一轮检查,因此本身具有循环机制,flag所表示的标志位可控制循环机制;如果replacement是以http://或其他协议开头的字符串,则直接以重定向方式返回给客户端;
另外,rewrite指令接收到的URI是不包含host地址的,例如http://cutemsyu.com/articles/...,不包含"cutemsyu.com" ,在写regex规则时应当注意。

[flag] 可用标识如下:

last:停止在当前区域继续处理,将重写的新URI在各location中重新处理;

break:将此处重写的URI在本块中继续处理,但新的URI不会转向其他location中处理;

redirect:将重写的URI直接返回给客户端,状态代码为302,表示临时重定向。用在replacement不以"http://"或"https://"开头的情况下;

permanent:将重写的URI直接返回给客户端,状态码为301,指明为永久重定向。

Example:

#flag 是last的一个例子
server {
    ...
    rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra  last;
    return  403;
    ...
}

#如果上面的rewrite规则写在location中,则应该使用break标识,防止死循环,如果循环超过10此,返回500错误码
location /download/ {
    rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 break;
    rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra  break;
    return  403;
}
3.2 return
syntax: return code [text];
        return code URL;
        return URL;
context: server, location, if

停止处理并返回一个状态码给客户端。

3.3 if 指令
syntax: if (condition) { ... }
context: server, location

引入一个新的配置上下文,满足条件时执行配置块中的指令
condition为判断条件,支持三种设置方法:

变量名,如果变量值为空字符串或者以0开头的任意字符串,则表示条件为false

使用比较符判断变量与字符串的逻辑关系

判断文件或目录存在情况

其中 比较操作符有:

=

!=

~ 模式匹配,区分字符大小写

~* 模式匹配,不区分字符大小写

!~:模式不匹配,区分字符大小写

!~*:模式不匹配,不区分字符大小写

文件及目录存在性判断:

-e, !-e 检查一个文件,目录,或软链接是否存在

-f, !-f 检查一个文件是否存在

-d, !-d 检查一个目录是否存在

-x, !-x 检查一个文件是否可执行

Example:

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;  
}

if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}
3.4 rewrite的应用 3.4.1 域名跳转

Example:

#访问video.cutemsyu.com 跳转至v.cutemsyu.com
server {
    listen 80;
    server_name video.cutemsyu.com;
    rewrite ^(.*) http://v.cutemsyu.com$1 ;
    ...
}
3.4.2 rewrite uri中参数

默认情况下nginx进行rewrite后都会自动添加旧地址中参数部分,在replacement末尾添加"?"即可屏蔽旧地址中的参数
Example:

   ##原来的访问的url为http://cutemsyu.com/article/nature/index.php?id=22341
   rewrite ^/article/nature/(.*) http://cutemsyu.com/article/natrue.html permanent
   重写之后访问的URL为http://cutemsyu.com/article/nature.html?id=22341
   也就是说原有的参数部分它会自动补上
   rewrite ^/article/nature/(.*) http://cutemsyu.com/article/natrue.html? permanent
   重写之后的URL为http://cutemsyu.com/article/nature.html,没有原来的参数部分
    
3.4.3 防盗链

通常为了加快客户端访问资源响应时间,服务器不会一次性将全部资源响应给客户端,首先传回网页的文本内容,当客户端解析文本内容中的图片、视频等资源时会再次向服务器发起请求。当某个站点将图片链接指向其他服务器,给其他服务器造成负担,这就是非法的盗链行为。我们在搭建服务站点时要有意识防范盗链行为。
http协议头部中referer头域表示访问当前资源的源地址,根据referer中的源地址URL来判断是否来自本站,如非本站的地址,采取阻断措施防止盗链。


syntax: valid_referers none | blocked | server_names | string ...;
context: server,location;

valid_referers 指令根据规则检测头域中referer中值是否合法,如果非法内嵌变量 $invalid_referer 值为1.
参数含义:

none,表示检测referer为空的情况

blocked,表示检测referer的值被防火墙或者代理服务器删除的情况,通常referer的值不以http://或https:// 开头

server_names,referer的值应该被包含在server_name中

string,定义字符串形式。

开始或尾部带有通配符*

正则表达式,以~引导,匹配http://后面的内容

Example:

#如果发现盗链,重写链接为指定的表示禁止盗用的图片
server {
    listen 80;
    server_name v.cutemsyu.com;
    location ~* ^.+.(gif|jpg|png|flv|mp4|swf)$ {
        valid_referers none blocked server_names *.cutemsyu.com ~.google.
        if ($invalid_referer) {
            rewrite ^/ http://v.cutemsyu.com/images/forbbiden.jpg
        }
    }
}
4、gzip压缩

压缩文本数据,提升网络响应速度,作为静态服务器使用很有必要开启,压缩文本将节省大量带宽,同时提升响应速度。但是如果作为反向代理服务器则需要考虑,压缩功能是否应该由后端服务器承担,以此减轻前端服务器CPU压力。

4.1 ngx_http_gzip_module

该模块功能是对指定类型数据使用gzip方法压缩
作用域Context: http, server, location

gzip on |off;

此模块gzip功能启用或禁用

gzip_types mime-types ... ;

压缩过滤器,仅对指定的MIME类型进行压缩处理

gzip_comp_level level;

设置压缩级别1-9,默认值为1压缩速率最快,压缩比最低

gzip_min_length length;

启用压缩功能的响应报文大小阈值,小于该置不进行压缩。防止有些小数据压缩之后更大的情况,推荐值为1024

gzip_buffers number size;

压缩数据使用缓冲区大小,size默认为内存分页大小

gzip_disable regex;

旧版本的浏览器对于gzip功能支持不完善,对于该指令配置的正则信息与浏览器类型匹配,匹配成功的响应不进行压缩处理

gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;

nginx作为反向代理服务器接收后端服务器响应结果压缩控制

4.2 ngx_http_gunzip_module

解压模块,该模块对于不支持压缩功能的浏览器请求,响应结果如果被压缩则将其解压后返回给客户端。适用于某些以gzip方式压缩过存储的数据。
作用域Context: http, server, location
提示该模块不是默认编译内容,编译选项--with-http_gunzip_module

gunzip on |off ;
是否开启该模块功能

gunzip buffers number size;

用于解压数据使用的缓冲区空间配置

4.3 ngx_http_gzip_static_module

静态压缩模块,该模块允许发送预压缩数据,如果客户端请求的数据已被压缩过,且客户端支持gzip压缩,则直接返回压缩数据。
作用域Context: http, server, location
提示该模块不是默认编译内容,编译选项--with-http_gzip_static_module

gzip_static on | off ;
是否开启该模块

gzip_disable regex;
对于适配浏览器类型禁止gzip功能

4.4 配置示例
gzip on;
gzip_comp_level 3;
gzip_types text/html text/css text/xml text/plain application/javascript;
gzip_min_length 1024;
gzip_disable "MISE [4-6].";
gzip_buffers 8 16K;
gunzip on;         #支持自动解压功能
5、ssl模块

HTTP协议属于明文协议,通过抓包就可获取一些隐私数据。HTTPS经由超文本传输协议HTTP通信,但是数据包由SSL/TLS 安全协议加密,实现加密数据与认证功能。
ngx_http_ssl_module 该模块指令定义https相关设置:证书文件,私钥文件,ssl会话缓存等内容。
作用域Context: http, server

5.1 指令介绍
 1. ssl on | off;
 设定虚拟主机是否启用HTTPS协议
 2. ssl_certificate file;
 指定当前虚拟主机使用的PEM格式的证书文件
 3. ssl_certificate_key file;
 指定当前虚拟主机上与其证书相匹配的私钥文件
 4. ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
 支持ssl协议版本,默认为后三个
 5. ssl_session_cache off | none | [builtin[:size]] [ shared:name:size ];
 ssl会话缓存设置。
 builtin[:size] --使用OpenSSL内建的缓存,此缓存为每worker私有。容易产生内存碎片不推荐。
 shared:name:size --worker之间共享的缓存区域,size单位为bytes,1MB可存储4000个会话;name为共享缓存区域名称,多个虚拟主机可使用同一个共享缓存区。
 6. ssl_session_timeout time;
 客户端可重复使用会话参数的超时时长。默认5分钟

Example:

server {
                listen 443 ssl;
                server_name www.cutemsyu.com;
                root /website/ssl/htdocs;
                ssl on;
                ssl_certificate /etc/nginx/ssl/nginx.crt;
                ssl_certificate_key /etc/nginx/ssl/nginx.key;
                ssl_session_cache shared:sslcache:15m;
                ssl_session_timeout 3m;
            }
5.2 基于域名的HTTPS虚拟主机

值得考虑的一个问题是如何实现多个HTTPS虚拟主机监听在同一IP地址上。
情况一:每个虚拟主机使用各自的证书文件,如下

server {
    listen          443 ssl;
    server_name     www.example.com;
    ssl_certificate www.example.com.crt;
    ...
}

server {
    listen          443 ssl;
    server_name     www.example.org;
    ssl_certificate www.example.org.crt;
    ...
}

如此配置的话,客户端访问这两个站点建立SSL会话时收到的都是默认主机的证书文件。该问题是由于SSL协议造成的,SSL链接在客户端发送HTTP请求之前建立起来的,然而nginx并不知道所请求的服务主机名,因此返回默认服务器证书文件。
解决方法一:
多个HTTPS虚拟主机使用同一证书文件和私钥文件,证书和私钥配置指令在http级别设定,server共享其配置

ssl_certificate     common.crt;
ssl_certificate_key common.key;

server {
    listen          443 ssl;
    server_name     www.example.com;
    ...
}

server {
    listen          443 ssl;
    server_name     www.example.org;
    ...
}

解决办法二:
更通用的办法是使用TLS Server Name Indication extension技术,即SNI。SNI允许在客户端建立SSL会话时传递请求服务器名称,这样服务器就会知道该发送哪个虚拟主机下的证书文件。该技术需要浏览器支持,一般主流浏览器都已支持

Opera 8.0;

MSIE 7.0 (but only on Windows Vista or higher);

Firefox 2.0 and other browsers using Mozilla Platform rv:1.8.1;

Safari 3.2.1 (Windows version supports SNI on Vista or higher);

and Chrome (Windows version supports SNI on Vista or higher, too)

同时确保nginx支持SNI功能:

$ nginx -V
...
TLS SNI support enabled
...

本篇文章到此结束,下篇总结nginx反向代理,fastcgi模块,感谢关注!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39437.html

相关文章

  • 前端nginx使用札记

    摘要:它是一个高性能的和反向代理服务器,同时也可以作为的代理服务器。如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用反向代理。 nginx是什么? nginx是俄罗斯人 Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的一个十分轻量级的HTTP服务器。它是一个高性能的HTTP和反向代理服务器,同时也可以作为IMAP/POP3/SMTP的代理服务器。ngi...

    tianren124 评论0 收藏0
  • nginx 常用配置记录

    摘要:如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个,该将成为头部值。没有状态码的将被视为一个状态码,这种情况下需要以或者开头。因为和不能简单的只返回状态码,还必须有重定向的,这就是指令无法返回的原因了。 HTTP模块(核心模块,也是主要用到的模块) server模块 server模块是http的子模块,它用来定义一个虚拟主机 例子: server { ...

    Youngs 评论0 收藏0
  • nginx安装配置|nginx负载均衡|nginx反向代理|gzip压缩|expires缓存

    摘要:是一款轻量级的服务器反向代理服务器及电子邮件代理服务器,并在一个协议下发行。是以反向代理的方式进行负载均衡的。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存...

    pkhope 评论0 收藏0
  • 关于如何快速调教Nginx的几点总结

    摘要:关于如何快速调教的几点总结关于的好与坏,我觉得没有必要去介绍了,在这里主要分享一下我在实际的项目部署中是如何快速的调教的。 关于如何快速调教Nginx的几点总结 关于Nginx的好与坏,我觉得没有必要去介绍了,在这里主要分享一下我在实际的项目部署中是如何快速的调教Nginx的。其中分享的源码大家可以作为模板代码,根据自身项目的实际情况,酌情使用。 这里简单的说一说我为什么要写这篇文章,...

    yacheng 评论0 收藏0
  • Nginx

    摘要:主进程不直接响应浏览器,是管理子进程使用。浏览器访问会到子进程中响应。日志需要备份,文件在被进程所打开,不能使用命令。是设置变量使用,可以达到多条件判断时做标记使用。 nginx 简介 高性能WEB服务器 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器.Nginx 是由Igor Sysoev为落实访问量第二...

    luck 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<