【linux】企业高性能web服务器
知识点及实验的讲解
一.Web 服务基础介绍
1.1 I/O 模型
1.1.1 I/O 模型相关概念
- 同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
- 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
- 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂 起,干不了别的事情。
- 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
1.1.2 网络 I/O 模型
二.Nginx 架构和安装
2.1 Nginx 概述
2.1.1 Nginx 介绍
- Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加 了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了 很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月始, Tengine成为一个开源项目官网: http://tengine.taobao.org/
- OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官网:http://openresty.org/cn/
2.1.2 Nginx 功能介绍
- 静态的web资源服务器html,图片,js,css,txt等静态资源
- http/https协议的反向代理
- 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
- tcp/udp协议的请求转发(反向代理)
- imap4/pop3协议的反向代理
2.2.3 基础特性
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机更新配置文件,升级版本,更换日志文件
- 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
- event-driven,aio,mmap,sendfile
2.2.4 Web 服务相关的功能
- 虚拟主机(server)
- 支持 keep-alive 和管道连接(利用一个连接做多次请求)
- 访问日志(支持基于日志缓冲提高其性能)
- url rewirte
- 路径别名
- 基于IP及用户的访问控制
- 支持速率限制及并发数限制
- 重新配置和在线升级而无须中断客户的工作进程
2.2 Nginx 架构和进程
2.2.2 Nginx 进程结构
- 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求
- 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
- 对外接口:接收外部的操作(信号)
- 对内转发:根据外部的操作的不同,通过信号管理 Worker
- 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
- 读取Nginx 配置文件并验证其有效性和正确性
- 建立、绑定和关闭socket连接
- 按照配置生成、管理和结束工作进程
- 接受外界指令,比如重启、升级及退出服务器等指令
- 不中断服务,实现平滑升级,重启服务并应用新的配置
- 开启日志文件,获取文件描述符
- 不中断服务,实现平滑升级,升级失败进行回滚处理
- 编译和处理perl脚本
- 所有 Worker 进程都是平等的
- 实际处理:网络请求,由 Worker 进程处理
- Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
- 增加上下文切换的损耗
- 接受处理客户的请求
- 将请求依次送入各个功能模块进行处理
- I/O调用,获取响应数据
- 与后端服务器通信,接收后端服务器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户的请求
- 接收主程序指令,比如重启、升级和退出等
2.2.3 Nginx 进程间通信
- worker进程之间的通信原理基本上和主进程与worker进程之间的通信是一样的,只要worker进程之间能够取得彼此的信息,建立管道即可通信,但是由于worker进程之间是完全隔离的,因此一个进程想要知道另外一个进程的状态信息,就只能通过主进程来实现。
- 为了实现worker进程之间的交互,master进程在生成worker进程之后,在worker进程表中进行遍历,将该新进程的PID以及针对该进程建立的管道句柄传递给worker进程中的其他进程,为worker进程之间的通信做准备,当worker进程1向worker进程2发送指令的时候,首先在master进程给它的其他worker进程工作信息中找到2的进程PID,然后将正确的指令写入指向进程2的管道,worker进程2捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了worker进程之间的通信。
- 另worker进程可以通过共享内存来通讯的,比如upstream中的zone,或者limit_req、limit_conn中的zone等。操作系统提供了共享内存机制
2.2.4 Nginx 启动和 HTTP 连接建立
- Nginx 启动时,Master 进程,加载配置文件
- Master 进程,初始化监听的 socket
- Master 进程,fork 出多个 Worker 进程
- Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
2.2.5 HTTP 处理过程
2.3 Nginx 模块介绍
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash
- 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
- 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
核心模块:core module
标准模块:
HTTP 模块: ngx_http_*
HTTP Core modules #默认功能
HTTP Optional modules #需编译时指定
Mail 模块: ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块
2.4 Nginx 安装
2.4.1 Nginx版本和安装方式
- Mainline version 主要开发版本,一般为奇数版本号,比如1.19
- Stable version 当前最新稳定版,一般为偶数版本,如:1.20
- Legacy versions 旧的稳定版,一般为偶数版本,如:1.18
- yum的版本比较旧
- 编译安装可以更方便自定义相关路径
- 使用源码编译可以自定义相关功能,更方便业务的上的使用
2.4.2.Nginx 编译安装
源码安装需要提前准备标准的编译器,GCC的全称是(GNU Compiler collection),其有GNU开发,并以GPL即LGPL许可,是自由的类UNIX即苹果电脑Mac OS X操作系统的标准编译器,因为GCC原本只能处理C语言,所以原名为GNU C语言编译器,后来得到快速发展,可以处理C++,Fortran,pascal,objective C,java以及Ada等其他语言,此外还需要Automake工具,以完成自动创建Makefile的工作,Nginx的一些模块需要依赖第三方库,比如: pcre(支持rewrite),zlib(支持gzip模块)和openssl(支持ssl模块)等。
2.4.2.1 编译安装 Nginx
[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx[root@Nginx nginx]# tar zxf nginx-1.24.0.tar.gz
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
[root@Nginx nginx]# cd nginx-1.24.0/
[root@Nginx nginx-1.24.0]# ls
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \
--user=nginx \ # 指定nginx运行用户
--group=nginx \ # 指定nginx运行组
--with-http_ssl_module \ # 支持https://
--with-http_v2_module \ # 支持http版本2
--with-http_realip_module \ # 支持ip透传
--with-http_stub_status_module \ # 支持状态页面
--with-http_gzip_static_module \ # 支持压缩
--with-pcre \ # 支持正则
--with-stream \ # 支持tcp反向代理
--with-stream_ssl_module \ # 支持tcp的ssl加密
--with-stream_realip_module # 支持tcp的透传ip[root@Nginx nginx-1.24.0]# make && make install
- conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀去掉即可。
- html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。
- logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比 如/var/logs/nginx里面。
- sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能
2.4.2.2 Nginx 启动文件
[root@Nginx ~]# vim /lib/systemd/system/nginx.service[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true
[Install]
WantedBy=multi-user.target[root@Nginx ~]# systemctl daemon-reload
[root@Nginx ~]# systemctl start nginx
2.6 平滑升级和回滚
2.6.1 平滑升级流程
- 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
- 向master进程发送USR2信号
- master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
- master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进程的PID存放至新生成的pid文件nginx.pid
- 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
- 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
- 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT
三 Nginx 核心配置详解
3.1 配置文件说明
- 主配置文件:nginx.conf
- 子配置文件: include conf.d/*.conf
- fastcgi, uwsgi,scgi 等协议相关的配置文件
- mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
主配置文件结构:四部分main block:主配置段,即全局配置段,对http,mail都有效#事件驱动相关的配置event {...}#http/https 协议相关配置段http {...}#默认配置文件不包括下面两个块#mail 协议相关配置段mail {...}#stream 服务器相关配置段stream {...}
3.2 全局配置
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
3.3 http 配置块
#在响应报文中将指定的文件扩展名映射至MIME对应的类型include /etc/nginx/mime.types;default_type application/octet-stream; #除mime.types中的类型外#指定其它文件的默认MIME类型,浏览器一般会提示下载types {text/html html;image/gif gif;image/jpeg jpg;}
3.4 核心配置示例
3.4.1 新建一个 PC web 站点
#定义子配置文件路径
[root@Nginx ~]# mkdir /usr/local/nginx/conf.d/
[root@centos8 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......
include /apps/nginx/conf/conf.d/*.conf; #在配置文件的最后面添加此行
#注意不要放在最前面,会导致前面的命令无法
生效
}#创建虚拟主机网站配置
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
}[root@Nginx ~]# mkdir -p /webdata/nginx/timinglee.org/lee/html
[root@Nginx ~]# echo lee.timinglee.org >
/webdata/nginx/timinglee.org/lee/html/index.html
[root@Nginx ~]# nginx -s reload
3.4.2 root 与 alias
- root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
- alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于location上下文,此指令使用较少
root #给定的路径对应于location中的/uri左侧的/alias #给定的路径对应于location中的/uri的完整路径
3.4.3 location 的详细使用
- 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
- ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,
- 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri
- uri是用户请求的字符串,即域名后面的web文件路径
- 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
= #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立
即处理请求
^~ #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
#对uri的最左边部分做匹配检查,不区分字符大小写
~ #用于标准uri前,表示包含正则表达式,并且区分大小写
~* #用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号
3.4.4 Nginx 账户认证功能
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
location /login {
root /webdata/nginx/timinglee.org/lee;
index index.html;
auth_basic "login password";
auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
}
}
3.4.5 自定义错误页面
server {
listen 80;
server_name lee.timinglee.org;
error_page 404 /40x.html
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
3.4.6 自定义错误日志
server {
listen 80;
server_name lee.timinglee.org;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
3.4.7 检测文件是否存在
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
3.4.8 长连接配置
keepalive_requests 3;keepalive_timeout 65 60;#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,第二个数字60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。Keep-Alive:timeout=60#浏览器收到的服务器返回的报文#如果设置为0表示关闭会话保持功能,将如下显示:#Connection:close 浏览器收到的服务器返回的报文
3.4.9 作为下载服务器配置
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
location /download {
autoindex on; #自动索引功能
autoindex_exact_size on; #计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位kb、mb、gb)
autoindex_localtime on; #on表示显示本机时间而非GMT(格林威治)时间,默为为off显示GMT时间
limit_rate 1024k; #限速,默认不限速 }
}
四 Nginx 高级配置
4.1 Nginx 状态页
- 基于nginx 模块 ngx_http_stub_status_module 实现,
- 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module
- 否则配置完成之后监测会是提示法错误
location /nginx_status {stub_status;auth_basic "auth login";auth_basic_user_file /apps/nginx/conf/.htpasswd;allow 192.168.0.0/16;allow 127.0.0.1;deny all;}
4.2 Nginx 压缩功能
#启用或禁用gzip压缩,默认关闭gzip on | off;#压缩比由低到高从1到9,默认为1,值越高压缩后文件越小,但是消耗cpu比较高。基本设定未4或者5gzip_comp_level 4;#禁用IE6 gzip功能,早期的IE6之前的版本不支持压缩gzip_disable "MSIE [1-6]\.";#gzip压缩的最小文件,小于设置值的文件将不会压缩gzip_min_length 1k;#启用压缩功能时,协议的最小版本,默认HTTP/1.1gzip_http_version 1.0 | 1.1;#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;gzip_buffers number size;#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错gzip_types mime-type ...;#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开gzip_vary on | off;#预压缩,即直接从磁盘找到对应文件的gz后缀的式的压缩文件返回给用户,无需消耗服务器CPU#注意: 来自于ngx_http_gzip_static_module模块gzip_static on | off;
4.3 Nginx的版本隐藏
[root@Nginx nginx-1.26.1]# vim src/core/nginx.h#define nginx_version 1026001#define NGINX_VERSION "1.0"#define NGINX_VER "HAHA/" NGINX_VERSION
4.4 Nginx 变量使用
- nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用
- 变量可以分为内置变量和自定义变量
- 内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值。
五 Nginx Rewrite 相关功能
- Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求
- 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库
- rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能
- 比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问
- 另外还可以在一定程度上提高网站的安全性。
5.1.1 if 指令
if (条件匹配) {action}
5.1.2 set 指令
server {listen 80;server_name lee.timinglee.org;root /webdata/nginx/timinglee.org/lee;location /test3{set $name lee;echo $name;}}
5.1.3 break 指令
- 用于中断当前相同作用域(location)中的其他Nginx配置
- 与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效
- 位于后面的 ngx_http_rewrite_module 模块中指令就不再执行
- Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用
server {listen 80;server_name lee.timinglee.org;root /webdata/nginx/timinglee.org/lee;location /break{default_type text/html;set $name lee;echo $name;break;set $port $server_port;echo $port;}}
5.1.4 return 指令
server {listen 80;server_name lee.timinglee.org;root /webdata/nginx/timinglee.org/lee;location /return {default_type text/html;if ( !-e $request_filename){return 301 http://www.baidu.com;#return 666 "$request_filename is not exist";}echo "$request_filename is exist";}}
5.2 rewrite 指令
5.2.1 rewrite flag 使用介绍
- 跳转型指由客户端浏览器重新对新地址进行请求
- 代理型是在WEB服务器内部实现跳转
flag 说明
redirect;#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端#由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302permanent;#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端#由客户端重新发起请求,状态码:301break;#重写完成后,停止对当前URL在当前location中后续的其它重写操作#而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用#适用于一个URL一次重写last;#重写完成后,停止对当前URI在当前location中后续的其它重写操作,#而后对新的URL启动新一轮重写检查,不建议在location中使用#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户
5.3 Nginx 防盗链
5.3.1 实现盗链
server {listen 80;server_name www.timinglee.org;root /data/web/html;index index.html;location / {valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;if ($invalid_referer){return 404;}}location /images {valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;if ($invalid_referer){rewrite ^/ http://www.timinglee.org/daolian.png permanent; #注意此图片不能和正常图片放在一个目录中}}}
六 Nginx 反向代理功能
逻辑调用关系:
访问逻辑图:
6.1 实现 http 反向代理
6.1.1 http 协议反向代理
location /web {index index.html;proxy_pass http://172.25.254.30:8080;proxy_pass http://172.25.254.40:8080/;}proxy_connect_timeout time;#配置nginx服务器与后端服务器尝试建立连接的超时时间,默认为60秒proxy_read_timeout time;#配置nginx服务器向后端服务器或服务器组发起read请求后,等待的超时时间,默认60sproxy_send_timeout time;#配置nginx项后端服务器或服务器组发起write请求后,等待的超时 时间,默认60sproxy_http_version 1.0;#用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0proxy_ignore_client_abort off;#当客户端网络中断请求时,nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启,则服务器、会忽略客户端中断并一直等着代理服务执行返回,如果设置为off,则客户端中断后Nginx也会中断客户端请求并立即记录499日志,默认为off。
6.1.1.2 实战案例: 反向代理单台 web 服务器
[root@centos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.timinglee.org;
location / {
proxy_pass http://172.25.254.30;
}
}
6.1.1.3 实战案例: 指定 location 实现反向代理
6.1.1.3.1 针对指定的 location
server {
listen 80;
server_name www.timinglee.org;
location / {
proxy_pass http://172.25.254.30;
}
location ~ /static {
proxy_pass http://172.25.254.20:8080;
}
}
6.1.1.3.2 针对特定的资源实现代理
[root@Nginx ~]# vim /apps/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
location / {
proxy_pass http://172.25.254.30;
}
location ~ \.(png|jpg|gif) {
proxy_pass http://172.25.254.20:8080;
}
}
6.1.1.4 反向代理示例: 缓存功能
proxy_cache zone_name | off; 默认off#指明调用的缓存,或关闭缓存机制;Context:http, server, location#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义proxy_cache_key string;#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;
6.1.2 http 反向代理负载均衡
6.1.2.1 http upstream配置参数
#自定义一组服务器,配置在http块内upstream name {server ...........}#示例upstream backend {server backend1.example.com weight=5;server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;server unix:/tmp/backend3;server backup1.example.com backup;}server address [parameters];#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。
6.2 实现 Nginx 四层负载均衡
如果编译安装,需要指定 --with-stream 选项才能支持ngx_stream_proxy_module模块
6.2.1 tcp负载均衡配置参数
stream { #定义stream相关的服务;
Context:main
upstream backend { #定义后端服务器
hash $remote_addr consistent; #定义调度算法
server backend1.example.com:12345 weight=5; #定义具体server
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
upstream dns { #定义后端服务器
server 10.0.0.1:53; #定义具体server
server dns.example.com:53;
}
server { #定义server
listen 12345; #监听IP:PORT
proxy_connect_timeout 1s; #连接超时时间
proxy_timeout 3s; #转发超时时间
proxy_pass backend; #转发到具体服务器组
}
server {
listen 127.0.0.1:53 udp reuseport;
proxy_timeout 20s;
proxy_pass dns;
}
server {
listen [::1]:12345;
proxy_pass unix:/tmp/stream.socket;
}
}
6.3 实现 FastCGI
- FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。
- 进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自web server的请求
- worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理。
6.3.1 FastCGI配置指令
fastcgi_pass address:port;
#转发请求到后端服务器,address为后端的fastcgi server的地址,可用位置:location, if in
location
fastcgi_index name;
#fastcgi默认的主页资源,示例:fastcgi_index index.php;
fastcgi_param parameter value [if_not_empty];
#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义
key
fastcgi_param REMOTE_ADDR $remote_addr; #客户端源IP
fastcgi_param REMOTE_PORT $remote_port; #客户端源端口
fastcgi_param SERVER_ADDR $server_addr; #请求的服务器IP地址
fastcgi_param SERVER_PORT $server_port; #请求的服务器端口
fastcgi_param SERVER_NAME $server_name; #请求的server name
Nginx默认配置示例:
location ~ \.php$ {
root /scripts;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #默认脚本路径
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; #此文件默认系统已提供,存放的相对路径为
prefix/conf
}
6.3.2 php的动态扩展模块(php的缓存模块)
6.3.3 php高速缓存
实验:
二进制源码安装
nginx安装编译软件
nginx-上传nginx包
nginx-创建用户,不创建家目录
nginx-解压包
nginx-进入包
nginx-安装时加载的模块
安装成功
编译并安装
安装目录下的文件
配置环境变量
编辑启动文件
重新加载文件和启动
平滑升级与回滚
一直ping
解压
编译
只要make
查看两个版本
备份之前的nginx,将新的nginx复制过去
检测有没有问题
杀掉主master后,备master启动,worker开始进行替换
回收旧版本
已经成功替换为新版本
版本回滚
版本回滚成功
nginx的配置说明
主配置文件
数据驱动相关的配置
http、https协议相关的配置
默认不包括该块,mail协议相关配置
默认不包括该块,stream服务器相关配置块
全局配置
nginx的高并发
未开启高并发配置时
编辑.etc.security.limits.conf文件
编辑nginx主配置文件
系统服务管理器尚未加载更新
高并发效果
MIME类型映射
编写php文件
效果后效果
新建一个PC web站点
创建一个子配置文件
主配置文件中添加
编辑子配置文件
写入默认页面
在访问主机中编写.etc.hosts文件
成功
root与alias的区别
root示例
创建dirtest目录
测试
alias示例
测试02
location的详细使用
精确匹配logo
创建目录
效果
区分大小写匹配
效果02
不区分大小写匹配
效果03
URL以什么开头匹配
开头匹配
效果04
后缀匹配
效果05
nginx的账号认证
配置文件
修改默认页面
创建日志账号密码
效果
自定义错误页面
编辑文件
写默认错误页面
当没有这个页面的时候,自动加载错误页面
自定义错误日志
日志目录
创建日志目录
清空日志
当访问错误时
当访问成功时
检测文件是否存在
配置文件
创建default.html页面
长连接配置
安装telnet
修改主配置文件
效果
作为下载服务器配置
生成下载文件
修改配置
注意有一个错误点
点击即可下载
nginx的状态页
子配置
建议并重启
效果
nginx的压缩功能
创建实验环境
文件配置
加载配置
配置页面
效果
nginx的版本隐藏
nginx的反向代理
RS1、RS2都安装httpd
RS1、RS2标识
创建静态目录,标识
安装动态页面php
RS2创建动态目录
默认php页面
反向代理
效果
动态页面,当访问以php,jsp,js结尾的页面跳转到RS2
代理动态页面效果
隐藏服务器返回的报文信息某一个字段
隐藏效果
后端服务器的某一个字段的信息透传到响应报文中
透传效果
proxy常见的参数
nginx的反向代理缓存
ab压测,在没有设置缓存前的速度
缓存配置
注意这个缓存路径要写到http字段里面
添加缓存后的效果,速度有极大的提示
nginx反向代理七层负载均衡
实现反向代理负载均衡
效果
当RS2下线
RS2下线效果
当RS1也下线
RS1、RS2都下线,则走sorry server
ip_hash和sorry server不能共存
算法
nginx反向代理四层负载均衡
反向代理四层负载需要在http块外配置
创建目录和配置文件
RS安装dns
配置named.conf文件
配置子配置文件
编写wyh.org.zone文件
dig
.usr.local.nginx.tcp.d.dns.conf
效果
mysql四层负载均衡代理
编辑文件区分id
创建数据库用户并授权
数据库配置
数据库效果
实现FastCGI
源码编译
源码编译成功
编译并安装
php目录
生成配置文件
www.conf监听端口
修改php.ini时区
生成启动文件
注释掉原本的只读挂载
重新加载
写一个默认php页面
配置文件
php加载缓存memcache
动态编译
安装
修改php.ini文件,使其支持memcache
安装memcache
允许的主机
默认发布页
默认账号密码
效果
memchche高速缓存
插件
编译
安装
修改主nginx文件
高速缓存memcache配置