Nginx是一个高性能的HTTP和反向代理Web服务器.同时也提供了IMAP/POP3/SMTP服务.占有内存少、并发能力强。
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
客户端对代理是无感知的,不需要任何配置就可以访问。只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
并发请求时,将请求分发到多个服务器上,将负载分发到不同的服务器
为加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
从配置文件开始到events块之间的内容,主要会设置一些影响Nginx服务器整体运行的配置指令,主要包括:配置运行Nginx服务器的用户(组)、运行生成的worker process数、进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
worker_processes 1; ##worker_processes值越大,可以支持的并发处理量也越多
主要影响Nginx服务器与用户的网络连接,常用设置包括是否开启对多workprocess下的网络连接进行序列化,是否允许同时接收多个网络连接,选取那种事件驱动模型来处理连接请求,每个word process可以同时支持的最大连接数等。
events { worker_connections 768; ##支持的最大连接数 # multi_accept on; }
http块包括:http块和server块
http块: 配置指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
server块:
##CentOS 安装 yum -y install gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel wget http://nginx.org/download/nginx-1.9.9.tar.gz tar -zxvf nginx-1.9.9.tar.gz cd nginx-1.9.9 ./configure make make install
注意:如果连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口
#开启 service firewalld start #重启 service firewalld restart #关闭 service firewalld stop #查看防火墙规则 firewall-cmd --list-all #查询端口是否开放 firewall-cmd --query-port=8080/tcp #开放80端口 firewall-cmd --permanent --add-port=80/tcp #移除端口 firewall-cmd --permanent --remove-port=8080/tcp #重启防火墙(修改配置后要重启防火墙) firewall-cmd --reload ##参数解释 firwall-cmd:是Linux提供的操作firewall的一个工具: --permanent:表示设置为持久 --add-port:标识添加的端口
server{ listen 8080; server_name: 192.168.17.219; root /home/project/DIANBoard/build; location / { proxy_pass http://127.0.0.1:8888; } }
使用Nginx反向代理,根据访问的路径跳转到不同端口的服务中,Nginx监听9001
访问http://127.0.0.1:9001/edu/ 直接跳转到127.0.0.1:8080
访问http://127.0.0.1:9001/vod/ 直接跳转到127.0.0.1:8081
server { listen 9091; server_name localhost; //允许cros跨域访问 add_header 'Access-Control-Allow-Origin' '*'; #proxy_redirect default; #跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。 proxy_connect_timeout 10; location ~ /edu/ { proxy_pass http://127.0.0.1:8080; } location ~ /vod/ { proxy_pass http://127.0.0.1:8081; } }
用于匹配URL
location [ = | ~ | ~* | ^~] uri { }
*注意:如果URI包含正则表达式,则必须要有~ 或者 ~标识。
http{ ... upstream myserver{ ip_hash; server 121.199.76.44:8080; server 121.199.76.44:8081 } server{ listen 7777; server_name localhost; root /myproject/build; location / { .... proxy_pass http://myserver; proxy_connection_timeout 10; } } }
upstream myserver{ server 121.199.76.44:8080 weight=1; server 121.199.76.44:8081 weight=1; }
upstream myserver{ ip_hash; server 121.199.76.44:8080; server 121.199.76.44:8081; }
upstream myserver{ server 121.199.76.44; server 121.199.76.44; fair; }
将动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。
动静分离实现角度:
通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
Expires:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),3d,表示3天之内访问这个URL,发送一个请求,比对服务器改文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304, 如果有修改,则直接从服务器重新下载,返回状态码200。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z12Q0FVv-1633449034776)(/Users/lushengyang/Desktop/LSY/document/image/截图.png)]
创建data目录,分别放data/a.html和image/1.jpeg
location /www/ { root /data/; index index.html index.htm; } location /image/ { root /data/; autoindex on; #列出当前文件中的内容 }
采用 ngx_http_limit_req_module模块来限制请求的访问频率,基于漏桶算法原理实现
使用 nginx limit_req_zone 和 limit_req 两个指令,限制单个IP的请求处理速率
http{ limit_req_zone $binary_remote_addr zone=serviceRateLimit:10m rate=10r/s //每秒最多处理10个请求 } server{ location / { limit_req zone=servicelRateLimit; proxy_pass http://upstream_clusterl; } }
语法:limit_req_zone key zone rate
按上面的配置在流量突然增大时,超出的请求将被拒绝,无法处理突发流量,那么在处理突发流量的时候,该怎么处理呢?Nginx提供了 burst 参数来解决突发流量的问题,并结合 nodelay 参数一起使用。burst 译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数。
http{ limit_req_zone $binary_remote_addr zone=serviceRateLimit:10m rate=10r/s //每秒最多处理10个请求 } server{ location / { limit_req zone=servicelRateLimit burst=20 nodelay; proxy_pass http://upstream_clusterl; } }
burst=20 nodelay表示这20个请求立马处理,不能延迟,相当于特事特办。不过,即使这20个突发请求立马处理结束,后续来了请求也不会立马处理。burst=20 相当于缓存队列中占了20个坑,即使请求被处理了,这20个位置这只能按 100ms一个来释放。这就达到了速率稳定,但突然流量也能正常处理的效果。
ngx_http_limit_conn_module模块提供了对资源连接数进行限制的功能,使用 limit_conn_zone 和 limit_conn 两个指令
http{ limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; } server{ ... limit_conn perip 20; //限制单个IP同时最多能持有10连接 limit_conn perserver 100; //限制server的最大连接数 }
location ~ .*\.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|mp4|ogg|ogv|webm)$ { expires 7d; } location ~ .*\.(?:js|css)$ { expires 7d; }
proxy_cache_path /data/cache/nginx/ levels=1:2 keys_zone=cache:512m inactive = 1d max_size=8g; location / { location ~ \.(htm|html)?$ { proxy_cache cache; proxy_cache_key $uri$is_args$args; //以此变量值做HASH,作为KEY add_header X-Cache $upstream_cache_status; proxy_cache_valid 200 10m; proxy_cache_valid any 1m; proxy_pass http://real_server; proxy_redirect off; } location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)${ root /data/webapps/edc; expires 3d; add_header Static Nginx-Proxy; } }
geo $limit { 122.16.11.0/24 0; } map $limit $limit_key{ 1 $binary_remote_addr; 0 ""; } limit_req_zone $limit_key zone=mylimit:10m rate=1r/s; location / { limit_req zone=mylimit burst=1 nodelay; proxy_pass http://serveic3Cluster; }
location / { deny 10.52.119.21; deny 11.12.123.1/24; allow 10.1.1.0/16; allow 1001:0dby::/32; deny all; }
Keepalived
高可用:两台业务系统启动相同服务,如果有一台宕机,另一台自动接管,即高可用
安装配置keepalived:
#两条服务器安装 yum install keepalived -y ##Ubuntu 安装keepalived sudo apt-get install libssl-dev sudo apt-get install openssl sudo apt-get install libpopt-dev sudo apt-get install keepalived #配置keepalived.conf sudo vim /etc/keepalived/keepalived.conf global_defs { #全局定义 notifaction_email { 1575018859@qq.com } notification_email_from sns-lvs@gmail.com smtp_server smtp.hysec.com smtp_connection_timeout 30 router_id nginx_master #设置Nginx master的ID,在一个网络应该是唯一的,访问到主机 } vrrp_script chk_http_port { script "/usr/local/src/check_nginx_pid.sh" ##最后手动执行下次脚本,以确保此脚本能够正常执行 interval 2 ##(检测脚本执行的间隔,单位是秒) weight 2 } vrrp_instance VI_1 { state MASTER #指定keepalived的角色,MASTER为主,BACKUP为备 interface eth0 #当前进行vrrp通讯的网络接口卡(当前centos的网卡),使用 ifconfig查看 virtual_router_id 66 #虚拟路由编号,主从要一致 priority 100 #优先级,数值越大,获取处理请求的优先级越高 advert_int 1 #检查间隔,默认为ls(vrrp组播周期秒数) authentication { auth_type PASS auth_pass 1111 } track_script{ chk_http_port #调用检测脚本 } virtual_ipaddress { 121.199.76.44 ##定义虚拟IP(VIP),可多设,每行一个 } } ##创建Nginx服务监控脚本/usr/local/nginx/check_nginx.sh(主从服务器一致) sudo vim /usr/local/src/check_nginx_pid.sh #!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then #/usr/local/nginx/sbin/nginx #重启Nginx sudo service nginx restart if [ `ps -C nginx --no-header | wc -l` -eq 0];then #Nginx重启失败,则停掉keepalived服务 killall keepalived fi fi ###另外检测脚本 #!/bin/sh nginxpid=$(ps -C nginx --no-header|wc -l) #1.判断Nginx是否存活,如果不存活则尝试启动Nginx if [$nginxpid -eq 0 ];then systemctl start nginx sleep 3 #2.等待3秒后再次获取一次Nginx状态 nginxpid=$(ps -C nginx --no-header|wc -l) #3.再次进行判断,如Nginx还不存活则停止keepalived,让地址进行漂移,并退出脚本 if[$nginxpid -eq 0];then systemctl stop keepalived fi fi
日志存放位置:/var/log/messages
程序目录:/etc/keepalived/keepalivd.conf
启动nginx和keepalived
systemctl start keepalived.service
一个master和多个worker的好处
连接数worker_connection
发送请求,占有worker的几个连接数:2个(静态)或者4个(动态)
nginx有一个master, 有4个worker,每个worker支持最大的连接数据1024,支持的最大并发数多少?
##普通的静态访问最大并发数是:worker_connections * worker_processes / 2,
##而如果是http作为反向代理,最大并发数:worker_connections * worker_processes / 4