nginx
主要用途:静态页面服务器html,反向代理reverse proxy(缓存cache、负载均衡lb),接口API(openresty)
优点:高并发,高性能。在3w请求访问,开启10个 nginx 进程时,才会使用大约150Mb的内存
安装
nginx官网:
nginx.org,开源ngix软件网站
nginx.com,nginx plus 版的网站,是收费版
进入download后可以看到分为3大块,
Mainline version 主流版本,作为发出的测试版供大众使用
Stable version 稳定版本,是最新的稳定版本
Legacy versions 旧版本,之前的版本
这里需要下载直接点击框中的版本名就可以下载,这里下载的是源码包,我们在下载后需要自行进行源码编译
下载好后,先进行解压
简单看一下nginx的目录
conf 配置文件目录是可以在安装后直接复制到配置目录下,方便我们使用
configure 源码编译的脚本
contrib 语法检测目录,帮助在写nginx目录时检测语法问题,要使用的话在当前用户家目录下创建一个 .vim 的目录,将目录里的 vim/* 全部复制到 .vim 中就可以
html 默认发布目录,类似apache,这里面有两个默认文件50x.html 错误访问页、index.html默认发布页
man 帮助文档
src 源码目录,里面有nginx的很多模块
源码编译是,可以使用./configure --help 查看编译需要的参数,看需要添加或去除什么模块
./configure --prefix=/usr/local/nginx --with-http_ssl_module,我这里指定安装在/usr/local/nginx里,并添加了http的ssl模块可以支持https
安装过程中碰到报错失败的情况,yum安装对应需求的依赖性开发包即可解决,如下:
编译完成后,执行 make 命令
最后执行:make install ,安装程序
安装完成后,在指定的安装目录/usr/local/下就可以看到nginx
这里nginx里会有4个目录:
conf 配置文件目录
html 默认发布目录
log 日志目录
sbin 二进制文件目录
运行及配置
运行nginx,在/usr/local/nginx/sbin目录里有一个nginx脚本,直接运行这个脚本即可
运行后可以看到,开启后nginx使用的是80端口
这时我们就可以测试访问,注意关闭火墙或者添加nginx服务 ,通过ip访问
./sbin/nginx -V 可以查看当前nginx的版本,在信息最下方还有我们添加的功能,就是我们安装时手动添加的
版本更新,版本回退
当服务程序有新的版本出现时,我们会需要去更新程序,但是企业中我们的nginx服务器是不能说删除旧版本再安装新版本这样操作,第一删除再安装会导致信息丢失,第二会使服务器下线,所以我们需要在程序运行中安装新的版本并且创建新的进程替换它。
更新
这里我下载了1.18版本当作新版本更新使用
第一步 解压1.18版本
第二步 先将就的nginx 备份一份
备份的目的使防止我们再更新时出错,可以进行版本回退。
这里需要备份的就是 sbin/nginx 这个二进制文件,因为在更新时更改的也就是这个文件。
第三步 在1.18版本里进行编译
先执行:./configure --prefix=/usr/local/nginx --with-http_ssl_module
这里执行编译时需要将之前添加的功能等参数再加上,保持与先版本一致
再执行:make 预编译
不要执行make install ,这样做会覆盖我们之前安装的nginx,导致信息丢失,只有在第一次安装时才执行这个命令
编译完成后在1.18版本的源码目录里会生成一个objs的目录,这个目录会有我们需要的nginx二进制程序文件,只需要将这个文件复制到我们之前nginx的安装目录的 sbin/ 即可
第四步 拷贝新版本编译出的nginx二进制文件
这里需要注意的是,因为nginx程序是运行中的,所以复制重写是需要加参数 cp -f 强制重新,然后去查看版本就可以看到更新到新版本了
第五步 进程更新
我们更新过程序后,因为之前版本的程序一直是运行的,客户在访问时还是由旧的程序进程处理请求,我们现在需要停止旧的进程,让新的进程来接替工作
这里查看到的nginx的进程有两个 master 和 worker 。
master进程是监控worker进程正常运作的,如果worker进程出现问题,master进程就会创建新的worker进程进行工作;
worker进程是真实处理用户请求的进程。
执行命令:kill -USR2 27829 ,让就的master进行不再就收请求并创建一个新的master接替工作
然后执行命令:kill -WINCH 27829,结束旧master的子进程,这里我们先不关闭旧的mater进程,意义在于如果我们新版本运行时出现问题,还可以使用旧的1.16版本的master接替工作
回退
当我们执行上述的版本更新出现问题时,新的版本无法正常运行,我们就需要回退到之前的1.16版本。
第一步 使用之前本分的nginx.old 覆盖现在nginx二进制文件
这里我们覆盖时不需要去备份,因为新的版本出问题了我们就没有必要保留它
第二部 唤醒1.16版本的master进程
kill -HUP 27829,唤醒就的master 进程开启worker进程开始运行
第三步 停止1.18版本运行的进程
kill -WINCH 31786 ,停止1.18版本master进程的子进程
kill -USR2 31786 ,停止1.18版本master进程的使用
最后:kill -9 31786 关闭这个进程,就完成了版本的回退
nginx 日志切割
为了防止nginx的日志过大,导致超过内存无法打卡查看。
日志切割也是方便后期的查看。
nginx的日志存放在程序目录下的 logs/ ,分为acces.log访问日志 和 error.log错误日志
为了让日志的大一些,我们在测试主机上使用命令:ab -c 1 -n 100000 http://172.25.254.1/index.html ,-c 1表示一个并发,-n 100000 发出十万次请求到172.25.254.1上
如果没有ab命令使用:yum -y install httpd-tools 安装
来查看一下日志文件的大小
然后我们执行日志的切割备份:mv logs/access.log logs/date +%F -d -1day
_access.log ,这个操作我们可以在每天0点写到定时任务里自动执行,就可以把前一天的日志保存起来,第二天创建的日志又可以放在新创建的access.log文件里。 date +%F -d -1day
是一个命令执行转换表示显示前一天的时间格式为xx-xx-xxx
再执行:./sbin/nginx -s reopen,重新打开nginx文件,创建access.log文件接收新的日志,也可以写在定时任务里在切割操作之后执行
nginx 发布页面的gzip压缩
首先我们给默认发布页面写一些内容使它变大
访问页面并查看访问的大小,看到我们看到的页面是网页本来的大小没有变化
编辑配置文件:vim conf/nginx.conf
gzip on; #开启压缩
gzip_min_length 100; #设置最小压缩范围是100k,大于100k就会压缩
gzip_comp_level 2; #压缩等级为2级,一共有9个级别越高压缩率越高
gzip_types text/plain application/x-javascript text/css application/xml text/javascirpt application/x-httpd-php image/jpeg image/gif image/png; #配置各种压缩的类型
写完后执行:./sbin/nginx -t 检测语法
./sbin/nginx -s reload 重新加载
再去访问网页就可以看到经过压缩后转换出的大小
nginx 配置文件conf/nginx.conf
user nginx nginx; #设置开启nginx的用户和组都是nginx
worker_processes 1; #设置work进程的数量,一般为cpu的核数
events {
worker_connections 1024;
}
这是nginx的最大连接设置,默认是1024,可以改更大的,但是要注意,在使用nginx最为反向代理时支持的最大连接这个数字是除以2的
nginx 的部分功能测试说明
nginx的功能可以通过查阅网站:nginx.com
网站里的Documentation 文档进行查阅
简单演示怎么使用nginx限制访问并发数,访问速率
首先根据文档查看到的提示,我们先写入一个新的资源模块和目录
limit_conn_zone $binary_remote_addr zone=addr:10m; zone=addr:10表示最大链接数为10Mb大小,超过就会报错
location /download/ { #定义addr的访问目录
limit_conn addr 1; #设置访问的并发连接数为1
}
创建出这个download目录,并且给这个目录中放一个可访问到资源,然后使用网页浏览测试
测试没有问题后,首先来看访问的并发连接数的限制,
使用命令:ab -c 2 -n 10 http://172.25.254.1/download/test.jpg ,可以看到2次并发只成功了一半,只有一次并发访问成功了
限制请求速率,编辑配置文件写入配置
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #定义新的请求处理区域one 大小还是10m,并且这个区域限制速率为1个请求/s
location /download/ {
limit_conn addr 1;
limit_req zone=one burst=5; #使用速率限制的区域,并设置在请求超出后,可以允许5个排队
}
保存配置,检测语法和重新加载后进行测试;
测试结果看到平均的处理速度就在1秒左右。
限制加载速率
limit_rate 50k; #限制下载速率为50k
查看我们的访问资源是428k,一次的访问时间差不多就是8s左右
测试:ab -c 1 -n 10 http://172.25.254.1/download/test.jpg,还是访问10次,用时可以看到是80.209s
日志重定向
还是在配置文件中,打开 log_format 功能,这里可以定义日志的格式
还需要打开日志储存位置,可以重新写路径,我重写为logs/test.access.log
测试访问一次:curl 172.25.254.1/download/test.jpg,新的访问日志都存在了新定向的文件中
获取真实用户ip
在我们正常的企业中,用户的上网访问时通过网络路由出来,经过企业cdn再到 4lb 最后到 7lb nginx服务器上,而这里的每一个环节都有各自的路由ip,所以我们在企业里最后看到的可能都是4lb 上运行的ip,这对于企业并没有作用,无法进行数据分析。
所以我们需要通过配置来进行真实的用户ip获取。
同样可以通过官方网站里的官方文档查看方法,里面还有提供我们示例
在配置文件里,我们创建虚拟主机并添加参数和配置新的资源目录
server { #配置虚拟服务器
listen 80;
server_name server1.example.com; #配置服务器主机名
set_real_ip_from 172.25.254.1; #设置需要过滤的信任的ip,因为我们对可以通信的上一级ip肯定是信任的
real_ip_header X-Forwarded-For; #打开真实ip模块
real_ip_recursive on; #开启对上层通信服务器的ip信任
location / { #配置虚拟服务器的访问资源
return 200 "real ip is: $remote_addr\n"; #不配置具体资源,返回真确访问200,和真实ip
}
}
这里如果需要使用真实ip模块,在编译时需要去添加该模块,如果已经安装过软件,可以安装更新的方式重编译后复制二进制文件
编译添加完成后,再检测我们的配置语法正确,加载也成功。
测试实验,这里我们使用另一台主机做nginx反向代理,然后以现在的172.25.254.1主机作为服务器,用户通过172.25.254.2主机访问到真实的服务器172.25.254.1上,我们获取用户真实ip。
nginx的反向代理可以在文档里看配置方法:
在反向代理主机中安装nginx,在配置文件的http里写入配置,然后添加地址解析,检测语法启用nginx
http {
upstream webservers { #反向代理模块
server server1.example.com; #真实服务器组
}
server {
listen 80; #连接端口
server_name 172.25.254.4;
location / {
proxy_pass http://webservers; #被访问时自动访问真实服务器
}
}
}