第九周作业
1. 简述lvs和nginx区别,
(1)lvs抗负载能力强,因为lvs工作方式的逻辑是非常简单的,而且工作再网络层第4层,仅作请求分发用,没有流量,所以在效率上基本不需要太过考虑。lvs一般很少出现故障,即使出现故障一般也是其他地方(如内存、CPU等)出现问题导致lvs出现问题。
(2)nginx工作在网络的第7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下lvs并不具备这样的功能,所以nginx单凭这点可以利用的场合就远多于lvs了。
1.高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2——3万并发连接数。
2.内存消耗少:在3万并发连接数下,开启的10个nginx进程才消耗150M内存(150*10=150M)。
3.配置文件非常简单:风格跟程序一样通俗易懂。
4.支持rewrite重写规则:能够根据域名、url的不同,将http请求分到不同的后端服务器群组。
5.内置的健康检查功能:如果nginx proxy后端的某台web服务器宕机了,不会影响前端访问。
6.节省带宽:支持gzip压缩,可以添加浏览器本地缓存的header头。
------------------------------------------------------------------------------
2. nginx为什么比apache性能高?
(1)apache:
每一个连接,apache就会创建一个进程,每个进程内单线程,apache最多能创建256个进程。对于一个负载相对较高的网站来说,256的进程,也就是256个线程,因为线程处理请求时,是同步阻塞模式,接收请求之后,会一直等待该请求读取程序文件(IO)(同步),执行业务逻辑,返回客户端,所有操作完成之后才能处理下一个请求(阻塞)如果服务器已经达到256的极限,那么接下去的访问就需要排队这也就是为什么某些服务器负载不高的原因了。
(2)nginx:
nginx接收一个请求后,不会等待这个请求的文件读取操作完成之后才接收下一个请求,它不会等待这个请求的后续的处理结果。而是会马上循环处理下一个请求(不阻塞)。请求的程序文件执行完成之后,会主动通知该线程,不用你主动去等待或者轮询查看(异步)。最后返回给客户端。这样做,每个请求过来就不需要等待很长的时间排队,而是马上就能接收,开始进行处理了。等处理完成之后,会主动通知回调这个线程进行数据返回。
--------------------------------------------------------------------------------
3. 实现nginx全栈ssl, 任选一个第3方模块进行编译安装后,测试使用。
#自签名CA证书 cd /apps/nginx mkdir certs cd certs openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt CN #国家代码 Beijing #省份 Beijing #城市名称 magedu #公司名称 hr #部门 ca.magedu.org #通用名称 #自制key和csr文件 openssl req -newkey rsa:4096 -nodes -sha256 -keyout www.magedu.org.key -out www.magedu.org.csr CN Beijing Beijing magedu hr www.magedu.org #签发证书 openssl x509 -req -days 3650 -in www.magedu.org.csr -CA ca.crt -CAkey ca.key -CA createserial -out www.magedu.org.crt #合并CA和服务器证书成一个文件,注意服务器证书在前 cat www.magedu.org.crt ca.crt > www.magedu.org.pem #https配置 vim /etc/nginx/conf/conf.d/pc.conf #添加 server { listen 80; listen 443 ssl; ssl_certificate /apps/nginx/certs/www.magedu.org.pem; ssl_certificate_key /apps/nginx/certs/www.magedu.org.key; ssl_session_cache share:sslcache:20m; ssl_session_timeout 10m; root /data/nginx/html; } systemctl start nginx
#下载echo开源模块 cd /usr/loacl/src yum -y install git git clone https://github.com/openresty/echo-nginx-module.git cd nginx-1.18.0 ./configure \ --prefix=/apps/nginx \ --user=nginx --group=nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-pcre \
--without-http_rewrite_module \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module \ --with-http_perl_module \ --add-module=/usr/local/src/echo-nginx-module #指定模块源代码路径 make && make install vim /etc/nginx/conf/conf.d/pc.conf location /main { index index.html; default_type text/html; echo "hello world, main"; echo $remote_addr ; echo_location /sub1; echo_location /sub2; echo "took $echo_timer_elapsed sec for total.";
} location /sub1 { echo_sleep 1; echo sub1; } location /sub2 { echo_sleep 1; echo sub2; } systemctl start nginx
4. 解析nginx 负载均衡算法及使用场景,nginx如何实现会话粘性 。
#安装2台redis和mysql服务器 yum install redis yum install mysql-server systemctl enable --now mariadb mysql create user admin@'192.168.50.%' identified by '111111'; flush privileges; exit sed -I '/^bind /c bind 0.0.0.0' /etc/redis.conf systemctl enable --now redis #配置1台nginx服务器 vim /etc/nginx/nginx.conf #插入 stream { upstream redis_server { hash $remote_addr consistent; server 192.168.50.100:6379 max_fails=3 fail_timeout=30s; server 192.168.50.200:6379 max_fails=3 fail_timeout=30s; } upstream mysql-server { least_conn; server 192.168.50.100:3306 max_fails=3 fail_timeout=30s; } server { listen 192.168.50.1:3306; proxy_connect_timeout 6s; proxy_timeout 15s; proxy_pass mysql_server; } server { listen 192.168.50.1:6379; proxy_connect_timeout 3s; proxy_timeout 3s; proxy_pass redis_server; } } systemctl start nginx
5. keepalived结合nginx/haproxy实现高可用VIP。要求nginx进程不在线自动拉起来,进程拉不起来,vip飘走。keepalived使用3个节点,并生成3个VIP。
#在三个ka1、ka2、ka3先实现haproxy的配置 vim /etc/haproxy/haproxy.cfg #添加 listen magedu_http bind 192.168.50.10:80 server web1 192.168.50.11:80 check server web2 192.168.50.12:80 check server web3 192.168.50.13:80 check #在3个ka1、2、3三个节点启用内核参数 vim /etc/sysctl.conf net.ipv4.ip_nonlocal_bind=1 sysctl -p vim /etc/keepalived/keepalived.conf router_id ka1.admin.org #在另外2个节点为 ka2.admin.org ka3.admin.org #定义脚本 vrtrp_script check_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 1 weight -30 fail 3 rise 2 timeout 2 } vrtrp_instance VI_1 { state MASTER #另外2个节点为BACKUP interface eth0 virtual_router_id 66 priority 100 #另外2个节点为90,80 advert_int 1 virtual_ipaddress { 192.168.50.10/24 dev eth0 label eth0:1 } track_interface { eth0 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_default "/etc/keepalived/notify.sh fault" track_script { check_haproxy #调用上面定义的脚本 } } yum install psmisc -y vim /etc/keepalived/check_haproxy.sh #!/bin/bash /usr/bin/killall -0 haproxy || systemctl restart haproxy chmod a+x /etc/keepalived/check_haproxy.sh systemctl start haproxy keepalived
6. 如何解决keepalived脑裂问题。
1#关闭防火墙、路由策略 2#增加第三方脚本 vim /etc/keepalived/keepalived.conf #插入 vrtrp_script check_local { script "/root/check_gateway.sh" interval 5 } track_script{ check_local } #增加脚本 vim /root/check_gateway.sh #!/bin/sh VIP=$1 GATEWAY=192.168.50.1 /sbin/arping -I em1 -c 5 -s $VIP $GATEwAY &>/dev/null
7. nginx常见模块有哪些?
(1)核心模块:是nginx服务器正常运行必不可少的模块,提供错误日志记录配置文件解析、事件驱动机制、进程管理等核心功能
(2)标准HTTP模块:提供HTTP协议解析相关的功能,比如:端口配置、网页编码设置、HTTP响应头设置等等。
(3)可选HTTP模块:主要用于扩展标准的HTTP功能,让nginx能处理一些特殊的服务,比如:Flash多媒体传输、解析GeoIP请求、网络传输压缩,安全协议SSL支持等。
(4)邮件服务模块:主要用于支持nginx的邮件服务,包括对POP3协议、IMAP协议和SMTP协议的支持。
(5)stream服务模块:实现反向代理功能,包括TCP协议代理
(6)第三方模块:是为了扩展nginx服务器应用,完成开发者自定义功能,比如:json支持,lua支持等。