nginx简介
nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。
nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。
第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
nginx的特性
nginx的特性
nginx是一个很牛的高性能Web和反向代理服务器,它具有很多非常优越的特性:
在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应
使用epoll and kqueue作为开发模型
nginx作为负载均衡服务器:nginx既可在内部直接支持和PHP程序对外进行服务,也可支持作为HTTP代理服务器对外进行服务
nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多
Nginx Web 服务特性
支持基于名字、端口及IP的多虚拟主机站点。
支持 Keep-alive 和 pipelined 连接。
可进行简单、方便、灵活的配置和管理。
支持修改 Nginx 配置,并且在代码上线时,可平滑重启,不中断业务访问。
可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过 rsyslog 处理日志。
可利用信号控制 Nginx 进程。
支持 3xx-5xx HTTP状态码重定向。
支持 rewrite 模块,支持 URI 重写及正则表达式匹配。
支持基于客户端 IP 地址和 HTTP 基本认证的访问控制。
支持 PUT、DELETE、MKCOL、COPY 及 MOVE 等特殊的 HTTP 请求方法。
支持 FLV 流和 MP4 流技术产品应用。
支持 HTTP 响应速率限制。
支持同一 IP 地址的并发连接或请求数限制。
支持邮件服务代理。
nginx的优点
高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
配置文件非常简单:风格跟程序一样通俗易懂
成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
稳定性高:用于反向代理,宕机的概率微乎其微
模块化设计:模块可以动态编译
外围支持好:文档全,二次开发和模块较多
支持热部署:可以不停机重载配置文件
支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化
nginx的缺点
动态处理能力差:Nginx善于处理静态文件,但是处理动态页面的能力相较于Apache之类的重量级web软件能力稍差。
rewrite弱:虽然nginx支持rewrite功能多,但是相较于Apache之类的重量级的web软件能力稍差。
nginx的功能及应用类别
nginx的基本功能
静态资源的web服务器,能缓存打开的文件描述符
http、smtp、pop3协议的反向代理服务器
缓存加速、负载均衡
支持FastCGI(fpm,LNMP),uWSGI(Python)等
模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
支持SSL
nginx的扩展功能
基于名称和IP的虚拟主机
支持keepalive
支持平滑升级
定制访问日志、支持使用日志缓冲区提高日志存储性能
支持URL重写
支持路径别名
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制
nginx的应用类别
使用nginx结合FastCGI运行PHP、JSP、Perl等程序
使用nginx作反向代理、负载均衡、规则过滤
使用nginx运行静态HTML网页、图片
nginx与其他新技术的结合应用
nginx的模块
nginx由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作
nginx的模块分类
nginx的模块从结构上分为核心模块、基础模块和第三方模块
HTTP模块、EVENT模块和MAIL模块等属于核心模块
HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块
HTTP Upstream模块、Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块
用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大
nginx模块从功能上分为三类
Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个
Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出
Proxies(代理器模块)。就是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能
nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等
nginx基本模块:所谓基本模块,指的是nginx默认的功能模块,它们提供的指令,允许你使用定义nginx基本功能的变量,在编译时不能被禁用,包括:
核心模块:基本功能和指令,如进程管理和安全。常见的核心模块指令,大部分是放置在配置文件的顶部
事件模块:在Nginx内配置网络使用的能力。常见的events(事件)模块指令,大部分是放置在配置文件的顶部
配置模块:提供包含机制
具体的指令,请参考nginx的官方链接 http://nginx.org/en/docs/ngx_core_module.html
nginx的工作原理
nginx的模块直接被编译进nginx,因此属于静态编译方式。
启动nginx后,nginx的模块被自动加载,与Apache不一样,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。
在解析配置文件时,nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。
nginx的进程架构:
启动nginx时,会启动一个Master进程,这个进程不处理任何客户端的请求,主要用来产生worker线程,一个worker线程用来处理n个request。
Nginx主要由一个master主进程和多个worker进程
master主进程主要是管理worker进程,对网络事件进行收集和分发:
接收来自外界的信号
向各worker进程发送信号
监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程
nginx用一个独立的worker进程来处理一个请求,一个worker进程可以处理多个请求:
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。
一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。采用这种方式的好处
节省锁带来的开销。对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查上时,也会方便很多
独立进程,减少风险。
采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。
在一次请求里无需进程切换
web服务器请求资源过程
1.客户端发起请求,然后与服务端建立tcp连接
2.服务器接收请求
3.进行反向代理,然后服务器处理请求
4.查看访问资源的类型(可能是本地的资源,也可能是通过NFS挂载的资源)
5.构建响应报文
6.通过网络接口返回响应报文给客户端
7.服务端将本次的操作记录到日志中
详细流程
client:输入网址–>发起http request–>等待web server响应.
server:收到client请求–>加载资源–>构建响应报文,发给client.
client发起http请求
client将键入的域名解析为server端的IP地址(DNS解析).
client与server进行TCP连接(三次握手).
client与web server数据传输.
client与web server断开TCP连接(四次挥手).
client解释HTML文档,浏览器渲染,将在屏幕上显示渲染后的图形结果
server收到client请求时
http request请求首先到达server端的公网ip上(公网ip一般配置在硬件防火墙上).
经过防火墙过滤之后,到达负载均衡层(可能涉及四层负载均衡和七层负载均衡),负载均衡将请求报文往后端Real Server调度.
经过lvs调度至后端RS上,此时后端提供web服务的一般是Nginx(Apache也可能),Nginx判断请求报文是动态资源还是静态资源(动静分离).
静态资源:由Nginx发起系统调用,请求内核从磁盘加载相应的资源文件,可能涉及存储服务器(资源的保存的服务器).
动态资源:由Nginx代理给能处理动态资源的服务器(Tomcat、PHP等),还可能涉及访问数据库服务器.
web server将请求的资源加载完成之后,构建响应报文发送给client.
nginx的安装与配置
环境:
系统centos8
主机名 | IP |
---|---|
localhost | 192.168.143.103 |
//创建系统用户nginx
[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx
//安装依赖环境
[root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
安装过程略....
[root@localhost ~]# yum -y groups mark install 'Development Tools'
//创建日志存放目录
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx
//下载nginx
[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget http://nginx.org/download/nginx-1.20.1.tar.gz
//编译安装
[root@localhost src]# ls
debug kernels nginx-1.12.1.tar.gz
[root@localhost src]# tar xf nginx-1.12.1.tar.gz
[root@localhost src]# cd nginx-1.12.1
[root@localhost nginx-1.12.1]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
[root@localhost nginx-1.12.1]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
安装过程略....
[root@localhost ~]# cat > /usr/lib/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable --now nginx
nginx安装后配置
//配置环境变量
[root@localhost ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@localhost ~]# source /etc/profile.d/nginx.sh
//服务控制方式,使用nginx命令
-t //检查配置文件语法
-v //输出nginx的版本
-c //指定配置文件的路径
-s //发送服务控制信号,可选值有{stop|quit|reopen|reload}
[root@localhost ~]# nginx -t //检查配置文件语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -v //查看nginx的版本
nginx version: nginx/1.20.1
[root@localhost ~]# nginx -V // 查看更加详细的信息
nginx version: nginx/1.20.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-3) (GCC)
built with OpenSSL 1.1.1k FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log
[root@localhost ~]# nginx -h //查看帮助
nginx version: nginx/1.20.1
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-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
-p prefix : set prefix path (default: /usr/local/nginx/)
-e filename : set error log file (default: /var/log/nginx/error.log)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
// 修改配置文件的方法
[root@localhost conf]# cp nginx.conf /opt/
[root@localhost conf]# cp mime.types /opt/
[root@localhost opt]# ls
mime.types nginx.conf
[root@localhost opt]# vim nginx.conf
#user nobody;
worker_processes 1;
[root@localhost ~]# nginx -s stop;nginx -c /opt/nginx.conf //指定配置文件的路径
root@localhost~]# ps -ef | grep nginx
root 1817 1 0 21:42 ? 00:00:00 nginx: master process nginx -c /opt/nginx.conf
nginx 1818 1817 0 21:42 ? 00:00:00 nginx: worker process
root 1821 1734 0 21:42 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 4; //修改nginx的worker进程数量,默认为1
[root@localhost ~]# nginx -s reload //发送服务控制信号,重新加载配置文件
[root@localhost ~]# ps -ef | grep nginx
root 1725 1 0 21:10 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 1769 1725 0 21:22 ? 00:00:00 nginx: worker process
nginx 1770 1725 0 21:22 ? 00:00:00 nginx: worker process
nginx 1771 1725 0 21:22 ? 00:00:00 nginx: worker process
nginx 1772 1725 0 21:22 ? 00:00:00 nginx: worker process
root 1779 1734 0 21:22 pts/0 00:00:00 grep --color=auto nginx
nginx的配置文件详解
主配置文件:安装路径/conf/nginx.conf
默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
可以在启动nginx时通过-c选项来指定要读取的配置文件
nginx常见的配置文件及其作用
配置文件 | 作用 |
---|---|
nginx.conf | nginx的基本配置文件 |
mime.types | MIME类型关联的扩展文件 |
fastcgi.conf | 与fastcgi相关的配置 |
proxy.conf | 与proxy相关的配置 |
sites.conf | 配置nginx提供的网站,包括虚拟主机 |
nginx.conf配置详解
nginx.conf的内容分为以下几段:
main配置段:全局配置段。其中main配置段中可能包含event配置段
event {}:定义event模型工作特性
http {}:定义http协议相关的配置
配置指令:要以分号结尾,语法格式如下:
derective value1 [value2 …];
支持使用变量:
内置变量:模块会提供内建变量定义
自定义变量:set var_name value
用于调试、定位问题的配置参数
daemon {on|off}; //是否以守护进程方式运行nginx,调试时应设置为off
master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
error_log 位置 级别; //配置错误日志
error_log里的位置和级别能有以下可选项:
位置 | 级别 |
---|---|
file ;stderr ;syslog:server=address[,parameter=value] ; memory:size | debug:若要使用debug级别,需要在编译nginx时使用–with-debug选项 ; info; notice ; warn ;error ;crit; alert; emerg |
正常运行必备的配置参数
user USERNAME [GROUPNAME]; //指定运行worker进程的用户和组
pid /path/to/pid_file; //指定nginx守护进程的pid文件
worker_rlimit_nofile number; //设置所有worker进程最大可以打开的文件数,默认为1024
worker_rlimit_core size; //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
#user nobody; //1虽然用户是nobody
user nginx nginx;//3可以修改用户
[root@localhost ~]# ps -ef|grep nginx
root 1525 1476 0 05:02 pts/0 00:00:00 vim nginx.conf
root 1909 1 0 07:24 ? 00:00:00 nginx: master process nginx
nginx //2但是实际用户是nginx 1910 1909 0 07:24 ? 00:00:00 nginx: worker process
root 1912 1818 0 07:25 pts/3 00:00:00 grep --color=auto nginx
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
#pid logs/nginx.pid; //1虽然有注释
pid logs/nginx.pid; //3需要启用
[root@localhost ~]# ls /usr/local/nginx/logs/
error.log nginx.pid //2但是有文件
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 10240;//自己添加功能,设置所有worker进程最大可以打开的文件数,默认为1024
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
#worker_rlimit_core size; //自己添加功能,指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认不需要添加
优化性能的配置参数
worker_processes n; //启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
worker_cpu_affinity cpumask …; //将进程绑定到某cpu中,避免频繁刷新缓存
//cpumask:使用8位二进制表示cpu核心,如:
0000 0001 //第一颗cpu核心
0000 0010 //第二颗cpu核心
0000 0100 //第三颗cpu核心
0000 1000 //第四颗cpu核心
0001 0000 //第五颗cpu核心
0010 0000 //第六颗cpu核心
0100 0000 //第七颗cpu核心
1000 0000 //第八颗cpu核心
timer_resolution interval; //计时器解析度。降低此值,可减少gettimeofday()系统调用的次数,推荐timer_resolution 100ms;
worker_priority number; //指明worker进程的nice值
实例:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
worker_cpu_affinity auto; //自己添加功能cpu核心数自动,将进程绑定到某cpu中,避免频繁刷新缓存
worker_processes 3; //自定义3个核心数
[root@localhost conf]# ps -ef|grep nginx
root 1603 1 0 07:54 ? 00:00:00 nginx: master process nginx
nginx //1 1604 1603 0 07:54 ? 00:00:00 nginx: worker process
nginx //2 1605 1603 0 07:54 ? 00:00:00 nginx: worker process
nginx //3 1606 1603 0 07:54 ? 00:00:00 nginx: worker process
root 1629 1611 0 07:55 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
worker_cpu_affinity 0001 0010 0100; //修改之前的自动,现在绑定核心数
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
worker_priority -20;//控制nice值,指明worker进程的nice值
[root@localhost ~]# ps -elf|grep nginx
1 S root 1686 1 0 80 0 - 20405 - 08:15 ? 00:00:00 nginx: master process nginx
5 S nginx 1687 1686 0 60 -20//剩余60 - 28554 do_epo 08:15 ? 00:00:00 nginx: worker process
5 S nginx 1688 1686 0 60 -20 - 28554 do_epo 08:15 ? 00:00:00 nginx: worker process
5 S nginx 1689 1686 0 60 -20 - 28554 do_epo 08:15 ? 00:00:00 nginx: worker process
0 S root 1720 1690 0 80 0 - 3087 - 08:15 pts/1 00:00:00 grep --color=auto nginx
事件相关的配置:event{}段中的配置参数
accept_mutex {off|on}; //master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求
lock_file file; //accept_mutex用到的互斥锁锁文件路径
use [epoll | rtsig | select | poll]; //指明使用的事件模型,建议让nginx自行选择
worker_connections #; //每个进程能够接受的最大连接数
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 3;
worker_connections 20480; #核心数x工作量/2 30000用户
#真正能处理的并发连接
[root@localhost ~]# dnf -y install httpd-tools
[root@localhost ~]# ab -n 30000 http://192.168.143.104/index.html
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.143.104 (be patient)
Completed 3000 requests
Completed 6000 requests
Completed 9000 requests
Completed 12000 requests
Completed 15000 requests
Completed 18000 requests
Completed 21000 requests
Completed 24000 requests
Completed 27000 requests
Completed 30000 requests
Finished 30000 requests
Server Software: nginx/1.20.1
Server Hostname: 192.168.143.104
Server Port: 80
Document Path: /index.html
Document Length: 612 bytes
Concurrency Level: 1
Time taken for tests: 13.537 seconds
Complete requests: 30000
Failed requests: 0
Total transferred: 25350000 bytes
HTML transferred: 18360000 bytes
Requests per second: 2216.07 [#/sec] (mean)
Time per request: 0.451 [ms] (mean)
Time per request: 0.451 [ms] (mean, across all concurrent requests)
Transfer rate: 1828.69 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 3
Processing: 0 0 0.4 0 7
Waiting: 0 0 0.4 0 6
Total: 0 0 0.4 0 7
Percentage of the requests served within a certain time (ms)
50% 0
66% 0
75% 0
80% 0
90% 1
95% 1
98% 2
99% 2
100% 7 (longest request)
网络连接相关的配置参数
keepalive_timeout number; //长连接的超时时长,默认为65s
keepalive_requests number; //在一个长连接上所能够允许请求的最大资源数,推荐keepalive_requests 1000;
keepalive_disable [msie6|safari|none]; //为指定类型的UserAgent(用户代理)禁用长连接,选项MS IE 6版本, Safari 浏览器,默认
tcp_nodelay on|off; //是否对长连接使用TCP_NODELAY选项,为了提升用户体验,通常设为on
client_header_timeout number; //读取http请求报文首部的超时时长
client_body_timeout number; //读取http请求报文body部分的超时时长
send_timeout number; //发送响应报文的超时时长
实例:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
#keepalive_timeout 0;
keepalive_timeout 65; //长连接超时间默认65s
fastcgi的相关配置参数
LNMP:php要启用fpm模型
配置示例如下:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; //定义反向代理lnmp,php的配置取消配置
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
常需要进行调整的参数
worker_processes
worker_connections
worker_cpu_affinity
worker_priority
nginx作为web服务器时使用的配置:http{}段的配置参数
http{…}:配置http相关,由ngx_http_core_module模块引入。nginx的HTTP配置主要包括四个区块,结构如下:
http {//协议级别
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzip on;
upstream {//负载均衡配置
…
}
server {//服务器级别,每个server类似于httpd中的一个
listen 80;
server_name localhost;
location / {//请求级别,类似于httpd中的,用于定义URL与本地文件系统的映射关系
root html;
index index.html index.htm;
}
}
}
http{}段配置指令:
server {}:定义一个虚拟主机,示例如下:
server {
listen 80;
server_name www.idfsoft.com;
root “/vhosts/web”;
}
listen:指定监听的地址和端口
listen address[:port];
listen port;
server_name NAME […]; 后面可跟多个主机,名称可使用正则表达式或通配符
实例:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 81;
server_name www.mytest.com; //自定义要新的server
location / {
root html/test;
index index.html;
}
}
[root@localhost conf]# nginx -s stop
[root@localhost conf]# nginx
[root@localhost conf]# ss -atnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:81 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html index.html
[root@localhost html]# mkdir test
[root@localhost html]# echo 'mytest' > test/index.html
[root@localhost html]#
当有多个server时,匹配顺序如下:
先做精确匹配检查
左侧通配符匹配检查,如*.idfsoft.com
右侧通配符匹配检查,如mail.*
正则表达式匹配检查,如~ ^.*.idfsoft.com$
default_server
root path; 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径
alias path; 用于location配置段,定义路径别名
index file; 默认主页面
实例:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
alias /var/www/html/; //隐藏访问真实资源位置,安全设置
index index.html index.htm;
}
[root@localhost conf]# mkdir -p /var/www/html
[root@localhost conf]# chown -R nginx.nginx /var/www/
[root@localhost conf]# echo 'hello world' > /var/www/html/index.html
[root@localhost conf]# nginx -s reload
nginx: [emerg] unexpected ";" in /usr/local/nginx/conf/nginx.conf:37
[root@localhost conf]# ll /var/www/
总用量 0
drwxr-xr-x 2 nginx nginx 24 10月 26 09:16 html
[root@localhost conf]# ll /var/www/html/
总用量 4
-rw-r--r-- 1 root root 12 10月 26 09:16 index.html
[root@localhost conf]# vim nginx.conf
[root@localhost conf]# nginx -s reload
[root@localhost conf]#
[root@localhost conf]# mv ../html/test/ /var/www/html/
[root@localhost conf]# ls /var/www/html/
index.html test
[root@localhost conf]#
error_page code […] [=code] URI | @name 根据http响应状态码来指明特用的错误页面,例如 error_page 404 /404_customed.html
[=code]:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码,例如 error_page 404 =200 /404_customed.html
log_format 定义日志格式
log_format main '$remote_addr -
r
e
m
o
t
e
u
s
e
r
[
remote_user [
remoteuser[time_local] “KaTeX parse error: Double superscript at position 32: … '̲status
b
o
d
y
b
y
t
e
s
s
e
n
t
"
body_bytes_sent "
bodybytessent"http_referer” ’
‘“
h
t
t
p
u
s
e
r
a
g
e
n
t
"
"
http_user_agent" "
httpuseragent""http_x_forwarded_for”’;
access_log logs/access.log main;
//注意:此处可用变量为nginx各模块内建变量
实例
[root@localhost]# cd /usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
[root@localhost conf]# vim nginx.conf
取消注释
error_page 404 /404.html;
[root@localhost conf]# vi ../html/404.html
<html>
<head>
<title>test page</title>
</head>
<body>
<a href="http://www.baidu.com">baidu</a>
</body>
</html>
[root@localhost conf]# vim nginx.conf
error_page 404 =200 /404.html; //改变状态码
[root@localhost conf]# vim nginx.conf
//取消注释
http {
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;
[root@localhost conf]# tail -f ../logs/access.log
[root@localhost conf]# tail -f ../logs/access.log
192.168.143.1 - - [27/Oct/2021:02:51:34 -0400] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36" "-"
对比配置文件
[root@localhost conf]# vim nginx.conf
http {
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;
详细分析
$remote_addr从哪里访问的地址 -$remote_user [$time_local]本地时间- $request请求方式get获取资源- '$status状态码 -$body_bytes_sent(主要字节发送)-"$http_referer"从哪里访问到网站的 -"$http_user_agent"用户代理浏览器-$http_x_forwarded_for——for你从哪里跳转
先介绍平滑升级
1.获取现有的程序编译的参数 -V
2.获取新版本的软件包或功能包
3.将新功能或新版本进行编译
4.备份源程序
5.替换源程序
点击Donload ZIP 下载zip包
github.com 搜echo nginx找到此页
发送到主机
[root@localhost soft]# rm -rf /usr/src/nginx-1.20.1/
[root@localhost soft]# tar xf nginx-1.20.1.tar.gz -C /usr/src/
[root@localhost soft]#
[root@localhost nginx-1.20.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=/root/echo-nginx-module-master
[root@localhost nginx-1.20.1]# make -j
[root@localhost nginx-1.20.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 6830032 10月 27 03:23 objs/nginx
-rwxr-xr-x 1 root root 6307576 10月 25 04:22 /usr/local/nginx/sbin/nginx
[root@localhost nginx-1.20.1]# cp /usr/local/nginx/sbin/nginx /opt/
[root@localhost nginx-1.20.1]# nginx -s stop;objs/nginx -c /usr/local/nginx/conf/nginx.conf
[root@localhost conf]# ls
fastcgi.conf koi-win scgi_params
fastcgi.conf.default mime.types scgi_params.default
fastcgi_params mime.types.default uwsgi_params
fastcgi_params.default nginx.conf uwsgi_params.default
koi-utf nginx.conf.default win-utf
[root@localhost conf]# vim nginx.conf
location /test {
echo "test"; //添加新的测试
}
[root@localhost ~]# cd /usr/src/
[root@localhost src]# ls
debug kernels nginx-1.20.1
[root@localhost src]# ./nginx-1.20.1/objs/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost src]# ./nginx-1.20.1/objs/nginx -s reload
[root@105 ~]# curl http://192.168.143.104/test
test
[root@localhost src]# cp nginx-1.20.1/objs/nginx /usr/local/nginx/sbin/
cp:是否覆盖'/usr/local/nginx/sbin/nginx'? yes
[root@localhost src]#
[root@localhost conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost conf]#
[root@localhost src]# ./nginx-1.20.1/objs/nginx -s stop;nginx
[root@localhost src]#
[root@localhost src]# ps -ef|grep nginx
root 5393 1 0 03:39 ? 00:00:00 nginx: master process nginx
nginx 5394 5393 0 03:39 ? 00:00:00 nginx: worker process
nginx 5395 5393 0 03:39 ? 00:00:00 nginx: worker process
nginx 5396 5393 0 03:39 ? 00:00:00 nginx: worker process
root 5400 1603 0 03:40 pts/1 00:00:00 grep --color=auto nginx
[root@localhost conf]# vim nginx.conf
location = /test {
echo "hehe"; //添加新的测试
}
[root@105 ~]# curl http://192.168.143.104/test
hehe
location区段,通过指定模式来与客户端请求的URI相匹配
//功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
//语法:location [ 修饰符 ] pattern {…}
常用修饰符说明:
修饰符 | 功能 |
---|---|
= | 精确匹配 |
~ | 正则表达式模式匹配,区分大小写 |
~* | 正则表达式模式匹配,不区分大小写 |
^~ | 前缀匹配,类似于无修饰符的行为,也是以指定模块开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式 |
@ | 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或error_page等 |
没有修饰符表示必须以指定模式开始,如:
server {
server_name www.idfsoft.com;
location /abc {
…
}
}
那么如下内容就可正确匹配:
http://www.idfsoft.com/abc
http://www.idfsoft.com/abc?p1=11&p2=22
http://www.idfsoft.com/abc/
=:表示必须与指定的模式精确匹配,如:
server {
server_name www.idfsoft.com;
location = /abc {
…
}
}
那么如下内容就可正确匹配:
http://www.idfsoft.com/abc
http://www.idfsoft.com/abc?p1=11&p2=22
如下内容则无法匹配:
http://www.idfsoft.com/abc/
http://www.idfsoft.com/abc/abcde
~:表示指定的正则表达式要区分大小写,如:
server {
server_name www.idfsoft.com;
location ~ ^/abc$ {
…
}
}
那么如下内容就可正确匹配:
http://www.idfsoft.com/abc
http://www.idfsoft.com/abc?p1=11&p2=22
如下内容则无法匹配:
http://www.idfsoft.com/abc/
http://www.idfsoft.com/ABC
http://www.idfsoft.com/abcde
~:表示指定的正则表达式不区分大小写,如:
server {
server_name www.idfsoft.com;
location ~ ^/abc$ {
…
}
}
那么如下内容就可正确匹配:
http://www.idfsoft.com/abc
http://www.idfsoft.com/abc?p1=11&p2=22
http://www.idfsoft.com/ABC
如下内容则无法匹配:
http://www.idfsoft.com/abc/
http://www.idfsoft.com/abcde
~:类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,则停止搜索其他模式
查找顺序和优先级:由高到底依次为
带有=的精确匹配优先
正则表达式按照他们在配置文件中定义的顺序
带有^~修饰符的,开头匹配
带有或修饰符的,如果正则表达式与URI匹配
没有修饰符的精确匹配
优先级次序如下:
( location = 路径 ) --> ( location ^~ 路径 ) --> ( location ~ 正则 ) --> ( location ~ 正则 ) --> ( location 路径 )
实例
[root@localhost conf]# vim nginx.conf
location = / {
echo "[ configuration A ]";
}
location / {
echo "[ configuration B ]"; //添加新的测试
}
location /documents/ {
echo "[ configuration C ]";
}
location ^~ /images/ {
echo "[ configuration D ]";
}
location ~* \.(gif|jpg|jpeg)$ {
echo "[ configuration E ]";
}
[root@105 ~]# curl http://192.168.143.104
[ configuration A ]
[root@105 ~]# curl http://192.168.143.104/index.html
[ configuration B ]
[root@105 ~]# curl http://192.168.143.104/documents/document.hml
[ configuration C ]
[root@105 ~]# curl http://192.168.143.104/images/1.gif
[ configuration D ]
[root@105 ~]# curl http://192.168.143.104/documents/1.jpg
[ configuration E ]
[root@localhost conf]# vim nginx.conf
location / {
root html;
index index.html index.htm;
}
location /abc { //添加新的测试
echo "abc";
}
[root@105 ~]# curl http://192.168.143.104/abc
abc
[root@105 ~]# curl http://192.168.143.104/abc/
abc
[root@105 ~]# curl http://192.168.143.104/abc/2\23\343\4
abc
[root@localhost conf]# vim nginx.conf
location = /abc {
echo "hehe"; //添加此行
}
[root@105 ~]# curl http://192.168.143.104/abc
hehe
[root@105 ~]# curl http://192.168.143.104/abc/9
abc
[root@105 ~]# curl http://192.168.143.104/abc/
abc
[root@105 ~]# curl http://192.168.143.104/abc\?a\=10\&b\=20
hehe
[root@localhost conf]# vim nginx.conf
location ~ ^/abc$ {
echo "区分大小写的正则"; //添加新的测试,注意删除=号的location,不然优先级跟不上
}
[root@105 ~]# curl http://192.168.143.104/abc
区分大小写的正则
[root@105 ~]# curl http://192.168.143.104/ABC
<html>
<head>
<title>test page</title>
</head>
<body>
<a href="http://www.baidu.com">baidu</a> //因为没有匹配到跳转如下
</body>
</html>
[root@105 ~]# curl http://192.168.143.104/abc\?a\=10\&b\=20
区分大小写的正则
[root@105 ~]# curl http://192.168.143.104/abcde
[root@localhost conf]# vim nginx.conf
abc
location ~* ^/abc$ {
echo "不区分大小写的正则"; //添加测试
}
[root@105 ~]# curl http://192.168.143.104/ABC
不区分大小写的正则
[root@105 ~]# curl http://192.168.143.104/ABc
不区分大小写的正则
[root@localhost conf]# vim nginx.conf
location /abc {
echo "abc";
}
location ~ ^/abc$ {
echo "区分大小写的正则"; //对比优先级
}
[root@105 ~]# curl http://192.168.143.104/abc/
abc
[root@105 ~]# curl http://192.168.143.104/abcde
abc
[root@105 ~]# curl http://192.168.143.104/abc\?a\=10\&b\=20
区分大小写的正则
[root@105 ~]#
访问控制
用于location段
allow:设定允许哪台或哪些主机访问,多个参数间用空格隔开
deny:设定禁止哪台或哪些主机访问,多个参数间用空格隔开
示例:
allow 192.168.1.1/32 172.16.0.0/16;
deny all;
实例:
[root@localhost conf]# vim nginx.conf
location / {
deny 192.168.143.1; //拒绝一个ip
root html;
index index.html; //只剩一个,好测试
}
[root@localhost ~]# curl 192.168.143.104
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test Page for the Nginx HTTP Server on Red Hat Enterprise Linux</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
/*<![CDATA[*/
body {
background-color: #fff;
color: #000;
font-size: 0.9em;
font-family: sans-serif,helvetica;
margin: 0;
padding: 0;
[root@localhost conf]# vim nginx.conf
//设置白名单
location / {
allow 192.168.143.1;
deny all;
root html;
index index.html;
}
因为我不小心误删,所以弄得,yum安装的nginx测试页面
[root@localhost ~]# curl 192.168.143.104
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@localhost conf]# vim nginx.conf
//黑名单
location / {
deny 192.168.143.1;
root html;
index index.html;
}
基于用户认证
auth_basic “欢迎信息”;
auth_basic_user_file “/path/to/user_auth_file”
user_auth_file内容格式为:
username:password
这里的密码为加密后的密码串,建议用htpasswd来创建此文件:
htpasswd -c -m /path/to/.user_auth_file USERNAME
实例
[root@localhost ~]# yum install -y httpd-tools
[root@localhost ~]# which htpasswd
/usr/bin/htpasswd
[root@localhost ~]# htpasswd -c -m /usr/local/nginx/conf/.pass admin
New password:
Re-type new password:
Adding password for user admin
[root@localhost conf]# vim nginx.conf
location /tests {
auth_basic "小鸡顿炖蘑菇";
auth_basic_user_file ".pass";
alias html/tests;
index index.html;
}
[root@localhost html]# mkdir test
[[root@localhost html]# mv index.html tests/
[root@localhost html]#
是访问/tests/
[root@105 ~]# curl -u admin:admin http://192.168.143.104/tests/index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test Page for the Nginx HTTP Server on Red Hat Enterprise Linux</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
https配置
生成私钥,生成证书签署请求并获得证书,然后在nginx.conf中配置如下内容:
server {
listen 443 ssl;
server_name www.idfsoft.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.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;
}
}
实例:
实例:
[root@localhost conf]# mkdir -p /etc/pki/CA
[root@localhost conf]# cd /etc/pki/CA
[root@localhost CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
genrsa: Can't open "private/cakey.pem" for writing, No such file or directory
[root@localhostCA]# mkdir private
[root@localhost CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
.................+++++
...+++++
e is 65537 (0x010001)
[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
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]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:runtime
Organizational Unit Name (eg, section) []:runtime
Common Name (eg, your name or your server's hostname) []:runtime.com
Email Address []:1@3.com
[root@localhost CA]# ls private/
cakey.pem
[root@localhost CA]# mkdir certs newcerts crl
[root@localhost CA]# touch index.txt && echo 01 > serial
[root@localhost conf]# vim nginx.conf
server {
listen 443 ssl;
server_name test.runtime.com;
ssl_certificate ssl/nginx.crt;
ssl_certificate_key ssl/nginx.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;
}
}
[root@localhost CA]# mkdir /usr/local/nginx/conf/ssl
[root@localhost CA]# cd /usr/local/nginx/conf/ssl
[root@localhost ssl]# (umask 077;openssl genrsa -out nginx.key 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
.............................+++++
....................................................................................+++++
e is 65537 (0x010001)
[root@localhost ssl]# openssl req -new -key nginx.key -days 365 -out nginx.csr
Ignoring -days; not generating a certificate
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]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:runtime
Organizational Unit Name (eg, section) []:runtime
Common Name (eg, your name or your server's hostname) []:runtime.com
Email Address []:1@3.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost ssl]#
[root@localhost ssl]# openssl ca -in nginx.csr -out nginx.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Oct 27 13:15:45 2021 GMT
Not After : Oct 27 13:15:45 2022 GMT
Subject:
countryName = CN
stateOrProvinceName = HB
organizationName = runtime
organizationalUnitName = runtime
commonName = runtime.com
emailAddress = 1@3.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
F8:F0:69:1B:E3:B4:71:18:B6:5D:4D:58:5E:70:5A:E4:C2:14:E5:BE
X509v3 Authority Key Identifier:
keyid:5E:F7:DD:04:16:DE:A7:4D:57:58:77:60:A8:00:6C:FB:C9:AC:9D:BB
Certificate is to be certified until Oct 27 13:15:45 2022 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@localhost ssl]# ls
nginx.crt nginx.csr nginx.key
[root@localhost ssl]# rm -rf nginx.csr
[root@localhost ssl]# ls
nginx.crt nginx.key
[root@localhost ssl]#
[root@localhost ssl]# ls
nginx.crt nginx.key
[root@localhost ssl]# nginx -s reload
[root@localhost ssl]# ss -atnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:443 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
开启状态界面
开启status:
location /status {
stub_status {on | off};
allow 172.16.0.0/16;
deny all;
}
访问状态页面的方式:http://server_ip/status
状态页面信息详解:
状态码 | 表示的意义 |
---|---|
Active connections 2 | 当前所有处于打开状态的连接数 |
accepts | 总共处理了多少个连接 |
handled | 成功创建多少握手 |
requests | 总共处理了多少个请求 |
Reading | nginx读取到客户端的Header信息数,表示正处于接收请求状态的连接数 |
Writing | nginx返回给客户端的Header信息数,表示请求已经接收完成,且正处于处理请求或发送响应的过程中的连接数 |
Waiting | 开启keep-alive的情况下,这个值等于active - (reading + writing),意思就是Nginx已处理完正在等候下一次请求指令的驻留连接 |
实例
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location /status {
stub_status on;
allow 192.168.143.0/24; //添加测试
deny all;
}
zabbix监控stub_status
环境说明
主机名 | ip | 职责 |
---|---|---|
localhost | 192.168.143.104 | nginx、zabbix_agent |
zabbix | 192.168.143.101 | zabbix_server |
已做工作
localhost 主机: 已经编译安装nginx,zabbix_agent。没有做,请下载我主页资源,zabbix-agentd,编译安装shell脚本(centos,redhat)| nginx,编译安装shell脚本(centos,redhat)
zabbix 主机:已经编译安装zabbix_server。没有做,请访问zabbix监控全程部署
[root@localhost scripts]# cat check_nginx_Reading.sh
#! /bin/bash
Reading=`curl -s http://192.168.143.104/status | awk 'NR==4{print $2}'`
echo $Reading
[root@localhost scripts]# cat check_nginx_Waiting.sh
#! /bin/bash
Waiting=`curl -s http://192.168.143.104/status | awk 'NR==4{print $6}'`
echo $Waiting
[root@localhost scripts]# cat check_nginx_requests.sh
#! /bin/bash
requests=`curl -s http://192.168.143.104/status | awk 'NR==3{print $3}'`
echo $requests
[root@localhost scripts]# cat check_nginx_Writing.sh
# /bin/bash
Writing=`curl -s http://192.168.143.104/status | awk 'NR==4{print $4}'`
echo $Writing
[root@localhost scripts]#
[root@localhost scripts]# chmod +x check_nginx_*.sh
//在最下端添加以下内容
[root@localhost scripts]#vim /usr/local/etc/zabbix_agent.conf
UnsafeUserParameters=1
UserParameter=check_nginx_requests,/scripts/check_nginx_requests.sh
UserParameter=check_nginx_Reading,/scripts/check_nginx_Reading.sh
UserParameter=check_nginx_Writing,/scripts/check_nginx_Writing.sh
UserParameter=check_nginx_Waiting,/scripts/check_nginx_Waiting.sh
//重启zabbix_agentd
[root@localhost scripts]# pkill zabbix_agentd
[root@localhost scripts]# zabbix_agentd
[root@zabbix ~]# zabbix_get -s 192.168.143.104 -k check_nginx_Reading
0
[root@zabbix ~]# zabbix_get -s 192.168.143.104 -k check_nginx_Waiting
0
[root@zabbix ~]# zabbix_get -s 192.168.143.104 -k check_nginx_Writing
1
[root@zabbix ~]# zabbix_get -s 192.168.143.104 -k check_nginx_requests
41
rewrite
语法:rewrite regex replacement flag;,如:
rewrite ^/images/(..jpg)$ /imgs/$1 break;
此处的$1用于引用(..jpg)匹配到的内容,又如:
rewrite ^/bbs/(.*)$ http://www.idfsoft.com/index.html redirect;
如上例所示,replacement可以是某个路径,也可以是某个URL
常见的flag
flag 作用
last 基本上都用这个flag,表示当前的匹配结束,继续下一个匹配,最多匹配10个到20个
一旦此rewrite规则重写完成后,就不再被后面其它的rewrite规则进行处理
而是由UserAgent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程
break 中止Rewrite,不再继续匹配
一旦此rewrite规则重写完成后,由UserAgent对新的URL重新发起请求,
且不再会被当前location内的任何rewrite规则所检查
redirect 以临时重定向的HTTP状态302返回新的URL
permanent 以永久重定向的HTTP状态301返回新的URL
rewrite模块的作用是用来执行URL重定向。这个机制有利于去掉恶意访问的url,也有利于搜索引擎优化(SEO)
nginx使用的语法源于Perl兼容正则表达式(PCRE)库,基本语法如下:
标识符 意义
^ 必须以^后的实体开头
$ 必须以$前的实体结尾
. 匹配任意字符
[] 匹配指定字符集内的任意字符
[^] 匹配任何不包括在指定字符集内的任意字符串
| 匹配 | 之前或之后的实体
() 分组,组成一组用于匹配的实体,通常会有 | 来协助
捕获子表达式,可以捕获放在()之间的任何文本,比如:
^(hello|sir)$ //字符串为“hi sir”捕获的结果:$1=hi$2=sir
//这些被捕获的数据,在后面就可以当变量一样使用了
实例:
[root@localhost ~]# mkdir -p /usr/local/nginx/html/imgs
[root@localhost ~]# ls
7083795.jpg echo-nginx-module-master
agentd echo-nginx-module-master.zip
agentd.tar.gz nginx
anaconda-ks.cfg nginx-install.tar.gz
echo-nginx-module.git
[root@localhost ~]# mv 7083795.jpg zgl.jpg
[root@localhost ~]#
[root@localhost ~]# mv zgl.jpg /usr/local/nginx/html/imgs/
[root@localhost ~]#
http://192.168.143.104/imgs/zgl.jpg
[root@localhost ~]# mv /usr/local/nginx/html/imgs/ /usr/local/nginx/html/images/
[root@localhost ~]# ls /usr/local/nginx/html/
404.html 50x.html images index.html tests
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
location /imgs {
rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;
}
last和break组合使用示例
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location /imgs {
rewrite ^/imgs/(.*\.jpg)$ /images/$1 last;
}
location /imges { //添加新的测试
rewrite ^/images/(.*\.jpg)$ http://images.baidu.com last;
}
http://192.168.143.104/imgs/zgl.jpg
前面的last替换barek
http://192.168.143.104/imgs/zgl.jpg
if
语法:if (condition) {…}
应用场景:
server段
location段
常见的condition
变量名(变量值为空串,或者以“0”开始,则为false,其它的均为true)
以变量为操作数构成的比较表达式(可使用=,!=类似的比较操作符进行测试)
正则表达式的模式匹配操作
~:区分大小写的模式匹配检查
~:不区分大小写的模式匹配检查
!和!:对上面两种测试取反
测试指定路径为文件的可能性(-f,!-f)
测试指定路径为目录的可能性(-d,!-d)
测试文件的存在性(-e,!-e)
检查文件是否有执行权限(-x,!-x)
实例
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
基于浏览器实现分离案例
if ($http_user_agent ~ Firefox) {
rewrite ^(.*)$ /firefox/$1 break;
}
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_user_agent ~ Chrome) {
rewrite ^(.*)$ /chrome/$1 break;
}
防盗链案例
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referers none blocked www.idfsoft.com;
if ($invalid_referer) {
rewrite ^/ http://www.idfsoft.com/403.html;
}
}
反向代理与负载均衡
nginx通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离以及负载均衡,从而大大提高服务器的处理能力。
nginx实现动静分离,其实就是在反向代理的时候,如果是静态资源,就直接从nginx发布的路径去读取,而不需要从后台服务器获取了。
但是要注意,这种情况下需要保证后端跟前端的程序保持一致,可以使用Rsync做服务端自动同步或者使用NFS、MFS分布式共享存储。
Http Proxy模块,功能很多,最常用的是proxy_pass和proxy_cache
如果要使用proxy_cache,需要集成第三方的ngx_cache_purge模块,用来清除指定的URL缓存。这个集成需要在安装nginx的时候去做,如:
./configure --add-module=…/ngx_cache_purge-1.0 …
nginx通过upstream模块来实现简单的负载均衡,upstream需要定义在http段内
在upstream段内,定义一个服务器列表,默认的方式是轮询,如果要确定同一个访问者发出的请求总是由同一个后端服务器来处理,可以设置ip_hash,如:
upstream idfsoft.com {
ip_hash;
server 127.0.0.1:9080 weight=5;
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:1111;
}
注意:这个方法本质还是轮询,而且由于客户端的ip可能是不断变化的,比如动态ip,代理,翻墙等,因此ip_hash并不能完全保证同一个客户端总是由同一个服务器来处理。
定义好upstream后,需要在server段内添加如下内容:
server {
location / {
proxy_pass http://idfsoft.com;
}
}