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服务
-
[root@fsx sbin]# nginx -s reload
nginx: [alert] kill(13451, 1) failed (3: No such process)
其实这个问题很低级的说,就是之前压根就没有启动nginx服务,执行nginx,开启nginx服务后,重新加载nginx配置,一切正常!
-
如下是表示,当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>
访问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 }
这样当有外来者访问我们的服务器上的资源时,访问到的便是虚假的警告图片。