Nginx-http服务的常用配置

Nginx-http服务的常用配置

安装nginx

官方已经提供了安装的rpm包,可以直接拿来配置使用,
rpm包有两种,一种是稳定版本的rpm,另外一种是主线版本的rpm,比较新,但不稳定,具体查看http://nginx.org/en/linux_packages.html#stable。我们安装使用稳定版本。
先配置yum仓库

[root@test yum.repos.d]# vim nginx.repo #新建仓库文件
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/rhel/6/x86_64/#选择适合自己的系统
gpgcheck=0
enabled=1
#仓库配置在上面的官方配置文档中有指明

[root@test yum.repos.d]# yum repolist   #查看仓库列表
仓库标识                                       仓库名称                                                                             状态
base                                           CentOS-6 - Base - mirrors.aliyun.com                                                  6,706
epel                                           Extra Packages for Enterprise Linux 6 - x86_64                                       12,511
extras                                         CentOS-6 - Extras - mirrors.aliyun.com                                                   53
nginx                                          nginx repo                                                                              104
updates                                        CentOS-6 - Updates - mirrors.aliyun.com                                               1,308
repolist: 20,682

#在正式安装前,应该先安装一些开发包,nginx有些模型需要依赖一些开发包
[root@test yum.repos.d]# yum install pcre-devel openssl-devel zlib-devel

[root@test yum.repos.d]# useradd -r -s /sbin/nologin nginx  #新建一个系统用户,并且不应该让它登陆系统

#接下来,正式通过yum安装nginx
[root@test yum.repos.d]# yum install nginx -y
....
已安装:
  nginx.x86_64 0:1.14.0-1.el6.ngx                             
  
完毕!

