Nginx从安装到配置文件详解
nginx的介绍
select和epoll模型
nginx为epoll模型,apache为select模型
指标
|
select
|
epoll |
性能
|
随着连接数的增加性能急剧下降。处理千万并发连接数时,性能差
|
随着连接数的增加,性能基本上没有下降。处理成千上万并发连接时,性能很好
|
连接数
|
处理最大连接数不超过1024.如果超过1024个,则需要修改FD_SETSIZE宏,重新编译
|
连接数无限制
|
内在处理机制
|
线性轮询
|
函数回调callback
|
开发复杂性
|
低
|
中
|
Nginx与Apache比较
Nginx
|
Apache
|
占用内存及资源少,可处理高并发请求
|
rewrite功能强大
|
本身是反向代理服务器,负载均衡能力突出,可实现分布式架构及高可用集群
|
动态页面处理能力强
|
社区活跃,高性能模块出品迅速
|
bug少,稳定性强 |
模块化设计,编写模块相对简单
|
|
nginx的处理请求过程:
1.启动时,解析配置文件,得到需要监听的端口和ip地址
2.nginx的master进程初始化监控socket,再进行监听listen
3.master在fork出多个子进程,竞争accept新的连接
4.客户端向nginx发起连接。当客户端与nginx进行三次握手,建立连接,某个子进程会accept成功,然后创建nginx对连接的封装,即ngx_connection_t结构体,调用相应事件的处理模块。
nginx和lvs的优缺点比较
nginx | lvs | |
工作在哪一层 | 第七层 应用层 | 第四层 网络层 |
网络依赖 | 依赖较小,ping的通就可以 | 比较依赖于网络环境 |
安装配置上 | 简单,测试方便 | 花时间较长 |
负载能力 | 负载较高,稳定,没有现成的双机热备方案 | 负载很高,更稳定,有完整的双机热备方案 |
故障处理 | 可以检测到服务器内部的故障,并且会把返回错误的请求重新提交到另一个节点 | lvs中ldirectd也能支持针对服务器内部的情况来监控,但lvs的原理使其不能重发请求 |
支持应用 | 能支持http和Email | 几乎可以对所有应用做负载均衡 |
一.nginx的安装
1.1rpm安装
RPM包获取:http://nginx.org/packages/
(1)将nginx放到yum repo库中
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
(2)查看包信息
yum info nginx
(3)安装nginx
yum install nginx
(4)启动nginx
systemctl start nginx
1.2yum安装
yum安装法法简单,但是缺少灵活性;无法自定义模块及安装路径
1.3源码安装
源码包获取:http://nginx.org/download/
源码安装法法过程繁琐,但是可定制化安装
①安装环境准备,安装依赖包,创建安装目录
[root@localhost ~]# mkdir -p /opt/data/nginx/
[root@localhost ~]# groupadd nginx
[root@localhost ~]# useradd -g nginx nginx
[root@localhost ~]# yum install gcc gcc-c++ make recp pcre-devel openssl openssl-devel -y
[root@localhost ~]# tar -xf nginx-1.14.0.tar.gz -C /usr/local/src/
②编译安装
[root@localhost nginx-1.14.0]# ./configure --prefix=/opt/data/nginx --with-http_stub_status_module --with-http_ssl_module
[root@localhost nginx-1.14.0]# make &make install
③配置环境变量
[root@localhost sbin]# ./nginx -t
[root@localhost sbin]# vim /etc/profile
export PATH=/opt/data/nginx/sbin:$PATH
[root@localhost sbin]# source /etc/profile
④nginx配置
[root@localhost nginx]# ln -s /opt/data/nginx/conf /etc/nginx /usr/local/src/nginx-1.17.5/conf
[root@localhost conf] # vim nginx.conf
user nginx;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
access_log off;
client_max_body_size 128M;
include /etc/nginx/conf.d/*.conf;
}
[root@localhost nginx]# mkdir /etc/nginx/conf.d
[root@localhost nginx]# mkdir /var/log/nginx
[root@localhost nginx]# chown -R nginx:nginx /var/log/nginx
⑤nginx启动
vim /lib/systemd/system/nginx.service [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStartPre=/opt/data/nginx/sbin/nginx -t -c /opt/data/nginx/conf/nginx.conf ExecStart=/opt/data/nginx/sbin/nginx -c /opt/data/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
nginx -s reload #重启
nginx -s stop #停止
nginx -t#检配置文件是否正常
第三方模块
二.location规则
拦截URL
2.1 location 规则及其优先级
语法规则:location [=|~|~*|!~|!~*|^~] /uri/ {...}= 表示精确匹配,优先级也是最高的^~ 表示uri以某个常规字符串开头,理解为匹配url路径即可~ 表示区分大小写的正则匹配~* 表示不区分大小写的正则匹配!~ 表示区分大小写不匹配的正则!~* 表示不区分大小写不匹配的正则/ 通用匹配,任何请求都会匹配到Location优先级: = > ^~ > ~|~*|!~|!~* > /相同的优先级,匹配与配置文件的顺序有关,从上到下匹配。在配置文件中最靠前,先执行
三.地址重写
1. URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。
1. rewrite 重写,把web请求重定向到其他URL
2. 从安全角度上讲,如果在URL中暴露太多的参数,无疑会造成一定量的信息泄漏,可能会被一些黑客利用,对你的系统造成一定的破坏,所以静态化的URL地址可以给我们带来更高的安全性。
配置文件server个块写,如:
server {
rewrite 规则 定向路径 重写类型;
}
规则:可以是字符串或者正则来表示想匹配的目标URL
定向路径:表示匹配到规则后要定向的路径。如果规则里有正则,则可以使用$index来表示正则捕获分组
重写类型:
last:表示完成rewrite,浏览器地址栏URL地址不变
break:本条规则匹配完成后,终止匹配,不在匹配后面的规则,浏览器地址栏URL地址不变
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址不变
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
4.if判断
需要判断当文件不存在时,当路径包含xx时等条件,则需要用到if。
语法:
if () {
}
当 表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
一些内置判断:
-f和!-f判断文件是否存在
-d和!-d判断是否存在目录
-e和!-e判断是否存在文件或目录
-x和-!x判断文件是否可执行
例: 1.如果文件不存在则返回400 if (!-f $request_filname) { return 400; } 2.如果host不是abc.com,则301到abc.com中 if ( $host !="abc.com"){ rewrite ^/(.*)$ http://abc.com/$1 permanent; }
在匹配过程中可以引用一些Nginx的全局变量
$args 请求中的参数;
$document_root 针对当前请求的根路径设置值;
$host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate 对连接速率的限制; $request_method 请求的方法,比如"GET"、"POST"等; $remote_addr 客户端地址;
$remote_port 客户端端口号;
$remote_user 客户端用户名,认证用;
$request_filename 当前请求的文件路径名(带root指定的路径)
$request_uri 当前请求的文件路径名(不带root指定的路径 /images/a.jpg)
$query_string 与$args相同;
$scheme 用的协议,比如http或者是https
$server_protocol 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得址;
$server_name 请求到达的服务器名;
$document_uri 与$uri一样,URI地址;
$server_port 请求到达的服务器端口号;
四、nginx常见模块以及配置文件
模块
|
作用
|
with-http_stub_status_module
|
记录nginx访问基本状态信息的模块
|
ngx_http_access_module
|
访问控制模块,用来控制网站用户对nginx的访问。
|
ngx_http_rewrite_module
|
URL地址重写模块
|
ngx_http_gzip_module
|
启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
|
ngx_http_ssl_module
|
启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
|
ngx_http_proxy_module
|
proxy代理模块
|
ngx_http_log_module
|
访问日志模块,以指定的格式记录nginx客户访问日志等信息。
|
ngx_http_fastcgi_module
|
FastCGI模块,和动态应用相关的模块,如PHP
|
ngx_http_upstream_module
|
负载均衡模块,可以实现网站的负载均衡能力及节点的健康检查。
|
nginx lua
|
nginx lua防刷规则模型
|
4.1 with-http_stub_status_module
功能:记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态信息。例如:链接数的信息
#虚拟主机配置
server { listen 192.168.25.129:80; #监听端口 server_name www.thinken.com; #服务器域名,可多个,用空格隔开
#定义虚拟主机访问日志 access_log /data/thinken/log/access.log combined; error_log /data/thinken/log/error.log; #查看nginx状态
location / { stub_status on; root /data/thinken/basic; #修改登录nginx的主目录 index index.html index.htm; #用于设定访问的默认首页地址 } }
结果:
Active connections表示当前活跃的连接数第三行表示 Nginx当前总共处理了连接数, 成功创建几次握手, 总共处理了请求个数。最后一行的Reading表示Nginx读取到客户端Header信息数,Writing 表示Nginx返回给客户端的Header信息数
Waiting 表示Nginx已经处理完,正在等候下一次请求指令时的驻留连接数。
4.2 ngx_http_log_module
功能:实现对日志格式的设定
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
4.3. ngx_http_auth_basic_module
server {
listen 80;
server_name localhost;
access_log /data/thinken/log/access.log main;
auth_basic "oldboy training";
auth_basic_user_file /opt/data/nginx/conf/htpasswd;
location / {
stub_status on;
root /data/thinken/basic;
index index.html index.htm;
}
}
htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
[root@localhost conf]# yum install httpd -y [root@localhost conf]# which htpasswd
/usr/bin/htpasswd
[root@localhost conf]# htpasswd -bc /opt/data/nginx/conf/htpasswd admin 123456
Adding password for user admin
[root@localhost conf]# chmod 400 /opt/data/nginx/conf/htpasswd
[root@localhost conf]# chown nginx /opt/data/nginx/conf/htpasswd
[root@localhost conf]# cat /opt/data/nginx/conf/htpasswd
admin:$apr1$yZ2AK1W7$FPrliMJHCv6PI7fkRmXCW1
4.4ngx_http_access_module
功能:限制访问,禁止多允许指定IP或ip段访问某些虚拟主机或目录
allow指令 语法:allow [address|CIDR|all] 使用环境:http,server,location 作用:允许指定的IP地址或IP地址段访问某些虚拟主机或目录 deny指令 语法:deny [address|CIDR|all] 使用环境:http,server,location 作用:禁止指定的IP地址或IP段访问某些虚拟主机或目录 匹配规则
控制规则按照声明的顺序进行检查,首条匹配IP的访问规则将被使用
location / {
stub_status on;
root /data/thinken/basic;
index index.html index.htm;
deny 192.168.1.;
allow 192.168.1.0/24;
deny all;
}
优先顺序由上到下
当ip地址不匹配1,2两条规则,将禁止左右ip访问
4.5 ngx_http_proxy_module
代理类似一个中介,有正向代理和反向代理
4.5.1正向代理
概念:帮助内网客户端访问外网server
功能:1.访问原来无法访问的资源2.利用正向代理可以对局域网对外网的访问进行必要的监控和管理3.对客户端访问授权,上网进行认证4.代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
注意:正向代理服务不支持外部对内部网络的请求访问
4.5.2反向代理
概念:与正向代理相反,将外网客户端的请求转发至内部服务器
反向代理是作用在服务器端的,是一个虚拟ip(VIP)。对于用户的一个请求,会转发到多个后端处理器中的一台来处理该具体请求。
反向代理的功能:1.保证内网安全,组织web攻击2.可对后端服务器实现负载均衡
总结:
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
此模型允许将请求传递给另一个服务器1、proxy_pass URL;该指令用于设置被代理服务器的协议、主机名、IP地址、端口等形式2、proxy_set_header field value;设定发送后端主机的请求报文的请求首部的值
4.6 ngx_http_upstream_module
功能:实现web服务器的负载均衡,和反向代理可共同使用
定义一群服务器。服务器可以监听到不同的端口。此外tcp和UNIX-domain socket服务器可以混合定义。
.conf文件
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{ . . . 将代理服务器收到的用户的信息传到真实服务器上 location / { proxy_pass http://backend; proxy_set_header X-Real-IP $remote_addr; } }
upstream目前支持4种方式分配
1.轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如: upstream bakend { server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; } 3、ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如: upstream bakend { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; } 4、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 upstream backend { server server1; server server2; fair; }
5.url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。hash_method为hash算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
每个设备的状态设置为:
1.max_fails=3 允许请求失败的次数32.fail_timeout=30s 3次请求失败暂停30s时间3.slow_start=time s设置一台不健康的主机变成健康主机,将其权重由0恢复到标准值的时间。默认为0.4.backup 将当前服务器为备份服务器。当服务器不可用时,向备用服务器传递请求。5.down 标记当前服务器为永久不可用
实现负载均衡的工具:软件:nginx,LVS,haproxynginx:七层,四层 应用层,网络层LVS: 四层haproxy:七层硬件:f5