Nginx

Nginx

一. 什么是Nginx

Nginx可以作为:

​ HTTP server(轻量级,高性能的web服务器)

​相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50K 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

​ Reverse proxy(反向代理服务器)

​ 最早开发Nginx目的之一也是作为邮件代理服务器

​ 理解两种协议:

            1.http协议
            2.mail协议

Nginx的优势:高性能,稳定性,丰富的特性,配置简单,资源消耗低

​ File AIO,Asynchronous,Event-driven edge trigger

Nginx的缺点:功能单一,Apache模块多功能多。由于是异步IO,如果一个线程崩溃,可能导致多个链接丢失

 

二. Nginx的编译安装

编译安装三部曲

./configure :生成一些C源码文件和Makefile文件

make : 利用生成的Makefile文件编译nginx工程,并生成目标文件和最终的二进制文件

mke install :根据configure的参数nginx部署到指定的安装目录,包括相关目录的建立和二进制文件、配置文件的复制

 

编译安装nginx

第一步:安装依赖

[root@server1 ~]# yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel -y

 

第二步:解压源码包获取源码

[root@server1 ~]# tar zxf nginx-1.14.2.tar.gz 
​
[root@server1 nginx-1.14.2]# ls
auto     CHANGES.ru  configure  html     man     src
CHANGES  conf        contrib    LICENSE  README

 

第三步:编译安装

为了避免由太多的debug日志消耗太多的空间,我们这里将debug日志屏蔽掉

[root@server1 nginx-1.14.2]# vim auto/cc/gcc

171 # debug
172 #CFLAGS="$CFLAGS -g"

 

编码

[root@server1 nginx-1.14.2]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio

参数解释:

--prefix=/usr/local/nginx

默认为ngin安装部署后的根目录,由许多目录都是基于这个目录的

--with-http_ssl_module

该模块使nginx支持SSL协议,提供HTTPs服务

--with-http_stub_status_module

该模块可以让运行中的nginx提供性能统计页面,获取相关的并发连接,请求信息

--with-threads

激活线程池

--with-file-aio

启动文件的异步I/O功能来处理磁盘文件,这里需要Linux内核支持原生的异步I/O

 

编码完成后,在原来的源码包中会多出来objs和Makefile两个目录

[root@server1 nginx-1.14.2]# ls
auto        conf       html      man     src
CHANGES     configure  LICENSE   objs
CHANGES.ru  contrib    Makefile  README
​
objs:二进制文件
Makefile:

 

[root@server1 objs]# tree
.
├── autoconf.err    
├── Makefile   用于编译nginx工程,以及安装nginx
├── nginx   二进制文件
├── nginx.8
├── ngx_auto_config.h
├── ngx_auto_headers.h
├── ngx_modules.c
├── ngx_modules.o
└── src   编译时产生的目标文件

 

编译工程和安装nginx

[root@server1 local]# make && make install

 

启动nginx

nginx和apache一样,占用80端口

[root@server1 sbin]# ./nginx 
[root@server1 sbin]# netstat -anlpt |grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      17076/nginx: master 

停止nginx

[root@server1 sbin]# ./nginx -s stop 
[root@server1 sbin]# ./nginx -s quit

 

nginx的启动参数:

1.显示版本信息

[root@server1 sbin]# ./nginx -vnginx version: nginx/1.14.2

2.显示配置编译阶段的信息

[root@server1 sbin]# ./nginx -Vnginx version: nginx/1.14.2built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013TLS SNI support enabledconfigure arguments: --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio

3.测试配置文件是否由错误

[root@server1 sbin]# ./nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

4.只显示配置文件的出错信息

[root@server1 sbin]# ./nginx -t -q

 

 

三.Nginx实现负载均衡和反向代理

所谓负载均衡,就是选择后端的方式,如何(根据后端的能力)将请求均衡的分发到后端。

Nginx配置文件的高亮显示

