Nginx学习中
Nginx简介
nginxi是一个高性能http和反向代理web服务器,简单来说就是一个中转转发服务器。
相关概念
正向代理
客户端想要浏览不可访问的互联网时,需要通过配置代理服务器,通过连接到代理服务器去访问目标互联网,整个过程就叫正向代理。
反向代理
客户端不清楚代理服务器的存在,往反向代理服务器发送请求,反向代理服务器自动选择服务器,去对应的互联网/服务获取所需要的资源,通过反向代理服务器返回到客户端。向服务隐藏了真实服务器地址。
负载均衡
将请求(负载)分发到多个服务器上就叫负载均衡
动静分离
浏览器获取的资源分为动态资源和静态资源
动态资源:需要与数据库交互获取的资源(servlet,jsp)
静态资源:不需要与数据库进行交互,写死不变的资源(html,css,js)
在获取这两项资源的时候,可以到存放了该资源的不同服务器去获取对应的资源而不是同一个服务器获取。
配置
/nginx/conf/nginx.conf
包含三部分内容
(1)全局块:配置服务器整体运行的配置指令
比如 worker_processes 1;处理并发数的配置
(2)events 块:影响 Nginx 服务器与用户的网络连接
比如 worker_connections 1024; 支持的最大连接数为 1024
(3)http 块
还包含两部分: http 全局块 ,server 块
反向代理
监听80端口,访问www.123.com实际访问127.0.0.1:8080
访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081
访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082
负载均衡
在http块设置upstream myserver
nginx默认负载均衡方式是轮询
轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
weight:weight 代表权,重默认为 1,权重越高被分配的客户端越多
ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
动静分离
通过配置location直接访问静态资源,不需要到tomcat
proxy_pass
路径匹配
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。
下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。
第一种:
会被代理到http://127.0.0.1:81/test.html 这个url
location /proxy/ {
proxy_pass http://127.0.0.1:81/;
}
第二咱(相对于第一种,最后少一个 /)
会被代理到http://127.0.0.1:81/proxy/test.html 这个url
location /proxy/ {
proxy_pass http://127.0.0.1:81;
}
第三种:
会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。
location /proxy/ {
proxy_pass http://127.0.0.1:81/ftlynx/;
}
第四种情况(相对于第三种,最后少一个 / ):
会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url
location /proxy/ {
proxy_pass http://127.0.0.1:81/ftlynx;
}
总结:只要url后带了/,匹配路径就不会往下代理,把未匹配的url往下代理
请求头
使用nginx的proxy_pass指令时,请求头可能会丢失。
当使用proxy_pass将请求转发到后端服务器时,nginx会根据配置的proxy_pass指令将请求转发到指定的后端服务器。在这个过程中,nginx可能会修改或删除一些请求头,包括Upgrade头。
这是因为nginx作为代理服务器,需要对请求进行转发和修改以满足特定的需求。在某些情况下,nginx可能会删除或修改一些请求头,以确保请求能够正确地到达后端服务器。
如果您需要保留完整的请求头,您可能需要考虑使用其他代理服务器或负载均衡器,或者在nginx配置中进行特定的设置来保留请求头。具体的方法取决于您的具体需求和nginx的配置。
实战:使用websocket时,经过多层nginx,一直链接都是405,经排查是上层nginx没有配置设置转发请求头
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass会把Upgrade请求头删掉,下面几层nginx即使配了转发请求头,也获取不到值,因为第一层nginx已经删除了该请求头,导致无法连接成功。
方案一:下层nginx写死Upgrade值
方案二:所有nginx都配置该配置
高可用
使用两个nginx服务器,利用主从复制的思想,使用keepalived软件
服务通过一个虚拟ip访问,虚拟ip绑定主服务器ip,通过keepalived脚本判断主服务器是否可用,是则使用主服务器完成服务,主服务器不可用时绑定ip到备用服务器,完成服务。
keepalived配置
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 java 课程系列
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}
check脚本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
原理
nginx分为master和worker进程,master只有一个,负责管理下面多个worker。
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程。
在任务到达master之后,下面的worker通过争抢机制去获取任务
优点
nginx通过nginx -s reload可以进行热部署,意思是不停止nginx使修改的配置生效。在多个worker的情况下,已经有任务的worker先不重新加载,尚未有任务的worker进行重新加载新的配置,等到有新的任务进来,就由新配置的worker去争夺,而原本有任务的worker等任务完成进行重新加载,这样可以实现不用停止nginx也可以更新配置,实现热部署。
如果有worker出现了问题,还有其他独立的worker还能继续进行争抢完成任务,不会使服务停止。
问题
连接数 worker_connection
1:发送请求,占用了 woker 的几个连接数?
答案:2 或者 4 个
http是短链接,请求静态资源时,一来一回两个连接,如果要请求动态资源,到tomcat一来一回也有两个连接,一共四个。所以答案是2或者4个。
2:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?
普通的静态访问最大并发数是: worker_connections * worker_processes /2, 而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections *
worker_processes/4。
3:worker的数量多少合适
每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
安装配置
1、下载源代码包
[root@web03 ~]# wget https://nginx.org/download/nginx-1.20.1.tar.gz
2、解压
[root@web03 ~]# tar -xf nginx-1.20.1.tar.gz
3、进入nginx目录并且设置系统配置参数
[root@web03 ~]#cd nginx-1.20.1
[root@web03 nginx-1.20.1]# ./configure --help
[root@web03 nginx-1.20.1]# ./configure --with-http_ssl_module --with-http_v2_module --with-stream
–with-http_ssl_module # 配置HTTPS时使用 --with-http_v2_module # 配置GOLANG语言时使用 --with-stream # 启用TCP/UDP代理服务
4.安装相关依赖
[root@web03 nginx-1.20.1]# yum install pcre pcre-devel -y
[root@web03 nginx-1.20.1]# yum install openssl openssl-devel -y
5.设置系统配置参数
./configure --with-http_ssl_module --with-http_v2_module --with-stream
6、开始编译
[root@web03 nginx-1.20.1]# make
7、安装
[root@web03 nginx-1.20.1]# make install
常见错误:
1、./configure: error: the HTTP rewrite module requires the PCRE library.
yum install pcre pcre-devel -y
2、./configure: error: SSL modules require the OpenSSL library.
yum install openssl openssl-devel -y
实践问题
1.nginx新增编译模块
//去到nginx文件解压目录,在编译参数后加上所需模块
./configure --with-stream --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module
//如果已经安装nginx,则用make只生成执行文件,如果未安装则用 make&&make install
make
// make后会在子目录objs下生成nginx文件,替换原来nginx文件
mv objs/nginx /usr/local/nginx/sbin```
2.nginx配置tcp转发(适用于流量转发和负载均衡)
//需要新增stream模块,与http同级
stream{
#日志
log_format proxy '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time -> $upstream_addr '
'$upstream_bytes_sent $upstream_bytes_received $upstream_connect_time';
access_log /usr/local/nginx/logs/tcp-access.log proxy;
server{
listen 80;
#不能加http
proxy_pass localhost:9999;
}