Nginx不得不入的门
一、前置说明
Nginx的优点:速度快,高并发(单台5w的并发量),可与第三方模块扩展,可靠性强,热部署,成本低,BSD许可证(可闭源,修改的文件无需放置版权说明,衍生软件不能用nginx的名字做广告)
常用功能:静态资源部署,Rewrite地址重写,反向代理,负载均衡(轮询,加权轮询,ip_hash,url_hash,fair),web缓存
核心组成:nginx二进制可执行文件,nginx.conf,error.log,access.log
二、环境安装
要求:操作系统内核要求2.6以上(支持epoll),nginx的高并发依赖epoll
扩展:查询操作系统内核命令uname -a
停用防火墙:systemctl stop firewalld,systemctl disable firewalld
停用linux安全系统:sestatus查看状态
/etc/selinux/config文件中SELINUX=enforcing修改成SELINUX=disabled,重启虚拟机即可
安装相关软件包
GCC编译器:yum install -y gcc 查询版本:gcc --version
PCRE兼容正则表达式库:yum install -y pcre pcre-devel 查询版本:rpm -qa |grep pcre
zlib压缩算法库:yum install -y zlib zlib-devel 查询版本:rpm -qa |grep zlib
OpenSSL开源安全套接协议库:yum install -y openssl openssl-devel 查询版本:rpm -qa |grep openssl
安装方式一
简单安装:
上传软件包
解压安装包:tar -xzvf nginx-1.24.0.tar.gz
解压后进入nginx文件夹
目录说明
auto:编译相关脚本文件
CHANGES:不同版本的变更记录
CHANGES.ru:俄文版变更记录
conf:配置目录
configure:自动脚本,主要作用是检测环境和生成Makefile文件
contrib:相关说明
html:提供的html页面
LICENSE:许可证
Makefile
man:帮助文档
objs:也是通过configure脚本生成的目录
README:说明文档
src:源码
执行配置文件:./configure
编译并安装:make&make install
默认安装到/usr/local目录下
启动nginx:./usr/local/nginx/sbin/nginx
访问首页:http://192.168.237.100/
访问不了主页优先检查防火墙
注:直接访问安装主机的ip
自定义安装
./configure --help提供的参数均可以自定义,根据实际情况来设置
安装方式二
yum安装
nginx官网documentation->Installing nginx->Installation on Linux下的packages->找到对应的操作系统,比如RHEL and derivatives
根据操作进行执行即可
使用whereis nginx查询nginx的安装目录
yum安装和简单安装的区别
./nginx -v查询出来yum会为nginx自动生成配置参数configure arguments
三、使用介绍
1、目录结构分析
tree /usr/local/nginx
.
├── client_body_temp
├── conf
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf 编码转换
│ ├── koi-win 编码转换
│ ├── mime.types 文件mime类型和文件后缀之间的对应关系
│ ├── mime.types.default
│ ├── nginx.conf 核心配置文件
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf 编码转换
├── fastcgi_temp
├── html 两个静态页面
│ ├── 50x.html
│ └── index.html
├── logs 日志目录
│ ├── access.log 访问日志
│ ├── error.log 异常日志
│ └── nginx.pid nginx的pid
├── proxy_temp
├── sbin 二进制执行文件
│ └── nginx
├── scgi_temp
└── uwsgi_temp
说明:CGI指通用网关接口,主要解决的问题是从客户端发送一个请求和数据,服务端获取到请求和数据可以调用CGI程序处理相应结果给客户端的一个标准规范,例如上面的fastcgi,scgi,uwsgi等的CGI高性能实现
2、服务启停
1)信号控制
kill -TERM/-INT pid 立即关闭进程
kill -QUIT pid 不再接受新请求,内部请求执行完成后关闭进程
kill -HUP pid nginx的master进程不会停止,worker进程会关闭再打开,且会加载新的nginx配置
kill -USR1 pid 如果删除了logs目录下的日志,执行该命令可重新生成
kill -USR2 pid 平滑升级nginx(内部实现大致是拷贝正在运行中的nginx,然后手动将旧的QUIT)
kill -WINCH pid worker进程不在接收新请求,内部执行完成后关闭
2)命令行控制
/usr/local/nginx/sbin
./nginx -t测试验证nginx.conf文件配置是否正确
./nginx -s stop|quit|reopen|reload
3、服务器升级
1)信号升级
备份老的nginx文件:/usr/local/nginx/sbin/nginx 直接修改文件名
新版本需要执行配置文件并编译:./configure make
然后将新版本下的objs目录下的nginx文件拷贝到/usr/local/nginx/sbin目录下
kill -USR2 'cat /usr/local/nginx/logs/nginx.pid'
kill -QUIT 'cat /usr/local/nginx/logs/nginx.pid.oldbin'
2)make命令升级
备份老的nginx文件:/usr/local/nginx/sbin/nginx 直接修改文件名
新版本需要执行配置文件并编译:./configure make
然后将新版本下的objs目录下的nginx文件拷贝到/usr/local/nginx/sbin目录下
然后在新版本的目录下执行make upgrade
3)添加指定模块功能
备份老的nginx文件:cp /usr/local/nginx/sbin/nginx /nginx_old 或直接修改文件名
找到之前nginx包的解压目录
清理旧的编译内容:make clean
配置参数:./configure --with-ngx_http_gzip_static_module
编译:make
然后将新版本下的objs目录下的nginx文件拷贝到/usr/local/nginx/sbin目录下
然后在新版本的目录下执行make upgrade
4、nginx.conf
//全局配置
worker_processes 1;
//主要设置,nginx服务器与用户的网络连接,对nginx的性能影响较大
events {
worker_connections 1024;
}
//设置请求代理,缓存,日志和第三方模块配置,http块可有多个,server中可有多个loaction块
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
//拦截配置
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
5、配置详解
1)全局配置
a)user
指定worker进程的所属用户
语法:user username [groupname]
等同于自定义安装时使用./configure --user=username --group==groupname
b)master_process
指定是否开启工作进程
语法:master_process on|off
默认开启
c)worker_processes
指定生成worker进程的数量
语法:worker_processes num|auto
默认值为1,推荐设置与CPU内核数一致,设置重启生效
扩展:查询CPU核数cat /proc/cpuinfo或lscpu
d)error_log
设置异常日志的路径和打印级别,级别分为 debug, info, notice, warn, error, crit 默认为crit
语法:error_log path [level]
示例:error_log logs/error.log info;
e)pid
指定存放nginxmaster进程pid的文件位置
语法:pid path
默认值:pid logs/nginx.pid;
f)daemon
设置nginx是否以守护进程的方式启动
语法:daemon on|off
默认开启,设置重启生效
g)include
引入配置文件
语法:include file
2)events块
a)accept_mutex
设置nginx网络连接序列化
语法:accept_mutex on|off
默认值为on,代表多个worker时,进行排序处理,解决了惊群问题;off则表示同时唤醒多个worker去抢夺处理一个请求
b)multi_accept
设置是否允许同时接收多个网络连接
语法:multi_accept on|off
默认值为off,表示一个worker进程同时只接收一个连接请求
c)worker_connections
设置worker进程的最大连接数
语法:worker_connections num
默认值为512,该连接数不仅包括前端建立的连接,也包括其他可能连接,num不能超过操作系统支持的最大句柄数
重要 d)use
设置nginx服务器选择哪种事件驱动来处理网络消息
语法:use method
默认值根据系统设置,可选值select|poll|epoll|kqueue
等同于自定义安装时使用./configure --with-poll_module|--without-poll_module|--with-select_module|--without-select_module
3)http块
a)MIME-Type
目的:区分网络资源的媒体类型
include mime.types;//引入mime.types文件中的资源类型
default_type application/octet-stream;//定义nginx响应前端请求默认的MIME类型
语法:default_type mime-type
默认值为text/plain,为文本类型,可在http,server及location内配置
示例:对某些接口相应指定字符串或json字符串
location /test {
default_type text/html;
return 200 "This is nginx`s text";
#default_type application/json;
#return 200 '{"name":"TOM","age":"18"}';
}
b)自定义服务日志
①access_log
设置用户访问日志的相关属性
语法:access_log path [format[buffer=size]]
默认值:access_log logs/access.log combined;
位置:http,server及location
②log_format
用来指定日志的输出格式
语法:log_format name [escape=default|json|none] string...;
默认值:log_format combined "...";
位置:http
示例:
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;
注:确保使用的输出格式名是已定义的格式名称
重要 c)sendfile
设置nginx是否使用sendfile()传输文件,该属性可以极大提高nginx处理静态资源的性能
语法:sendfile on|off
默认值为off,可在http,server及location内配置
d)keepalive_timeout
用来设置长连接的超时时间
说明:避免每次请求都建立连接,是连接可重用,同时又不会长时间连接占用资源
语法:keepalive_timeout time;
默认值为75s,可在http,server及location内配置
e)keepalive_request
用来设置一个keepalive连接的使用次数
语法:keepalive_request num;
默认值为100,可在http,server及location内配置
4)server和location块
server块
listen:设置nginx监听端口
server_name:用来设置当前nginx服务提供在那个IP地址,可设置主机名,域名或IP
error_page:指定该属性后面的错误码需要跳转的页面
location块
上下文:指定对请求做响应的上下文信息
root:指代资源文件所对应的目录名
index:指定响应的首页信息
6、系统级配置
1)nginx配置成系统服务
a)在/usr/lib/systemd/system目录下添加nginx.service文件,内容如下
[Unit]
Description=nginx web service
Documentation=http://nginx.org/en/docs/
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
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=default.target
b)配置nginx.service文件权限
chmod 755/usr/lib/systemd/system/nginx.service
c)使用系统命令来操作nginx服务
启动: systemctl start nginx
停止: systemctl stop nginx
重启: systemctl restart nginx
重新加载配置文件: systemctl reload nginx
查看nginx状态: systemctl status nginx
开机启动: systemctl enable nginx
2) nginx命令配置到系统环境
a)在/etc/profile文件中添加如下内容
export PATH=$PATH:/usr/local/nginx/sbin
b)使profile文件改动生效
source /etc/profile
c)即可在任意目录下执行nginx命令
7、Nginx静态资源
1)配置指令(会使用,但非专用)
a)listen
用来配置监听端口
语法:listen address[:port][default_server]...;
listen port[default_server]...;
默认值:listen *:80|*:8000
配置位置:server
注:default_server如果没有配置该属性,则请求匹配不到server时,默认使用第一个server响应;如果配置了,当请求匹配不到时,默认使用配置了default_server的server来响应
b)server_name
用来设置虚拟主机服务名称
语法:server_name name...; 多个name中间用空格隔开
默认值:server_name "";
配置位置:server
注:使用域名或主机名需要在当前主机的/etc/hosts文件中配置对应的ip信息
匹配方式:
精准匹配:server_name www.baidu.com
通配符匹配:支持通配符*,但只能出现在域名的头或者尾,不能出现在中间
正则表达式匹配:~表示当前为一个正则表达式,获取捕获组的值(即正则中使用()括起来的信息,$1表示第一组()括起来的值)
注:server_name的匹配方式优先级为精准匹配->前通配符匹配->后通配符匹配->正则匹配->default_server
c)location
用来指定匹配的请求上下文
语法:location [=|~|~*|^~|@] uri{...}
配置位置:server,location
模式介绍:
①不带符号的上下文,如/abc,则表示上下文只要是以abc开头的均可以响应(注:该模式会匹配所有可能匹配成功的上下文,直到最后一个,响应的也是最后一个)
②使用=,此处不能使用正则表达式,则表示上下文必须精准匹配
③使用~和~*都是申明使用正则表达式,区别是前者区分大小写,后者忽略大小写
④使用^~,表示不包含正则表达式,效果同①,区别是当前模式如果匹配成功,就不会再去匹配其他模式
⑤使用@符号一般配合error_page
d)root
设置nginx服务器收到请求后查找资源的根目录路径
语法:root path
默认值:html
配置位置:http,server,location
e)alias
用来更改location的uri
语法:alias path
配置位置:location
与root的区别是,两者都是指定请求响应的目录,但是root是可以拼接location的值,而alias是直接替换location的值且若location是以/结尾,alias的路径也必须以/结尾
f)index
设置网站的默认首页
语法:index file...; 多个file名可用空格隔开
默认值:index index.html
配置位置:http,server,location
g)error_page
配置网站的错误页面
语法:error_page code...[=[response]] uri;
配置位置:http,server,location
@使用示例
error_page 404 @jump_to_error;
location @jump_to_error {
default_type text/plain;
return 404 "NOT FOUND PAGE";
}
特殊的,当需要改变响应的状态码时,可配合=[response]参数
error_page 404 =200 /50x.html; 注:404后一定要有空格
location = /50x.html {
root html;
}
重点 2)配置优化
a)sendfile
用来开启高效的文件传输模式
语法:sendfile on|off
默认值是off
配置位置:http,server,location
可以理解为原来需要通过应用程序来做资源传递的中间层,打开sendfile开关后,操作系统知道最终要传递的socket,从而从内核拷贝数据直接到指定socket
b)tcp_nopush
在sendfile为on的状态下,提升网络包的传输效率
语法:tcp_nopush on|off
默认值是off
配置位置:http,server,location
c)tcp_nodeplay
在keep-alive连接开启的情况下,提升网络包传输的实时性
语法:tcp_nodeplay on|off
默认值为on
配置位置:http,server,location
说明:linux2.5.9以后tcp_nopush和tcp_nodeplay可以相互兼容,nginx中可以实现tcp_nopush开启后每次推送的包都是填满的,只有当最后一个包出现时,nginx会忽略tcp_nopush,而实施tcp_nodeplay策略直接推送包出去
3)压缩配置指令
ngx_http_gzip_module模块
ngx_http_gzip_static_module模块
ngx_http_gunzip_module模块
a)Gzip各模块支持的配置指令
说明:以ngx_http_gzip_module模块为例,该模块以内置,可直接使用
①gzip
用于开启或关闭gzip功能
语法:gzip on|off
默认值为off
配置位置:http,server,location
说明:该配置项开启后,下面的配置才会生效
②gzip_types
可以根据响应页面的MIME类型选择性的开启gzip功能
语法:gzip_types mime_type...;
默认值:gzip_types text/html 可用*代表所有类型
配置位置:http,server,location
③gzip_comp_level
用于设置gzip压缩程度,级别从1-9,级别数字越大,压缩程度越高,但效率低也费时间
语法:gzip_comp_level level
默认值为1
配置位置:http,server,location
④gzip_vary
用于设置使用gzpi进行压缩是否携带"Vary:Accept-Encoding"头域的响应头部,主要是通知对方,数据已经过gzpi压缩处理
语法:gzip_vary on|off
默认值为off
配置位置:http,server,location
⑤gzip_buffers
用于处理请求压缩的缓冲区数量和大小
语法:gzip_buffers number size
默认值:gzip_buffers 32 4k|16 8k
配置位置:http,server,location
推荐使用默认值
⑥gzip_disable
针对不同种类的客户端发起的请求,可以选择性的开启和关闭gzip
语法:gzip_disable regex...
配置位置:http,server,location
说明:根据浏览器标志(user-agent)来设置,支持正则
⑦gzip_http_version
针对不同版本的HTTP协议,选择性提供gzip功能
语法:gzip_http_version 1.0|1.1
默认值为1.1
配置位置:http,server,location
说明:1.1表示使用gzip的HTTP最低版本,一般采用默认值
⑧gzip_min_length
针对传输数据大小,选择性使用gzip功能
语法:gzip_min_length length
默认值为20字节
配置位置:http,server,location
说明:资源大小小于设置的值则不适用gzip功能
⑨gzip_proxied
设置是否对服务端返回的结果进行gzip压缩
语法:gzip_proxied args
默认值为off
配置位置:http,server,location
说明:该指定只有在nginx作为反向代理的时候开启
参数args说明:
off – 关闭所有的代理结果数据压缩
expired – 如果header中包含”Expires”头信息,启用压缩
no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
private – 如果header中包含”Cache-Control:private”头信息,启用压缩
no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
any – 无条件压缩所有结果数据
b)Gzip压缩功能的配置
示例:
server{
gzip on;
gzip_comp_level 6;
gzip_min_length 1M;
gzip_proxied any;
gzip_types application/javascript text/css text/xml; //根据实际情况定制
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
}
c)Gzip和sendfile的冲突解决
说明sendfile指令的开启使得资源的传递越过了应用程序,而gzip的功能又需要依赖应用程序来实现,故采用如下指令,先进行资源文件的压缩,再通过sendfile传递即可解决
使用ngx_http_gzip_static_module模块的gzip_static指令来解决问题
gzip_static
语法:gzip_static on|off|always
默认值为off
配置位置:http,server,location
注:使用该指令需要手动添加功能支持,参考三.3.3)
d)浏览器不支持Gzip的解决方案
4)缓存处理
web缓存分类:客户端缓存(浏览器缓存),服务器缓存(ngxin,redis等)
缓存存在的意义:减少带宽,降低服务器压力,快速响应减少网络延迟
HTTP协议中和页面缓存相关的字段说明:
Expires:缓存过期的日期和时间
Cache-Control:设置和缓存相关的配置信息
Last-Modified:请求资源最后的修改时间
ETag:请求变量的实体标签的当前值,例如文件的MD5值
强缓存:本次请求不会发送给服务端,而是直接获取缓存数据,示例:发起一次请求后,复制本次请求的地址栏信息,再打开一个浏览器窗口,再次请求获取的即为强缓存
弱缓存:请求会发送给服务端进行参数的校验确认信息是否真的过期,如果没有过期则返回304给浏览器并从浏览器缓存中获取请求数据,示例:请求成功的请求再次发起请求
缓存相关指令
a)expires
用来控制页面缓存,设置HTTP中Expires和Cache-Control的值
语法:expires [modified]time
expires epoch|max|off
默认值为off
配置位置:http,server,location
说明:time,单位为s,可以为整数也可以是负数,指定过期时间,如果是负数,Cache-Control则为no-cache(弱缓存机制),如果为整数或0,Cache-Control则为max-age=time
epoch指定Expires的值为1970-01-01 00:00:00,Cache-Control的值为no-cache
max指定Expires的值为2037-12-31 23:59:59,Cache-Control的值为10年
b)add_header
用来添加指定的响应头和响应值
语法:add_header name value[always]
配置位置:http,server,location
Cache-Control可配置的值
no-cache:缓存服务器在进行缓存前,必须校验是否过期
no-store:不缓存
max-age=[秒]:在缓存时间内,缓存服务器不再对缓存的有效性进行检验
no-transform:禁止代理改变实体主体的媒体类型
public:明确指明缓存可以给所有用户使用
private:明确指明缓存不可以给其他用户使用
must-revalidate:如果缓存未过期,则返回;否则代理在返回缓存数据之前,必须向源服务器发起请求,验证缓存是否有效。如果无法连接上源服务器,则返回504网关超时
proxy-revalidate:所有缓存服务器在返回缓存数据前,都要向源服务器发起请求验证有效性
s-maxage=[秒]:缓存资源的时间小于指定时间时,直接返回缓存
5)访问控制(跨域问题和防盗链问题)
a)跨域问题
同源策略:协议,域名,端口相同即为同源
出现场景:服务器A和B,请求由服务器A发向服务器B获取数据,如果A和B不满足同源策略,则会出现跨域问题
解决方案:使用add_header
添加参数如下
add_header Access-Control-Allow-Origin *; 也可指定对应ip
add_header Access-Control-Allow-Method GET,PUT,POST,DELETE;
b)静态资源防盗链
资源盗链:是指内容不在自己的服务器上,通过技术手段,绕过别人的限制将他人的内容放在自己的页面
防盗链实现原理:根据HTTP头信息中的Referer(这个属性是告诉浏览器当前页面来源)来设置信任IP
具体实现:
valid_referers
查看referer与当前配置是否匹配来控制是否允许访问,匹配成功则设置$valid_referers变量值为0,匹配失败则设置变量值为1,匹配不区分大小写
语法:valid_referers none|blocked|server_name|string...
配置位置:server,location
说明:属性值可选择多个,多个时使用空格隔开
none:如果Header的Referer为空,允许访问
blocked:Header的Referer不为空,但是该值被防火墙或代理进行伪装过,如不携带请求协议头的资源允许访问
server_names:指定具体的域名或IP
string:可以支持正则或*或字符串,正则需使用~开头
示例:location /images{
root html;
valid_referers none blocked www.baidu.com ~\.google\.;
if ($valid_referers){ //if后面必须有一个空格,$valid_referers--0为false,1为true
return 403;
}
}
强化防盗链设置需要使用ngx_http_accesskey_module模块
8、反向代理
Rewrite主要是用来实现URL的重写,需要依赖PCRE,使用ngx_http_write_module模块来解析处理
1)相关指令:set,if,break,return,rewrite,rewrite_log
a)set
设置一个变量
语法:set $key value
配置位置:server,location,if
常用全局变量说明:
$args:该变量存放了URL中的请求参数,功能同$query_string
$http_user_agent:存放了用户访问服务的代理信息(如果通过浏览器访问,存放的是浏览器相关的版本信息,即Header中User-Agent的值)
$host:存放访问服务器的server_name值,也就是主机IP
$document_uri:存放的当前访问地址的URI,即上下文,功能同$uri
$document_root:存储当前请求对应location的root值,若未设置,默认指向nginx自带html目录所在的位置
$content_length:存储请求头中Content-Length的值
$content_type:存储请求头中Content-Type的值
$http_cookie:存储客户端的cookie信息
$limit_rate:存储nginx中limit_rate设置的值,默认为0,不限制
$remote_addr:存储客户端的IP地址
$remote_port:存储客户端的端口号
$remote_user:存储客户端的用户名,需要认证模块才能获取
$scheme:存储访问协议
$server_addr:存储服务端地址
$server_port:存储请求接收的服务器端口
$server_name:存储请求接收的服务的名称
$server_protocol:存储客户端请求的协议版本
$request_body_file:存储了发给服务端的文件名称
$request_method:存储了请求方式
$request_filename:存储了请求的资源文件名称
$request_uri:存储请求端口号后的内容
b)if
条件判断
语法:if (condition){...}
配置位置:server,location
说明:使用=和!=来做比较,比较的字符串数据不需要添加引号;如果只使用变量,则变量的值为空字符串或0即为false;使用正则表达式进行匹配时使用~,~*,!~,!~*来做比较符(~表示区分大小写,~*表示不区分大小写,!表示取反);判断文件是否存在使用-f和!-f,示例:-f $request_filename;判断目录是否存在使用-d和!-d;判断目录或文件是否存在使用-e和!-e;判断请求的文件是否可以执行使用-x和!-x
c)break
中断当前相同作用域中的其他配置,并终止当前匹配并把URI在本location进行重定向处理
语法:break;
配置位置:server,location,if
说明:重定向的默认位置是当前location值的目录下的index.html,状态码是301,永久重定向
d)return
完成请求的处理,直接向客户端返回
语法:return code[text];
return code URL;
return URL;
配置位置:server,location,if
说明:code为返回的状态码;text为返回的响应体内容;URL为返回的URL地址,跳转地址响应码为302,临时重定向
e)rewrite
通过正则表达式的是用来改变URI,可以存在多个指令,按顺序匹配
语法:rewrite regex replacement [flag]
配置位置:server,location,if
说明:regex是匹配URI的正则表达式,replacement是匹配成功后用于替换被截取内容的字符串,如果replacement是以"http://"或者"https://"开头的,则不会继续向下处理,而是直接返回重写后的URI
flag的可选值:
①last:终止继续在location块中处理接收到的URI,并将重写的URI作为一个新的URI,使用各location块进行处理
②break:将重写的URI作为新的URI在当前location中继续处理,不会转向其他location块
③redirect:将重写后的URI返回给客户端,状态码为302,主要是用在replacement变量不是以"http://"或者"https://"开头的情况
④permanent:将重写后的URI返回给客户端,状态码为301,主要是用在replacement变量不是以"http://"或者"https://"开头的情况
f)rewrite_log
是否开启URL重写日志的输出功能
语法:rewrite_log on|off;
默认值为off
配置位置:http,server,location,if
说明:需要指定写入的日志文件,配置参考error_log logs/error.log notice;
2)应用场景:域名跳转,域名镜像,独立域名,目录补齐"/",合并目录,防盗链的实现
a)域名跳转
通过rewrite实现,示例:rewrite ^(.*) http://www.baidu.com$1; 正则匹配保证上下文不会丢
b)域名镜像
存在一个主域名,其他的域名如果都跳转到主域名上,则其他的域名称为镜像域名
使用server_name可以声明多个域名,使用rewrite指定跳转的地址即可
c)独立域名
d)目录补齐
新版本会在重定向时添加/
server_name_in_redirect on|off
说明:0.8.48版本之前默认on,之后的版本默认为off
当为on时,重定向地址是http://server_name:80目录名/,需要手动处理确保server_name拼接的请求可访问
当为off时,重定向地址时http://原请求域名:80/目录名/
e)合并目录
搜索引擎优化(SEO)是一种利用搜索引擎的搜索规则来提高目的网站在有关搜索引擎内排名的方式,一般是建议URL的目录层级一般不超过三层,但也会导致三层目录下的文件随开发越来越多
示例:原始访问请求http://127.0.0.1:80/server/11/22/33/44.html
使用rewrite实现,示例:rewrite ^/server-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /server/$1/$2/$3/$4.html last;
使用如上重定向规则后,方式请求为http://127.0.0.1:80/server-11-22-33-44.html
将多层目录合并成一层目录
f)防盗链
使用rewrite实现
示例:location /images{
root html;
valid_referers none blocked www.baidu.com ~\.google\.;
if ($valid_referers){ //if后面必须有一个空格,$valid_referers--0为false,1为true
rewrite ^/ /images/11/picture.jpg
}
}
3)反向代理
a)proxy_pass
用来设置被代理服务器的地址,可以是主机名,域名,IP地址加端口形式
语法:proxy_pass URL
配置位置:location
说明:URL配置时如果不加最后的"/",则转发的url会拼接location的值,如果加了"/",则转发的url后面只会拼接原请求匹配location值后面的上下文
示例:原始请求:http://127.0.0.1:80/server/index.html
location /server{
proxy_pass http://127.0.0.2:80
实际转发:http://127.0.0.2:80/server/index.html
proxy_pass http://127.0.0.2:80/
实际转发:http://127.0.0.2:80/index.html
}
b)proxy_set_header
用来更改nginx服务器接收到的请求头信息
语法:proxy_set_header filed value;
默认值:proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
配置位置:http,server,location
说明:在代理服务器上设置filed名,要想在服务器上使用需要通过$http_filed来获取
c)proxy_redirect
用来重置头信息中的Location和Refresh的值
语法:proxy_redirect redirect replacement;
proxy_redirect default;
proxy_redirect off;
默认值为default
配置位置:http,server,location
说明:redirect参数即为Location的值,replacement即为需要替换的值;如果是default,则将location块的uri变量作为replacement,将proxy_pass变量作为redirect进行替换
示例:proxy_redirect http://127.0.0.2 http://127.0.0.1
将原本需要返回给127.0.0.2服务器的请求,发送给127.0.0.1服务器去处理
d)安全控制
安全隔离:通过代理分开了客户端到应用程序服务器端的连接,实现了安全措施,在反向代理之前设置防火墙,仅留一个入口供代理服务器访问
使用SSL对流量进行加密
使用SSL/TLS建立安全通信,加密数据包,确保数据安全
SSL:安全套接层,TLS:传输层安全
需要添加http_ssl_module
相关指令:
①ssl
用来指定服务器开启HTTPS
语法:ssl on|off
配置位置:http,server
说明:通常使用listen port ssl的方式开启
②ssl_certificate
为当前主机指定一个带有PEM格式的证书
语法:ssl_certificate file
配置位置:http,server
③ssl_certificate_key
用来指定PEM secert key文件的路径
语法:ssl_certificate_key file
配置位置:http,server
重要 ④ssl_session_cache
用来配置用于SSL会话的缓存
语法:ssl_session_cache off|none|[builtin[:size]][shared:name:size]
默认值:ssl_session_cache none
配置位置:http,server
说明:off表示禁用会话缓存,客户端不能重用会话;none表示禁用会话缓存,但客户端可以重用会话,此会话不会存储会话参数;builtin是指OpenSSL缓存,仅在一个工作进程中使用;shared是指所有工作进程之间共享缓存,缓存的信息由name和size指定
⑤ssl_session_timeout
用来设置客户端能反复使用存储在缓存中的会话参数时间
语法:ssl_session_timeout time
配置位置:http,server
⑥ssl_ciphers
指出允许的密码,密码指定为OpenSSL支持的格式
语法:ssl_ciphers ciphers
默认值:ssl_ciphers HIGH:!aNULL:!MD5
配置位置:http,server
扩展:查询openssl支持的格式:openssl ciphers
⑦ssl_prefer_server_ciphers
用来指定服务器密码是否优先于客户端密码
ssl_prefer_server_ciphers on|off
默认值为off
配置位置:http,server
通过openssl生成证书
mkdir /root/cert
cd /root/cert/
openssl genrsa -des3 -out server.key 1024 生成key文件需要设置密码
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
具体配置示例
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /root/cert/server.crt;
ssl_certificate_key /root/cert/server.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;
}
}
4)反向代理系统优化
原理是使用缓冲和缓存
a)proxy_buffering
用来开启或关闭代理服务器的缓冲区
语法:proxy_buffering on|off
默认值为on
配置位置:http,server,location
b)proxy_buffers
用来指定单个连接从代理服务器读取响应的缓存区的个数和大小
语法:proxy_buffers number size
默认值:proxy_buffers 8 4k|8k
配置位置:http,server,location
c)proxy_buffer_size
用来设置从被代理服务器获取第一部分响应数据的大小
语法:proxy_buffer_size size
默认值:proxy_buffer_size 4k|8k
配置位置:http,server,location
说明:建议和proxy_buffers的size保持一致
d)proxy_busy_buffer_size
用来限制同时处于busy状态的缓冲总大小
语法:proxy_busy_buffer_size size
默认值:proxy_busy_buffer_size 8k|16k
配置位置:http,server,location
e)proxy_temp_path
当缓冲区满后,仍未被nginx服务器完全接受,响应数据就会被存放在磁盘文件上
语法:proxy_temp_path path
默认值:proxy_temp_path proxy_temp
配置位置:http,server,location
说明:path最多设置3曾
f)proxy_temp_file_write_size
用来设置磁盘上缓冲文件的大小
语法:proxy_temp_file_write_size size
默认值:proxy_temp_file_write_size 8k|16k
配置位置:http,server,location
9、负载均衡
常用方式:手动选择,DNS轮询,四/七层负载均衡
DNS:域名系统协议是一种分布式网络目录服务,主要用于域名和IP地址的相互转换,一个域名可绑定多个IP地址,就可以实现DNS轮询
刷新服务器DNF映射关系缓存:ipconfig/flushdns
实现四层负载均衡的方式:主要是基于IP+PORT的方式
硬件:F5,BIG-IP,Radware等
软件:LVS,Nginx,Hayproxy等
实现七层负载均衡的方式:主要是基于虚拟的URI或主机IP
软件:Nginx,Hayproxy等
两个区别:四层数据包是在底层就进行了分发,七层数据包在顶端进行分发,所以四层的效率高于七层;但四层不识别域名,七层可识别域名。实际使用一般是四层(LVS)+七层(Nginx)
二层负载均衡器是在数据链路层基于mac地址来实现的;三层是在网络层一般采用虚拟IP地址的方式
1)七层负载均衡的实现
需要使用proxy_pass模块,默认已安装。Nginx的负载均衡是在Nginx的反向代理基础上把用户的请求根据指定的算法分发到一组upstream虚拟服务池
a)upstream
该指令用来定义一组服务器,它们可以是监听不同端口的服务器,也可以是同时监听TCP和socket的服务器。服务器可以指定不同的权重,默认为1
语法:upstream name{...}
配置位置:http
b)server
用来指定后端服务器的名称和参数,可以使用域名,ip,端口或socket
语法:server name [paramerters]
配置位置:upstream
c)配置示例
upstream test{
ip_hash;
server http://127.0.0.1:9000 down;
server http://127.0.0.1:9001 backup;
server http://127.0.0.1:9002 max_fails=3 fail_timeout=15;
}
server{
listen 8080;
server_name localhost;
location / {
proxy_pass http://test;
}
}
d)负载均衡状态说明(server的paramerters)
①down:当前server不参与负载均衡
②backup:预留的备份服务器,即主服务器不能提供服务后,由备份服务器提供服务
③max_fails:允许请求失败的次数,默认为1
④fail_timeout:经过max_fails后,服务暂停的时间,默认为10s
⑤max_conns:限制连接的最大数,默认为0,表示不限制
扩展:通过防火墙控制端口开放
查询是否开放:firewall-cmd --query-port=9001/tcp
开放指定端口:firewall-cmd --permanent --add-port=9001/tcp
批量开放指定端口:firewall-cmd --permanent --add-port=9001-9003/tcp
移除一个指定端口:firewall-cmd --permanent --remove-port=9001/tcp
加载配置生效:firewall-cmd --reload
e)负载均衡策略(server的paramerters)
①轮询:默认策略,每个server各分配一个
②weight:加权轮询,默认值为1,权重越大,被分配到请求的概率越大
示例:server http://127.0.0.1:9000 weight=10;
③ip_hash:依据ip分配(可以解决多server场景session不共享问题),存在的缺点就是不能保证负载均衡,也会是weight失效,一般不推荐使用
示例:如上c)示例
④least_conn:依据最少链接
配置方式同ip_hash
⑤url_hash:依据URL分配,需要配合缓存命中来使用,避免同意资源多次请求多次下载的问题
配置方式:hash &request_uri;
⑥fair:依据响应时间,可根据页面大小,加载时间长短进行负载均衡,需要下载第三方模块
配置方式:fail;
添加第三方模块nginx-upstream-fair
下载:https://github.com/gnosek/nginx-upstream-fair
上传指某个目录并解压:unzip nginx-upstream-fair-master.zip
加载资源到nginx:./configure --add-module=解压后目录名
编译:make
如果make报错'ngx_http_upstream_srv_conf_s' has no member named 'default_port'
解决措施:找到nginx的解压目录下的src/http/ngx_http_upstream.h
找到ngx_http_upstream_srv_conf_s,在模块中添加in_port_t default_port属性
然后再进行make即可
2)四层负载均衡的实现(使用不多,了解)
依赖stream模块,需要手动添加,1.9版本后支持
./configure --with-stream
a)stream
提供在其中指定流服务器指令的配置文件上下文,和http指令同级
配置位置:main
b)upstream
同七层中的用法
c)配置示例
stream{
upstream test{
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server{
listen 81; //说明stream中的server里不能配置server_name,识别不了
proxy_pass test;
}
}
10、缓存
0.7.48版本开始提供缓存功能,基于proxy store实现,原理是对以url及相关组合做MD5加密得到的hash值来创建目录存储数据,使用的是ngx_http_proxy_module模块
1)proxy_cache_path
指定用于设置缓存文件的存放路径
语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time][max_size=size]
配置位置:http
说明:levels是指定缓存空间对应的目录,最多可设置3层,每层取值1|2
示例:某url加密后为34fasj123jga7
levels=1:2 则存储路径为path/7/ga/
levels=2:1:2 则存储路径为path/a7/g/3j
keys_zone=test:200m 则表示缓存区名称为test,大小为200m(1m可存储8000个key)
inactive=1d 表示缓存数据1天内没有被访问则删除
max_size=20g 设置缓存空间最大20g,超过该大小,会默认覆盖存在时间最长的资源
2)proxy_cache
用来开启指定缓存区或关闭缓存功能
语法:proxy_cache zone_name|off
默认值为off
配置位置:http,server,location
3)proxy_cache_key
用来设置web缓存的key值,nginx会根据key值MD5哈希存储,推荐使用默认值
语法:proxy_cache_key key
默认值:proxy_cache_key $scheme$proxy_host$request_uri
配置位置:http,server,location
4)proxy_cache_valid
用来对不同返回状态码的URL设置不同的缓存时间,可配置多个
语法:proxy_cache_valid [code...] time
配置位置:http,server,location
配置示例:proxy_cache_valid 200 302 10m;
proxy_cache_valid any 1m
说明:为响应为200或302的URL设置缓存10m,也可用any 1m来做统一设置
5)proxy_cache_min_uses
用来设置资源被访问多少次后被缓存
语法:proxy_cache_min_uses number
默认值为1
配置位置:http,server,location
6)proxy_cache_methods
设置缓存哪些http方法
语法:proxy_cache_methods GET|HEAD|POST
默认值:proxy_cache_methods GET HEAD;
配置位置:http,server,location
扩展:确认缓存是否命中,可以添加如下header信息:add_header nginx-cache "$upstream_cache_status";
7)缓存清除的手段
a)手动清除
手动删除指定的缓存目录下的文件
b)第三方扩展模块
ngx_cache_purge模块,方式同9->1)->e)->⑥
8)不缓存
a)proxy_no_cache
定义不将数据进行缓存
语法:proxy_no_cache string...
配置位置:http,server,location
配置示例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
b)proxy_cache_bypass
用来设置不从缓存中获取数据的条件
语法:proxy_cache_bypass string...
配置位置:http,server,location
配置示例:proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
说明:cookie_nocache指的是cookie中的nocache值,arg_nocache和arg_comment指的是参数列表中的nocache和comment值,这三个值中只要有一个值不为空,则proxy_no_cache和proxy_cache_bypass指令就会生效
11、集群搭建
1)动静分离
2)集群搭建
3)nginx高可用
使用Keepalived(通过VRRP协议实现高可用功能)
VRRP:虚拟路由冗余协议,对外提供虚拟IP,内部则是谁提供服务谁是master,其他服务器则是backup状态,只接收master的vrrp状态通告信息,master失效,则有backup提供服务
a)软件安装
下载keepalived,地址:https://keepalived.org/
下载并上传软件包,示例:keepalived-2.0.20.tar.gz
在当前目录解压软件包:tar -xzvf keepalived-2.0.20.tar.gz
配置并安装:cd keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local
make && make install
说明:在/etc/keepalived/keepalived.conf为软件的主要配置文件,在/usr/local/sbin下的keepalived为系统脚本,用来启停
b)keepalived.conf
配置分为三部分,global全局配置,vrrp配置,LVS配置
详细信息:
! Configuration File for keepalived
#全局配置
global_defs {
#通知邮件,当keepalived发生切换时需要通知的email地址
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
#设置发件人的邮箱信息
notification_email_from Alexandre.Cassen@firewall.loc
#指定smpt服务器地址
smtp_server 192.168.200.1
#指定smpt服务器连接超时时间
smtp_connect_timeout 30
#运行keepalived服务器的一个标识,可以作为邮件的主题
router_id LVS_DEVEL
#默认不跳过检查。检查接收VRRP通告中的地址会比较耗时,该指令指接收的通告如果和上一个通告来自于同一个master路由器,则跳过检查
vrrp_skip_check_adv_addr
#严格遵守VRRP协议
vrrp_strict
#在一个接口发送的两个arp之间的延迟
vrrp_garp_interval 0
#在一个网卡上每组na消息之间的延迟
vrrp_gna_interval 0
}
#设置VRRP示例,实例名为VI_1
vrrp_instance VI_1 {
#设置当前示例为MASTER还是BACKUP
state MASTER
#VRRP实例绑定的接口,主要用于发送VRRP消息包,可使用网卡名称来设置
interface eth0
#虚拟VRRP的id值,范围0-255,同一套环境中master和backup建议使用同一个id
virtual_router_id 51
#优先级
priority 100
#VRRP通告发送的时间间隔,单位s
advert_int 1
#认证属性
authentication {
#认证类型,PASS密码认证
auth_type PASS
#认证密码,最多8位
auth_pass 1111
}
#对外提供的虚拟IP,由客户端访问使用
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
#设置自定义脚本
track_script{
脚本名称
}
}
#自定义脚本信息
vrrp_script 脚本名称{
script "脚本位置"
#执行时间间隔
interval 3
#动态调整vrrp_instance的优先级,避免启动后切换导致资源浪费
weight -20
}
#LVS配置,了解
virtual_server 192.168.200.100 443 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.201.100 443 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
12、制作一个下载站点
依赖ngx_http_autoindex_module模块,该模块处理以/结尾的请求,并生成目录列表,模块默认已安装
1)autoindex
启用或禁用目录列表输出
语法:autoindex on|off
默认值为off
配置位置:http,server,location
2)autoindex_exact_size
对应HTML格式,指定是否在目录列表展示文件的详细大小
语法:autoindex_exact_size on|off
默认值为on
配置位置:http,server,location
说明:on为显示确切大小,单位为bytes;off为显示大概大小,单位为kb或mb或gb
3)autoindex_format
设置目录列表格式,该指令1.7.9及之后版本支持
语法:autoindex_format html|xml|json|jsonp
默认值为html
配置位置:http,server,location
4)autoindex_localtime
对应html格式,是否在目录列表上显示时间
语法:autoindex_localtime on|off
默认值为off
配置位置:http,server,location
说明:off为显示文件的GMT时间;on为显示文件所在的服务器时间
5)配置示例
location /download {
root /usr/local;
autoindex on;
autoindex_exact_size on;
autoindex_format html;
autoindex_localtime on;
}
13、用户认证
依赖ngx_http_auth_basic_module模块,默认已安装
1)auth_basic
使用HTTP基本认证协议启用用户名和密码的校验
语法:auth_basic string|off
默认值为off
配置位置:http,server,location,limit_except
说明:string用来做页面提示
2)auth_basic_user_file
指定用户名和密码所在的文件
语法:auth_basic_user_file file
配置位置:http,server,location,limit_except
3)密码生成工具
//安装httpd-tools
yum install -y httpd-tools
//创建一个新文件记录用户名和密码
htpasswd -c /usr/local/nginx/conf/htpasswd username
//在指定文件添加一个用户名和密码
htpasswd -b /usr/local/nginx/conf/htpasswd username password
//删除一个用户信息
htpasswd -D /usr/local/nginx/conf/htpasswd username
//验证用户名和密码是否正确
htpasswd -v /usr/local/nginx/conf/htpasswd username
14、添加白名单
nginx白名单
方式一:
geo $allowed_country {
default 0;
CHN 1;
USA 1;
}
server {
if ($allowed_country = 0) {
return 403;
}
}
方式二:
allow IP1;
allow IP2;
deny all;
15、异常处理
1)升级失败
报错信息:
[root@hadoop100 nginx-1.24.0]# make upgrade
/usr/local/nginx/sbin/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
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
make: *** [upgrade] 错误 1
解决措施:杀了当前nginx的进程,用备份的文件重新启动,再次升级
pkill -int nginx
./nginxold
make upgrade
常见请求异常状态码
403 无权限
400 请求参数异常
404 匹配不到请求头
405 请求方式不匹配
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