创建~/.vim 下/root/nginx-1.14.2/contrib/vim/* 放到 ~/.vim中

 

默认情况下的负载均衡

http {
    upstream backend {
        server 172.25.60.2:80;
        server 172.25.60.3:80;
    }
​
    server {
        listen 80;
        server_name www.example.com;
​
        location / {
            proxy_pass http://backend;
        }
    }

 

[root@server1 conf]# curl 172.25.60.1
<h1>server2</h1>
[root@server1 conf]# curl 172.25.60.1
<h1>server3</h1>
[root@server1 conf]# curl 172.25.60.1
<h1>server2</h1>
[root@server1 conf]# curl 172.25.60.1
<h1>server3</h1>

 

带权重的情况下的负载均衡

http {
    upstream backend {
        server 172.25.60.2:80 weight=3;
        server 172.25.60.3:80;
    }
​
    server {
        listen 80;
        server_name www.example.com;
​
        location / {
            proxy_pass http://backend;
        }
    }

 

[root@server1 sbin]# curl 172.25.60.1
<h1>server3</h1>
[root@server1 sbin]# curl 172.25.60.1
<h1>server2</h1>
[root@server1 sbin]# curl 172.25.60.1
<h1>server2</h1>
[root@server1 sbin]# curl 172.25.60.1
<h1>server2</h1>
[root@server1 sbin]# curl 172.25.60.1
<h1>server3</h1>

 

ip_hash实现客户端绑定

http {
    upstream backend {
        ip_hash;
        server 172.25.60.2:80 weight=3;
        server 172.25.60.3:80;
    }
​
    server {
        listen 80;
        server_name www.example.com;
​
        location / {
            proxy_pass http://backend;
        }
    }

 

[root@server1 conf]# curl 172.25.60.1
<h1>server2</h1>
[root@server1 conf]# curl 172.25.60.1
<h1>server2</h1>
[root@server1 conf]# curl 172.25.60.1
<h1>server2</h1>
[root@server1 conf]# curl 172.25.60.1
<h1>server2</h1>

 

Nginx实现健康检查

所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖于具体实现,各个实现定义不一样),不再往这个后端分发请求,并且做后续的检查,直到这个后端恢复正常。

主Nginx上
http {
    upstream backend {
        #ip_hash;
        server 172.25.60.2:80;
        server 172.25.60.3:80;
        server 172.25.60.4 backup;
    }
​
    server {
        listen 80;
        server_name www.example.com;
​
        location / {
            proxy_pass http://backend;
        }
    }
​
​
注意:
1.ip_hash和backup不能同时生效。
2.当 upstream模块中的其他server都出现问题时,才会启用backup.
3.backup 的配置不能localhost 

在backup上编辑默认发布文件,并更改配置文件的默认读取的发布文件

[root@server4 html]# cat web.html 
<h1>系统正在更新</h1>
​
        location / {
            root   html;
            index  web.html index.html index.htm;
        }

若server2和server3中只有一个宕机,则当客户端访问时不会察觉到,nginx的健康检查机制会直接让客户端访问没有宕机的服务器。当宕机的服务器恢复后,负载均衡也会随之恢复。而当两个后端服务器都宕机之后,才会启用backup的配置。

 

 

四.Nginx的平滑加载(热升级)

伴随着nginx的广泛应用,版本升级必然是越来越快的,线上业务不能停,此时nginx的升级就是运维的重要工作了。所谓平滑加载(热升级)就是在中断nginx服务的情况下更新nginx版本,只是替换二进制文件。

1.平滑升级的原理

其原理简单概括,就是:(1)在不停掉老进程的情况下,启动新进程。(2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。(3)新进程接受新请求。(4)老进程处理完所有请求,关闭所有连接后,停止。这样就很方便地实现了平滑升级。一般有两种情况下需要升级Nginx,一种是确实要升级Nginx的版本,另一种是要为Nginx添加新的模块。

多进程模式下的请求分配方式

Nginx默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接受连接(accept)。

信号的接收和处理

Nginx主进程在启动完成后会进入等待状态,负责响应各类系统消息,如SIGCHLD、SIGHUP、SIGUSR2等。

Nginx信号简介

主进程可以处理的的信号

  • TERM, INT: 立刻退出,快速关闭

  • QUIT: 等待工作进程处理完正在处理的连接结束后再退出,从容关闭

  • HUP: 重新加载配置文件,使用新的配置启动工作进程,并从容关闭旧进程。

  • USR1: 重新打开日志文件

  • USR2: 启动新的主进程,实现热升级

  • WINCH: 从容关闭worker进程

工作进程支持的信号

  • TERM, INT: 立刻退出

  • QUIT: 等待请求处理结束后再退出

  • USR1: 重新打开日志文件

2.平滑升级的配置

第一步:编译新的版本,生成新的二进制文件,并将旧的二进制文件替换成新的二进制文件

注意:只需要编译./configure make 即可,不需要make install 进行安装

[root@server1 sbin]# cp nginx nginx.old
[root@server1 nginx-1.15.8]# cd objs/
[root@server1 objs]# cp -f  nginx /usr/local/nginx/sbin/
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y

 

第二步:通知老的即进程准备升级,此时老的进程会先关闭监听端口,然后把正在处理的连接全部处理完成,但不再接收新的请求,此时新旧进程都在运行,新的进程接受新的请求并处理

[root@server1 objs]# ps -ef |grep nginx
root      2139     1  0 03:45 ?        00:00:00 nginx: master process nginx
nginx     2305  2139  0 05:34 ?        00:00:00 nginx: worker process
root      5059  2255  0 08:05 pts/0    00:00:00 grep --color=auto nginx
​
[root@server1 objs]# kill -USR2 2139 
​
[root@server1 objs]# ps -ef |grep nginx
root      2139     1  0 03:45 ?        00:00:00 nginx: master process nginx
nginx     2305  2139  0 05:34 ?        00:00:00 nginx: worker process
root      5060  2139  0 08:06 ?        00:00:00 nginx: master process nginx
nginx     5061  5060  0 08:06 ?        00:00:00 nginx: worker process
root      5063  2255  0 08:06 pts/0    00:00:00 grep --color=auto nginx

 

第三步:从容关闭worker进程,此时版本已经热升级成功,旧的matser进程依旧存在,但是旧的worker进程已经被关闭了

[root@server1 objs]# kill -WINCH 2139
[root@server1 objs]# ps -ef |grep nginx
root      2139     1  0 03:45 ?        00:00:00 nginx: master process nginx
root      5060  2139  0 08:06 ?        00:00:00 nginx: master process nginx
nginx     5061  5060  0 08:06 ?        00:00:00 nginx: worker process
root      5071  2255  0 08:14 pts/0    00:00:00 grep --color=auto nginx
​
[root@server1 objs]# nginx -v 
nginx version: nginx/1.15.8

 

第四步:从容关闭master进程,关闭旧的master进程

[root@server1 objs]# kill -QUIT 2139
[root@server1 objs]# ps -ef |grep nginx
root      5060     1  0 08:06 ?        00:00:00 nginx: master process nginx
nginx     5061  5060  0 08:06 ?        00:00:00 nginx: worker process
root      5074  2255  0 08:14 pts/0    00:00:00 grep --color=auto nginx

 

若在没有关闭旧的master进程的情况下,可以将nginx版本会滚回去,因为此时即旧的服务器还没有关闭它的监听套接字。

发送HUB信号给旧的主进程,它将在不重载配置文件的情况下启动worker进程

发送QUIT信号给新的主进程,从容关闭其他工作进程

[root@server1 sbin]# kill -HUP  14083  
​
[root@server1 sbin]# ps -ef |grep nginx
root     14083     1  0 14:18 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
​
root     16659 14083  0 14:54 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody   16660 16659  0 14:54 ?        00:00:00 nginx: worker process
nobody   16674 14083  0 14:58 ?        00:00:00 nginx: worker process
root     16676  2066  0 14:58 pts/0    00:00:00 grep --color=auto nginx
​
[root@server1 sbin]# kill -USR2 16659
​
[root@server1 sbin]# kill -WINCH 16659
[root@server1 sbin]# ps -ef |grep nginx
root     14083     1  0 14:18 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     16659 14083  0 14:54 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody   16674 14083  0 14:58 ?        00:00:00 nginx: worker process
root     16678  2066  0 14:58 pts/0    00:00:00 grep --color=auto nginx

 

五.Nginx配置文件

nginx配置文件分为四大模块:

  • 全局变量模块

  • event事件模块

  • http模块

  • mail邮件模块

nginx配置文件主要分为六个区域:

  • main(全局设置)

  • events(nginx工作模式)

  • http(http设置)

  • sever(主机设置)

  • location(URL匹配)

  • upstream(负载均衡服务器设置)

1.main(全局设置)

user  nobody;                            
worker_processes  1;                     
error_log  logs/error.log;              
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
 
pid        logs/nginx.pid;

 

user:来指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行,这里我们可以新建nginx用户和组来运行子进程

useradd -s /sbin/nologin nginx                ##为了安全,让nginx用户禁止登陆系统

 

worker_processes:启动的worker进程的数量,可以设置为auto,如果负载以cpu密集型应用为主,如SSL或压缩应用,则worker数与cpu数相同;如果负载以IO密集型为主,如响应大量数据给客户端,则worker数应为cpu个数的1.5到2倍,下面指令查看cpu信息

如果worker进程数量远远多余cpu核数,会带来大量的进程切换,从而带来大量不必要的资源消耗

 

[root@server1 conf]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 44
Model name:            Westmere E56xx/L56xx/X56xx (Nehalem-C)
Stepping:              1
CPU MHz:               2394.458
BogoMIPS:              4788.91
Hypervisor vendor:     KVM
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0
​

 

error_log:用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。

如果日志级别设置到debug,则要加载模块--with_debug

[root@server1 nginx]# cd logs/
[root@server1 logs]# ls
2019-06-16_access.log  access.log  error.log  nginx.pid

nginx日志回滚

日志太大会战用很多的磁盘空间,因此需要按时的进行日志的打包,回滚。

[root@server1 logs]# mv access.log  `date +%F -d -1day`_access.log
[root@server1 logs]# ls
2019-06-16_access.log  error.log  nginx.pid
​
[root@server1 logs]# nginx -s reopen
[root@server1 logs]# ls
2019-06-16_access.log  access.log  error.log  nginx.pid

date命令参数解释:

%F 显示完整日期,同%Y-%m-%d

-d, –date=STRING 显示STRING指定的时间

 

2.event模块(nginx工作模式)

events {
    use epoll; 
    worker_connections  1024;
}

use:用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,对于Linux系统,epoll工作模式是首选。

worker_connections:用于定义Nginx每个worker进程能够支持的最大连接数,即接收客户端的最大请求数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即Max_clients=worker_processes*worker_connections,在作为反向代理时,Max_clients变为:Max_clients = worker_processes * worker_connections/4。 进程的最大连接数受Linux系统进程的最大打开文件数限制,设置改完不会立即生效,需要输入下面的指令

 

ulimit -n 65536

 

3.http模块

1)主模块

​ include mime.types;​ default_type application/octet-stream;

#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  logs/access.log  main;

​ sendfile on;

#tcp_nopush     on;
#keepalive_timeout  0;

​ keepalive_timeout 65;

 

include:嵌入其他的配置文件到当前的nginx.conf中,它参数即可以是绝对路径也可以是相对路径。参数的值可以是一个明确的文件,也可以是含有同配符的文件,或者也可以是等多个文件。default_type:设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式,例如没有配置php,当遇到php的网页时,会默认下载php文件log_format:设置日志的格式,和记录哪些参数,这里设置为main,刚好用于access_log来纪录这种类型access_log:用来纪录每次的访问日志的文件地址,后面的main是日志的格式样式,对应于log_format的mainsendfile:用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞

tcp_nopush on; //不做推送;nagle算法,解决网络拥塞控制领域问题(如果发送端发送多次包含少量字符的包,就先发一次,其他的缓存起来,积攒起来等到一定量再发送),其额外负作用(不适合)

keepalive_timeout:设置客户端连接保持长连接的超时时间。在超过这个时间之后,服务器会关闭这个长连接,继续进行TCP三次握手建立连接

 

2)子模块server

server模块是http的子模块,它用来定一个虚拟主机

server {
        listen       80;
        server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;

server:标志定义虚拟主机开始
listen:用于指定虚拟主机的服务端口
server_name:用来指定IP地址或者域名,多个域名之间用空格分开
charset:用于设置网页的默认编码格式
access_log:用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。


 

3)子模块location

location模块是nginx中用的最多的,也是最重要的模块,负载均衡啊、反向代理、虚拟域名都与它相关,location 根据它字面意思就知道是来定位的,定位URL,解析URL,所以,它也提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理。

 location / {
            root   html;
            index  index.html index.htm;
        }

location /:表示匹配访问根目录
root:表示在这整个server虚拟主机内,全部的root web根目录,可以是相对路径(相对路径是相对于nginx的安装目录),也可以是绝对路径。
index:全局定义访问的默认首页地址。



解释(location之间存在优先级问题,如果同时被匹配到 =优先级最高 > 非支持正则表达式 > 正则表达式 > 不使用任何符号项)

  • location uri {}:表示{}中的属性,对uri当前路径以及所有自资源都生效

    location = uri {}:只对当前路径生效,不包括自路径。叫做精确匹配

    location ~ uri {}:模式匹配uri,此处可以使用正则表达式匹配,区分字符大小写

    location ~* uri {}:模式匹配uri,此处可以使用正则表达式匹配,不区分字符大小写

    location ^~ URI{}:不使用正则表达式

  • deny ip;:拒绝某个ip访问

    allow ip;:同意某个ip访问

  • auth_basic:基于用户的访问控制(默认时关闭的)

    在location里面添加如下代码:

    auth_basic "Restricted Area"

    auth_basic_user_file /etc/nginx/.users 这里.users存放允许登陆的用户和密码,是基于htpasswd生成的一个文件

    htpasswd -c(文件不存在时使用-c参数) -m /etc/nginx/.user jerry //如何添加用户,借助httpd的模块

 

 

include可包含的项

  include    conf/mime.types;
  include    /etc/nginx/proxy.conf;
  include    /etc/nginx/fastcgi.conf;


proxy.conf

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;


gzip压缩选项

  gzip on;#开启gzip压缩
  gzip_min_length  1100; #Content-Length大于此长度才会被压缩
  gzip_buffers     4 8k; #compress buffer
  gzip_types       text/plain;#添加额外压缩类型,默认已包括text/html


其他选项

    access_log  logs/access.log  main;
    #日志格式 main为日志格式名称,

    sendfile        on;			#sendfile模式,效率更高,直接通过kernel,而不经过用户空间
    #tcp_nopush     on;
    client_header_timeout  3m;	#指定多长时间等待客户端发送一个请求头
    client_body_timeout    3m;	#从客户端读取body超时时间
    send_timeout           3m;	#指定为客户端响应超时时间
    client_header_buffer_size    1k;	#客户端headerbuffer大小
    large_client_header_buffers  4 4k;	#最大headerbuffer大小
    output_buffers   1 32k;				#输出缓冲区大小
    postpone_output  1460;
    tcp_nodelay      on;
    #send_lowat       12000;
    keepalive_timeout  70 30;#指定的超时时间,与客户保持连接。服务器将在此时间后关闭连接。
    charset utf-8;			 #指定使用字符集


静态页面location定义

location ~ ^/(images|javascript|js|css|flash|media|static)/  {
      root    /nginx/static/;
      expires 30d;		#静态页面可以设置一个长一点的过期时间
    }


简单的负载均衡

http {
  upstream myproject {
    server 172.25.254.1:80 weight=3;
    server 172.25.254.2:80;
    server 172.25.254.3:80;
    server 127.0.0.1:80 backup;
  }

  server {
    listen 80;
    server_name www.domain.com;
    location / {
      proxy_pass http://myproject;
    }
  }
}


简单的缓存机制

http {
    proxy_cache_path  /nginx/cache  levels=1:2    keys_zone=STATIC:10m
    inactive=24h  max_size=1g;
    server {
        location / {
            proxy_pass             http://172.25.254.11:80;
            proxy_set_header       Host $host;
            proxy_buffering        on;
            proxy_cache            STATIC;
            proxy_cache_valid      200 304 1d;
            proxy_cache_use_stale  error timeout invalid_header updating
                                   http_500 http_502 http_503 http_504;
        }
    }
}


简单认证

location / {
            root   /nginx;
            auth_basic "input passwd...";
            auth_basic_user_file "/etc/nginx/.passwd";	#该文件需要通过htpasswd生成
            index  index.html index.htm;
        }


状态监控模块

location /status {
            stub_status on;
        }


还有黑白名单,使用deny、allow即可;autoindex可以设置默认访问页面不存在时,是否可以预览目录结构。

 

nginx配置文件中的location

location /html {
       root path;
}

location后面跟的uri正则匹配的/=path


 

~:区分大小写
~*:不区分大小写
空(/):匹配所有
=:精确匹配,停止搜索其他location
^~:匹配时,停止搜索其他location


匹配优先级:

=:精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
^~:则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
空:最后匹配


 

遇到的问题

nginx服务管理常用命令

nginx -t 检查语法

nginx -s reload 平滑(热备)加载配置文件

nginx 启动nginx服务

  1. [root@fsx sbin]# nginx -s reloadnginx: [alert] kill(13451, 1) failed (3: No such process)

    其实这个问题很低级的说,就是之前压根就没有启动nginx服务,执行nginx,开启nginx服务后,重新加载nginx配置,一切正常!

  2. 如下是表示,当URI输入为.../html/时,服务器本地是去/var/www/html/下提供服务的,即:

    将URI的/html映射到/var/www/html,这里html默认存在,不用显式表达

    location /html/ {
            root   /var/www/;
            index  index.html index.htm;
        }
    
    
    

 

六.Ningx相关配置

1.控制客户端的并发量

Nginx官方版本限制IP的连接和并发分别有两个模块:

  • limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket”

  • limit_req_conn 用来限制同一时间连接数,即并发限制

 

什么是漏桶算法?

我们假设系统是一个漏桶,当请求到达时,就是往漏桶里“加水”,而当请求被处理掉,就是水从漏桶的底部漏出。水漏出的速度是固定的,当“加水”太快,桶就会溢出,也就是“拒绝请求”。从而使得桶里的水的体积不可能超出桶的容量。主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。

 

2.对图片进行共享

(1) 对图片大小进行处理

 54         location /download/ {
 55             image_filter resize 100 200;
 56         }


 

       location /download/ {
            image_filter resize 300 500;
        }


 

(2) 使用户能够自主选择要下载哪个文件

(3)设置图片的到期报错期限

        location ~ .*\.(jpg|png|css|js) {
            expires 30d;
        }


 

七.实现htts加密

第一步:重新编译nginx,增加动态模块 --with-http_ssl_module,并将新生成的二进制文件替换旧的,再次将图像模块放到/usr/local/nginx/modules下

[root@server4 nginx-1.14.2]# yum install -y openssl-devel
[root@server4 nginx-1.14.2]# ./configure  --prefix=/usr/local/nginx/ --with-http_realip_module --with-http_image_filter_module=dynamic --with-http_ssl_module
[root@server4 nginx-1.14.2]# make
[root@server4 objs]# cp nginx /usr/local/nginx/sbin/
[root@server4 objs]# cp ngx_http_image_filter_module.so /usr/local/nginx/modules/


第二步:生成证书

[root@server4 objs]# cd /etc/pki/tls/certs/
[root@server4 certs]# make cert.pem
[root@server4 certs]# make cert.pem
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 -set_serial 0 ; \
cat $PEM1 >  cert.pem ; \
echo ""    >> cert.pem ; \
cat $PEM2 >> cert.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
..................................................................................................................................................................+++
.......................................+++
writing new private key to '/tmp/openssl.tsDtas'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:shanxi 
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xian
Organization Name (eg, company) [Default Company Ltd]:westos
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:server4
Email Address []:www.example.com


第三步:将证书放到/usr/local/nginx/conf目录下

[root@server4 certs]# cp cert.pem /usr/local/nginx/conf/


第四步:测试一下http是否你能够正常访问,然后编辑配置文件实现http-->https转换

123     server {
124       listen       443 ssl;
125         server_name  localhost;
126 
127         certificate      cert.pem;   //证书
128         ssl_certificate_key  cert.pem;  //密钥
129 
130         ssl_session_cache    shared:SSL:1m;
131         ssl_session_timeout  5m;
132 
133         ssl_ciphers  HIGH:!aNULL:!MD5;
134         ssl_prefer_server_ciphers  on;
135 
136         location / {
137             root   /web;
138             index  index.html index.htm;
139         }
140     }


测试:在浏览器访问www.westos.org

 

八.rewrite重定向

1.将www.westos.org临时重定向到https://www.westos.org

142     server {
143         listen 80;
144         server_name www.westos.com;
145         rewrite ^/(.*)$ https://www.westos.org/$1;
146 
147 #       location / {
148 #         root /web;
149 #         index index.html;
150 #       }       
151     }


 

2.将www.westos.org永久重定向到https://www.westos.org

3.将www.westos.org/bbs的请求重定向到bbs.westos.org

142     server {
143         listen 80;
144         server_name www.westos.com;
145         #rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
146         rewrite ^/bbs$ http://bbs.westos.org/$1 permanent;
147 
148         location / {
149           root /web;
150           index index.html;
151         }
152     }
153 
154     server {
155         listen 80;
156         server_name bbs.westos.org;
157 
158         location / {
159             root /bbs;
160             index index.html;
161         }


 

4.将www.westos.org/bbs/index.html 重定向到bbs.westos.org

 server{
        listen 80;
        server_name www.westos.com;
        #rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
        rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;

        location / {
          root /web;
          index index.html;
        }
    }

    server {
        listen 80;
        server_name bbs.westos.org;

        location / {
            root /bbs;
            index index.html;
        }
    }


 

九.防盗链

如何实现盗取别的服务器上的图片

第一步:编辑配置文件,当访问daolian.westso.org时,会重定向到www.westos.org这个服务器上访问

    server {
        listen 80;
        server_name daolian.westos.org;
        charset utf-8;

        location / {
            root /web;
            index index.html;
        }
    }



第二步:编写/web下的html文件

[root@server2 web]# cat index.html 
<html

<body>
<br>盗链图片<br>
<img src="http://www.westos.org/vim.jpg">
</body>

><html>


访问www.westos.org

 

访问daolian.westos.org

 

如何防盗链呢??

142     server {
143         listen 80;
144         server_name www.westos.org;
145 
146         location / {
147            index index.html;
148         }
149 
150         location ~* \.(gif|jpg|png|jepg)$ {
151            root /web;
152            valid_referers none blocked www.westos.org;
153            #if ($invalid_referer) {
154            #    rewrite ^/ http://bbs.westos.org/daolian.jpg;
155            #}
156         }
157     }
159    server {
160         listen 80;
161         server_name bbs.westos.org;
162 
163         location / {
164             root /bbs;
165             index index.html;
166         }
167     }


142     server {
143         listen 80;
144         server_name www.westos.org;
145 
146         location / {
147            index index.html;
148         }
149 
150         location ~* \.(gif|jpg|png|jepg)$ {
151            root /web;
152            valid_referers none blocked www.westos.org;
153            #if ($invalid_referer) {
154            #    rewrite ^/ http://bbs.westos.org/daolian.jpg;
155            #}
156         }
157     }
159    server {
160         listen 80;
161         server_name bbs.westos.org;
162 
163         location / {
164             root /bbs;
165             index index.html;
166         }
167     }


这样当有外来者访问我们的服务器上的资源时,访问到的便是虚假的警告图片。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值