程序环境
配置文件的组成部分:
    主配置文件:nginx.conf
    include conf.d/*.conf   #配置片段文件夹
    fastcgi, uwsgi,scgi等协议相关的配置文件
    mime.types:支持的mime类型
主程序文件:/usr/sbin/nginx
    

配置Nginx说明

Nginx命令

常用的有几个,说明下

[root@test nginx]# nginx -h 
nginx version: nginx/1.14.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit #显示版本
  -V            : show version and configure options then exit  #显示版本号以及编译选项

  -t            : test configuration and exit   #检查配置文件
  -T            : test configuration, dump it and exit #检查配置文件,并输出配置 
  -q            : suppress non-error messages during    #静默模式,不输出任何信息
 configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload  #常用,发送信号给主进程,stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /etc/nginx/)    #设置nginx的prefix
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)  #指定配置文件,即使用指定的配置文件
  -g directives : set global directives out of configuration file    #
  
  
例如:
#查看nginx编译参数
[root@test nginx]# nginx -V
nginx version: nginx/1.14.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

#运行时,重载配置。
[root@test ~]# nginx -s reload 
当运行此命令重载配置时,Nginx首先会检查配置语法,然后载入配置,主进程fork新进程,然后发送quit信号给旧的子进程,子进程收到quit信号后,停止接受新请求,然后处理完手上的任务,然后再结束。

#运行时,优雅关闭进程
[root@test ~]# nginx -s quit

#运行时,快速关闭进程
[root@test ~]# nginx -s stop

Nginx配置格式

Nginx的配置格式如下:

#配置:
    主配置文件的配置指令:
        directive value [value2 ...];
    几个注意地方:
        (1) 指令必须以分号结尾;
        (2) 支持使用配置变量;
#Nginx配置支持使用变量,有两类。
    内建变量:由Nginx模块引入,可直接引用;
    自定义变量:由用户使用set命令定义;
        set variable_name value;
        引用变量:$variable_name
        


    }
    
    

Nginx模块

Nginx高度模块化,由一个核心模块和一系列的功能模块组成。
Nginx的模块基本分为3种,核心模块、标准模块和第三方模块。

核心模块

主要是用于提供全局应用的基本功能,例如配置Nginx的工作特性等等等,核心的功能都在此模块种配置。
官方的核心模块配置详细说明:http://nginx.org/en/docs/http/ngx_http_core_module.html

标准模块

按Nginx作用上基本上有三个功能:作为web服务器,作为负载均衡服务器,作为邮件服务器,如和WEB相关的模块:"ngx_http_module";和mail相关的功能模块有"ngx_mailmodule",和tcp代理、负载均衡相关的功能模块有"ngx_stream*_module",这些类别的模块中又分为很多类别的模块,如http类别的模块中有基本核心模块、事件类模块、缓存类模块、SSL相关模块。

第三方模块

由第三方个人或组织编写的模块。

Nginx的配置文件

Nginx的配置文件有很多,例如

[root@test ~]# ls /etc/nginx/
conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf

主配置文件结构:
    main block:主配置快,也即全局配置段;
    event {     #事件驱动相关的配置;
        ...
    }
    
    http {      #Nginx作为http服务端的配置段
        ...
    }
    
    mail {      #Nginx作为mail服务器时的配置
        ...
    }
    
    stream {    #Nginx在1.9.0开始新增的一个模块,用于实现4层协议转发,代理或负载均衡

#Nginx是分段配置的核心模块为core,对应配置文件中的Main和Events段。此外还有其他一些模块。配置文件中每一个指令必须以分号";"结束,否则语法错误。  
    

配置Nginx

Main段配置

Main用于配置正常运行必备的配置,优化性能相关的配置、用于调式及定位问题的配置和事件驱动相关的配置。

正常运行必备的配置

#1.user   Nginx的worker进程的属主
user  nginx;    #不写属组,则和用户同名的组

#2.pid  /PATH/TO/PID_FILE;
指定存储nginx主进程进程号码的文件路径;

#3.include file | mask; 
指明包含进来的其它配置文件片断。

#4.load_module file;  
指明要装载的动态模块;



性能优化相关的配置:

1、worker_processes number | auto;   
#worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;
#当设置为auto:当前主机物理CPU核心数;
#如:当前机器CPU核心数为4个,那么设置为4个,是一个不错的选择。


2、worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask]; #可以设置为自动

#绑定CPU核心。nginx通过位数识别CPU核心以及核心数,指定位数上占位符为1表示使用该核心,占位符为0表示不使用该核心
例如:
worker_processes  4;    #我的机器有4核心,所以设置为4个
worker_cpu_affinity 0001 0010 0100 1000;    #第一个worker绑定再0号CPU上,以此类推

worker_processes  2;    #我的机器有4核心,但设置2个worker
#我想把第一个worker绑定在0和1号cpu上,第二个worker绑定在2和3号CPU上则可以
worker_cpu_affinity 0011 1100 

3、worker_priority number;               #指定worker进程的nice值,设定worker进程优先级;[-20,20]

4、worker_rlimit_nofile number;
                        worker进程所能够打开的文件数量上限;

调试、定位问题

1、daemon on|off;                            #是否以守护进程方式运行Nignx;

2、master_process on|off;
                        是否以master/worker模型运行nginx;默认为on;
                        
3、error_log file [level];


事件驱动相关的配置:

events {
                        ...
                    }
                    
1、worker_connections number;                    #每个worker进程所能够打开的最大并发连接数数量;
                        
#最大并发计算:worker_processes * worker_connections
                        
2、use method;
#指明并发连接请求的处理方法;
    use epoll;
                            
3、accept_mutex on | off;                    #处理新的连接请求的方法;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程;

Http常用配置

http段是由http相关模块支持的,Nginx中没有中心主机概念,就算只有一个主机,也需要配置成虚拟主机

在安装之后,nginx.conf主配文件中有http的默认配置

http {
    include       /etc/nginx/mime.types;    #配置nginx所支持的mime文件
    default_type  application/octet-stream; #默认类型

#下面是日志格式配置,它定义了一个名为main格式的配置文件格式
    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  /var/log/nginx/access.log  main;    #调用main格式,作为日志格式

    sendfile        on; #零复制
    #tcp_nopush     on;

    keepalive_timeout  65;      #保持连接的时长

    #gzip  on;  #是否启用gzip压缩,置对文本有效

    include /etc/nginx/conf.d/*.conf;   #包含配置片段
}

配置一个虚拟主机

在http段中有配置指令include包含了/etc/nginx/conf.d/*.conf的文件,所以我们在此目录下新建一个虚拟主机配置文件。
[root@test conf.d]# vim vhost1.conf

server {
        listen 80 default;  #监听的端口,并且设置为默认主机
        server_name www.ilinux.io;  #服务器名称
        root /data/web/vhost1/;     #相当于httpd的directoryroot
}

1、listen port

在listen 指令后面可以跟上一些标签:
default_server:设定为默认虚拟主机;
ssl:限制仅能够通过ssl连接提供服务;
backlog=number:后援队列长度;
rcvbuf=size:接收缓冲区大小;
sndbuf=size:发送缓冲区大小;

2、server_name name ...;

指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;
支持通配任意长度的任意字符;server_name .magedu.com www.magedu.
支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+.magedu.com$
匹配机制:
(1) 首先是字符串精确匹配;
(2) 左侧
通配符;
(3) 右侧*通配符;
(4) 正则表达式;

例如:

server {
        listen 80 ; #我把默认主机移除到其他位置
        server_name ~^www\d.ilinux\.io$;
        root /data/web/vhost1/;
}

以www[0-9].linux.io结尾即可匹配,

我用其他主机访问www.ilinux.io:
[root@vultr ~]# curl http://ilinux.io/index.html
<title>Welcome to nginx!</title>
...
匹配中了默认主机

#以www1.ilinux.io访问,则可以匹配中指定的主机
[root@vultr ~]# curl http://www1.ilinux.io/index.html
vhost1

分割线------------------------------------

server {
        listen 80 ;
        server_name ~^www\d.ilinux\.io$;
        root /data/web/vhost1/;
        sendfile on;
        tcp_nodelay on;
        tcp_nopush on;
}

3、sendfile

是否启用sendfile功能;例如,客户请求一个资源,正常来说,内核通过磁盘I/O把磁盘数据加载到内核buffer中,然后复制到nginx的buffer中,nginx才能组建响应报文,如果开启后,内核加载到资源后就直接发送给客户,响应报文则由nginx发送,随资源数据后到。开启后能加速资源的响应速度。

4、tcp_nodelay

在长连接中,客户请求的数据可能很小,如果off的话,Nginx可能对几次请求打包在一起才发送,如果客户刚好请求的资源好小,又刚好只请求一次,那么客户会感知到这个资源不能加载,所以推荐设置为on

5、tcp_nopush

在sendfile模式下,是否启用TCP_CORK选项;
在sendfile on 下才有效果,客户请求资源的时候,内核把资源加载到内核的内存缓存区后,内核直接等待nginx把响应头部发送过来,然后打包一起发送给客户;如果选择off,则内核先把资源直接发送到客户,nginx的响应报文随后到。

定义路径相关的配置

6、root和alias;

root和alias很容易混淆,他们都是用于映射web路径,用于指明用户请求的url所对应的本地系统上的文件路径,命令可以用在(http, server, location, if in location)的容器中;

例如:
root路径
      location /images {
                root /data/web/vhost1/
        }
#如果客户请求URL为:www.ilinux.io/images/a.jpg,Nginx实际的映射路径为:/data/web/vhost1/images/a.jpg,把location的/images拆开"/"+"images",root指令所指定的路径仅仅是那个"/"

alias路径
    用上面的例子,如果把root换成alias,意思就是整个url,它的本地文件系统路径映射为alias所指定的值
        location /images {
                alias /data/web/vhost1/
        }

    #如上,如果客户请求URL为:www.ilinux.io/images/a.jpg 所映射的本地路径为:/data/web/vhost1/a.jpg

7、location

简单来讲location容器主要是匹配URL,如果URL被匹配上,则应用location容器内的配置。
在一个server中的location配置段可以有多个,ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;
匹配符号:
=:对URI做精确匹配,一般用于做文件匹配,如果用作匹配目录,不会匹配中该目录下的任何内容。
~:对URI做正则表达式匹配,区分大小写
*:对URI做正则表达式匹配,和相比,~*匹配大小写
~^:对URI的左半部分做匹配检查,不区分字符大小写
不带符号:匹配起始于此uri的所有的url;

匹配优先级顺序:
location = uri > location ^~ url > location *| > locaton uri

8、error_page

当出现对应的错误状态码时,返回指定的URI路径。
语法:error_page code ... [=[response]] uri;
例如:

我在网站根目录下新建一个网页文件,充当错误页.
[root@test vhost1]# echo "error" > error.html

[root@test conf.d]# vim vhost1.conf #编辑虚拟主机配置文件
 error_page 404 403 /error.html;
[root@test conf.d]# nginx -s reload 
 当出现404,403错误时候,返回此页面给客户端。

定义客户端请求的相关配置

9、keepalive_timeout和keepalive_requests

设定保持连接的超时时长,0表示禁止长连接;默认为75s;
语法:keepalive_timeout timeout [header_timeout];
Context: http, server

keepalive_requests
在一次长连接上所允许请求的资源的最大数量,默认为100;
语法:keepalive_requests number;
Context:http, server, location

如果在长连接中,超出keepalive_requests的指定值,则断开连接。

10、keepalive_disable

对哪种浏览器禁用长连接,默认对msie6关闭长连接。
语法:keepalive_disable none | browser ...;
Context: http, server, location

11、client_body_buffer_size

用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
语法:client_body_buffer_size size;

12、client_body_temp_path

设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
16进制的数字;
例如:

client_body_temp_path   /var/tmp/client_body  2 1 1 
1:表示用一位16进制数字表示一级子目录;0-f
2:表示用2位16进程数字表示二级子目录:00-ff
2:表示用2位16进程数字表示三级子目录:00-ff

分级存储,创建多个目录,通过哈希算法,确认放在那个文件夹上,

对客户端进行限制的相关配置

13、limit_rate

语法:limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;

14、limit_except

限制对指定的请求方法之外的其它方法的使用客户端;
语法:limit_except method ... { ... }
例如:

限制对指定的请求方法之外的其它方法的使用客户端;
limit_except GET {
    allow 192.168.1.0/24;
    deny  all;
}

文件操作优化的配置

15、aio on

是否启用aio功能,异步I/O,一般用在磁盘I/O操作上。
语法:aio on | off | threads[=pool];

16、open_file_cache、open_file_cache_valid、open_file_cache_min_uses

1、open_file_cache
语法:open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件的描述符、文件大小和最近一次的修改时间;
(2) 打开的目录结构;
(3) 没有找到的或者没有权限访问的文件的相关信息;
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理,或者配合其他指令管理缓存。
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项;

2、open_file_cache_valid
语法:open_file_cache_valid time;
缓存项有效性的检查频率;默认为60s;多久检查一次缓存

3、open_file_cache_min_uses
语法:open_file_cache_min_uses number;
在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;

4、open_file_cache_errors
语法:open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息;

ngx_http_access_module模块

该模块主要是实现基于ip访问控制的功能,它提供了allow和deny两个指令。匹配规则很简单,由上到下,匹配中了就停止。
语法:
allow address | CIDR | unix: | all;
deny address | CIDR | unix: | all;

Context:http, server, location, limit_except
例如:

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}
允许指定的网段,如果在客户的ip不能被上面的允许规则匹配,则被拒绝。

ngx_http_auth_basic_module

主要实现基于用户的访问控制,使用basic机制进行用户认证;
配置很简单:
auth_basic string | off; #提示信息
auth_basic_user_file file; #认证文件

认证文件可以手写,或者使用htpasswd生成
如:

对根目录下的amdin文件夹做访问认证。
[root@test ~]# htpasswd -c -m /etc/nginx/htpasswd one     #新建一个One账户

location /admin {
      auth_basic passwd;
      auth_basic_user_file /etc/nginx/htpasswd;
        }
[root@test conf.d]# nginx -s reload #重载配置

ngx_http_stub_status_module模块

这模块主要用于显示nginx的运行状态;
用法很简单:
例如:

location /status {
    stub_status; #增加此命令即可
    auth_basic passwd;
    auth_basic_user_file /etc/nginx/htpasswd;
    }
    
参数说明:
Active connections: 3 #活动状态的连接数;
server accepts handled requests
        213312 213312 210271 
Reading: 0 Writing: 1 Waiting: 2 

accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的总的请求数;
Reading:处于读取客户端请求报文首部的连接的连接数;
Writing:处于向客户端发送响应报文过程中的连接数;
Waiting:处于等待客户端发出请求的空闲连接数;

ngx_http_log_module模块

模块提供了三个指令:log_format、access_log和open_log_file_cache。
1、log_format
语法:log_format name string ...;
用于定义日志格式,在主配文件中已经定义了一个main格式的日志格式,string能够使用nginx核心模块及其它模块内嵌的变量;
2、access_log
语法:access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
日志可以先缓冲在buffer中,大小由buffer参数指定,并且可以压缩存放,
3、open_log_file_cache
语法:open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
对于写日志操作,需要打开日志文件,对于写入及其频繁的日志文件,可以使用该指令缓存日志文件描述符。
max=N:可以缓存的最大文件描述符,超出了就使用LRU算法清楚掉
inactive=time:非活动时长
min_user=N:如果在非活动时长内,访问的次数少于该指明指定的值,则标记为非活动项
valid=time:多久检查一次缓存是否为活动项的间隔
默认main格式说明:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
参数说明:
$remote_addr:客户端IP
    如果客户端是前端的话,此时要获取到真正客户端地址需要使用变量$http_x_forward_for,但要求前端服务器要开启x_forward_for设置。
$remote_user:客户端用户
$time_local:本地时间
$request:客户端的请求首部,如GET /index.html HTTP/1.1
$status:记录客户端请求时返回的状态码
$body_bytes_sent:报文主体长度
$http_referer:referer信息
$http_user_agent:记录客户端的浏览器信息。也可以用于探测压力测试。

ngx_http_ssl_module

SSL握手简单过程:
三次TCP握手完成以后,
1.客户端say hello,并发送一个随机数给服务端。
2.服务端say hello,并回复一个随机数给客户端。
3.服务端发送数字证书给客户端。
4.客户端使用信任的CA公钥解密数字证书得到服务端的公钥。
5.客户端使用服务端的公钥加密一个预备主密钥并发送给服务端。
6.服务端使用自己的私钥解密预备主密钥
7.双方都得到了2个随机数加一个预备主密钥。通过这3个随机数形成一个会话主密钥,即session key。至此ssl握手结束,连接的认证过程也完毕。

对于服务端,配置https,需要提供自己的证书给客户端,由于该证书存放这公钥,所以也要指定私钥来用于解密。
默认的配置文件中已经有ssl的配置实例了

#server {
#    listen       443 ssl;  #对于该端口,只用于https
#    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;
#    }
#}

实验过程:
###CA端
自建CA,我用另外一台服务器来充当CA,先自签一张数字证书。
[root@vultr CA]# cd /etc/pki/CA/
[root@vultr CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...................................................................+++
.....................................................................+++
e is 65537 (0x10001)    #新建一个私钥
[root@vultr CA]# openssl req -new -x509 -key private/ca.pem -out cacert.pem     #自签了一个证书
[root@vultr CA]# echo "001" > serial    #新建序列文件
[root@vultr CA]# touch index.txt    #新建索引文件

###Nginx端
[root@test ssl]# (umask 077 ; openssl genrsa -out nginx.key 2048)
Generating RSA private key, 2048 bit long modulus
......+++
.........................................+++
e is 65537 (0x10001)    #生成私钥

[root@test ssl]# openssl req -new -key nginx.key -out nginx.csr  #生成一个证书

复制到ca认证服务器


[root@vultr CA]# openssl ca -in /tmp/nginx.csr -out nginx.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
The organizationName field needed to be the same in the
CA certificate (boss) and the request (li-zw)   #在CA服务器上签署该证书

移动到Nginx服务器。
[root@test ssl]# ls
nginx.crt  nginx.csr  nginx.key

##接下来,配置ssl
[root@test conf.d]# vim vhost1_ssl.conf



server{
        listen 443 ssl;
        root /data/web/vhost1/;
        server_name www.ilinux.io;
        ssl on; 
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_session_cache shared:SSL:20m;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;
        ssl_session_timeout 20m; 
}


ngx_http_rewrite_module

地址重写模块,该模块功能依赖pcre,如没有可以通过yum安装。该模块提供了5个指令,break、return、set、rewrite和if,跟location工作的模式差不多,将用户请求的URI基于regex所描述的模式进行检查,而后完成替换;
break:作用是完成当前的作用集,不再执行rewrite指令
return:返回URL或状态码给客户端
set:用于定义变量
if:用于设定判断条件
rewrite:用于重写

rewrite:
语法:rewrite regex replacement [flag]
如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端;
[flag]: last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环; break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环; redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://或https://开头; permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;

例如:

我把访问www.ilinux.io/images/lena.png,在Nginx服务端上重写成www.ilinux.io/images/lena.jpg,客户端感知不到的,因为整个过程都是在nginx上实现

rewrite "^/images/(.*)\.png$" "/images/$1.jpg" last;

#把对http的所有访问重写到https
rewrite "^/(.*)" https://www.ilinux.io/$1;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,858评论 0 3
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,985评论 0 9
  • 大多数 Nginx 新手都会频繁遇到这样一个困惑,那就是当同一个location配置块使用了多个 Nginx 模块...
    SkTj阅读 7,573评论 0 12
  • 昨天躺在床上,夜深的时候听见外面的门很大响的关上,心想,有一个知心的朋友好难好难,原来我的心里觉得对于她...
    你的茗字我的訫事阅读 572评论 1 1