nginx 详解

目录

web服务器和web应用服务器的区别

1、nginx的安装

一、安装所需要的依赖包

二、编译、安装

三、启动nginx、开机自启、查看nginx版本

2、nginx 平滑升级

3、四层代理和七层代理的区别?

4、Nginx负载均衡调度算法

5、负载均衡导致session丢失问题。

6、nginx负载均衡后端获取不到真实的客户端IP

7、Nginx常用模块类型

Nginx模块之HttpAuthBasic

Nginx模块之HttpGzip模块

Nginx模块之HttpGzipStatic

Nginx模块之HttpLimitReqest

8、nginx优化 

8、Nginx的root和alias

9、nginx优雅的显示错误界面

10、常见的负载均衡模块

11、名词介绍

12、nginx 日志优化

13、nginx版本漏洞探究

14、nginx不受影响的各个版


web服务器和web应用服务器的区别

web服务器:HTTP(超文本)超媒体()超文本传输协议(),实际上就是请求html页面,存在服务器磁盘上面的一个路径。

web应用服务器:为客户端提供业务逻辑

1、nginx的安装

一、安装所需要的依赖包

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

二、编译、安装

./configure --with-http_stub_status_module --with-http_ssl_module

make

make install

三、启动nginx、开机自启、查看nginx版本

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

nginx 本身启动 默认配置文件就是 /usr/local/nginx/conf/nginx.conf (不加-c也可以)。

echo "//usr/local/nginx/sbin/nginx" >> /etc/rc.local

chmod 755 /etc/rc.d/rc.loacl    

/usr/local/nginx/sbin/nginx -V

2、nginx 平滑升级


https://nginx.org/download/  nginx 下载地址

一、升级前工作:备份、记得一定要备份,为了安全。。。

    1、mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_`date +%Y_%m_%d`_bak

    2、cp -r /usr/local/nginx /usr/local/nginx_`date +%Y_%m_%d`.bak

二、基本上面两部分备份完成之后,就可以准备升级工作了。。。。 

wget https://nginx.org/download/nginx-1.20.1.tar.gz

tar -xvf  nginx-1.20.1.tar.gz

#./configure --prefix=/usr/local/nginx --with-http_ssl_module
 

#./configure --prefix=/usr/local/nginx/  

#./configure --with-http_ssl_module

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

编译时需要带上旧版本的模块可以使用nginx -V查看

make   

make之后不要执行make install 要不然会覆盖之前的配置文件。

三、进入下载新的nginx里面将objs 下面的nginx  cp 到 /usr/local/nginx/sbin/  下

cp /software/nginx/nginx-1.22.0/objs/nginx  /usr/local/nginx/sbin/

/usr/local/nginx/sbin/nginx -t  

检测配置文件是否正常

发送信号user2给nginx老版本对应的进程

kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

平滑切换工作进程:如果新版本运行良好,可以通过发送WINCH信号给旧主进程,平滑关闭旧的工作进程,并让新的工作进程接管请求。命令如下

kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
 

发送信号quit给nginx老版本的进程

 kill -quit `more /usr/local/nginx/logs/nginx.pid.oldbin`

看是否升级成功

/usr/local/nginx/sbin/nginx -V 

nginx四层代理、支持七层代理

3、四层代理和七层代理的区别?

1).四层负载均衡 所谓四层负载均衡指的是OSI七层模型中的传输层,那么传输层Nginx已经能支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载均衡,那么它的好处是性能非常快、只需要底层进行应用处理,而不需要进行一些复杂的逻辑。

2).七层负载均衡 七层负载均衡它是在应用层,那么它可以完成很多应用方面的协议请求,比如我们说的http应用的负载均衡,它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则,所以在应用层的服务里面,我们可以做的内容就更多,那么Nginx则是一个典型的七层负载均衡SLB

4、Nginx负载均衡调度算法

1)轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

2)权重:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

3)ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

4)fair(第三方):按后端服务器响应时间来分配,时间短的优先分配。

5)url_hash(第三方):按访问url的hash结果来分配请求,使同样的url定向到同一个后端服务器,后端服务器为缓存时比较有效。

5、负载均衡导致session丢失问题。

session是用户的的一个会话信息,服务端和用户端通信需要一个访问认证,以及对健全处理的时候,给用户分配一串session信息。

解决方案 1:Session 保持

第一种方式是做 Session 保持,就是把负载均衡策略基于原有轮询数的基础上,改用 ip_hash、URL_hash 来解决。ip_hash 就是基于用户 IP 来做 hash,一个用户的请求统一分发到一台机器上。URL_hash 用于用户请求固定页面时,将用户请求固定到具体 后端 上,就保证了 Session 不会被丢失。

6、nginx负载均衡后端获取不到真实的客户端IP

后端获取到的是nginx的ip,如何解决呢,只需要加三行代码

配置后端代码可以获取到客户端的真实IP

location{

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

remote_addr 是一个 Nginx 的内置变量,它获取到的是 Nginx 层前端的用户 IP 地址,这个地址是一个 4 层的 IP 地址

TCP/IP 协议的用户 IP 地址(源地址)以 remote_addr 变量的方式赋值给 X-Real_IP 的自定义变量,后端直接通过 X-Real 获取 X-Real IP 信息,便可获取到用户地址。

7、Nginx常用模块类型

Nginx模块名称模块作用
ngx_http_autoindex_module用于自动生成目录列表.
ngx_http_access_module四层基于IP的访问控制,可以通过匹配客户端源IP地址进行限制
ngx_http_auth_basic_module可以使你使用用户名和密码基于 HTTP 基本认证方法来保护你的站点或其部分内容
ngx_http_stub_status_module状态统计模块
ngx_http_gzip_module文件的压缩功能
ngx_http_gzip_static_module静态压缩模块
ngx_http_ssl_modulenginx 的https 功能
ngx_http_rewrite_module重定向模块,解析和处理rewrite请求
ngx_http_referer_module防盗链功能,基于访问安全考虑
ngx_http_proxy_module将客户端的请求以http协议转发至指定服务器进行处理
ngx_stream_proxy_moduletcp负载,将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module将客户端对Python的请求以uwsgi协议转发至指定服务器处理
ngx_http_headers_module可以实现对头部报文添加指定的key与值
ngx_http_upstream_module负载均衡模块,提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_stream_upstream_module后端服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理
ngx_http_flv_module为flv伪流媒体服务端提供支持

Nginx模块之HttpAccess模块

ngx_http_access_module 模块使有可能对特定IP客户端进行控制. 规则检查按照第一次匹配的顺序

.allow 描述的网络地址有权直接访问

deny 描述的网络地址拒绝访问

location / {

root /code;

index index.html;

allow 10.0.0.0/24;

deny 10.0.0.1;

deny all; 

上面的例子中,仅允许网段 10.0.0.0/24中除 10.0.0.1之外的ip访问。当执行很多规则时,最好使用 ngx_http_geo_module 模块.

Nginx模块之HttpAuthBasic

该模块可以使你使用用户名和密码基于 HTTP 基本认证方法来保护你的站点或其部分内容.

Nginx模块之HttpGzip模块

gzip 开启或者关闭gzip模块 syntax: gzip on|off default: gzip off context: http, server, location, if (x) location

Nginx模块之HttpGzipStatic

Nginx模块之HttpLimitReqest

本模块可以针对条件,进行会话的并发连接数控制。(例如:限制每个IP的并发连接数。)

8、nginx优化 

1、CPU亲和、worker进程数、调整nginx进程打开的文件句柄数

2、使用Epool网络模型、调整每个worker进程的最大连接数

3、文件的高效读取sendfile、nopush

4、文件的传输实时性、nodealy

5、开启tcp长连接,以及长连接超时时间keepalive_timeout

6、开启文件传输压缩gzip

7、开启静态文件expires缓存

8、隐藏nginx版本号

9、禁止通过ip地址访问,禁止恶意域名解析,只允许域名访问

10、配置防盗链、以及跨域访问

11、防DDOS、cc攻击,限制单IP并发连接,以及http请求

12、优雅显示nginx错误页面

13、nginx加密传输https优化

14、nginx proxy_cache、fastcgi_cache、uwsgi_cache 代理缓存,第三方工具(squid、varnish)

8、Nginx的root和alias

root与alias路径匹配主要区别在于nginx如何解释location后面的uri,

这会使两者分别以不同的方式将请求映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。

root的处理结果是:root路径+location路径

alias的处理结果是:使用alias定义的路径

9、nginx优雅的显示错误界面

#error_page配置的是http这种的网络地址

[root@666 conf.d]# cat error.conf

server { listen 80;

server_name linux.error.com;

location / {

root /code/error;

index index.html;

error_page 404 http://www.baidu.com;

}

}

10、常见的负载均衡模块

一、Nginx

工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;
Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
Nginx安装和配置比较简单,测试起来比较方便;
可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;
对后端服务器的健康检查,只支持通过端口来检测,不支持通过curl来检测。
Nginx对请求的异步处理可以帮助节点服务器减轻负载;
Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
不支持Session的直接保持,但能通过ip_hash来解决。对Big request header的支持不是很好,
支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
Nginx还能做Web服务器即Cache功能.

二.Haproxy

支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
支持url检测后端的服务器出问题的检测会有很好的帮助。
更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
不能做Web服务器即Cache。

三、LVS

抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
工作在网络第4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
应用范围比较广,可以对所有应用做负载均衡;
不支持正则处理,不能做动静分离。
支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
配置 复杂,对网络依赖比较大,稳定性很高。

11、名词介绍

集群:多台服务器在一起,实现同样的工作,当一台服务器出现故障,其他服务器继续提供服务。

负载均衡:将用户的请求平均的分配给后端的服务。

高可用:当一台机器不可用时,另一台接替它的工作,保证业务的高可用性 

12、nginx 日志优化

log_format  main_exp '{"时间":"$time_iso8601",'
              '"客户端外网地址":"$http_x forwarded for",'
              '"客户端内网地址":"$remote_addr",'
              '"状态码":$status,'
              '"传输流量":$body_bytes_sent,'
              '"跳转来源":"$http_referer",'
              '"URL": "$request",'
              '"浏览器":"$http_user_agent",'
              '"请求响应时间":$request_time,'
              '"后端地址":"$upstream_addr"]';

这个在http模块添加

13、nginx版本漏洞探究

nginx security advisories

All nginx security issues should be reported to security-alert@nginx.org.

Patches are signed using one of the PGP public keys.

  • NULL pointer dereference in HTTP/3
    Severity: major
    Advisory
    CVE-2024-24989
    Not vulnerable: 1.25.4+
    Vulnerable: 1.25.3

  • Use-after-free in HTTP/3
    Severity: major
    Advisory
    CVE-2024-24990
    Not vulnerable: 1.25.4+
    Vulnerable: 1.25.0-1.25.3

  • Memory corruption in the ngx_http_mp4_module
    Severity: medium
    Advisory
    CVE-2022-41741
    Not vulnerable: 1.23.2+, 1.22.1+
    Vulnerable: 1.1.3-1.23.1, 1.0.7-1.0.15
    The patch  pgp

  • Memory disclosure in the ngx_http_mp4_module
    Severity: medium
    Advisory
    CVE-2022-41742
    Not vulnerable: 1.23.2+, 1.22.1+
    Vulnerable: 1.1.3-1.23.1, 1.0.7-1.0.15
    The patch  pgp

  • 1-byte memory overwrite in resolver
    Severity: medium
    Advisory
    CVE-2021-23017
    Not vulnerable: 1.21.0+, 1.20.1+
    Vulnerable: 0.6.18-1.20.0
    The patch  pgp

  • Excessive CPU usage in HTTP/2 with small window updates
    Severity: medium
    Advisory
    CVE-2019-9511
    Not vulnerable: 1.17.3+, 1.16.1+
    Vulnerable: 1.9.5-1.17.2

  • Excessive CPU usage in HTTP/2 with priority changes
    Severity: low
    Advisory
    CVE-2019-9513
    Not vulnerable: 1.17.3+, 1.16.1+
    Vulnerable: 1.9.5-1.17.2

  • Excessive memory usage in HTTP/2 with zero length headers
    Severity: low
    Advisory
    CVE-2019-9516
    Not vulnerable: 1.17.3+, 1.16.1+
    Vulnerable: 1.9.5-1.17.2

14、nginx不受影响的各个版本

  • 对于CVE-2024-24989(HTTP/3中的NULL指针解引用)和CVE-2024-24990(HTTP/3中的使用后释放)的漏洞,1.25.4+版本是安全的。
  • 针对CVE-2022-41741和CVE-2022-41742(ngx_http_mp4_module中的内存损坏和内存泄露)的修复已包含在1.23.2+和1.22.1+版本中。
  • CVE-2021-23017(解析器中的1字节内存覆写)不影响1.21.0+和1.20.1+版本
  • 对于HTTP/2处理中的问题,如CVE-2019-9511、CVE-2019-9513、和CVE-2019-9516,1.17.3+和1.16.1+版本未受影响
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一个开源的容器化平台,用于轻松地打包、部署和运行应用程序。而Nginx是一个高性能的开源反向代理服务器,也是一个流行的Web服务器。 在使用Docker部署Nginx时,你需要以下几个步骤: 1. 首先,你需要安装Docker。你可以根据你的操作系统去官方网站下载并安装Docker。 2. 在安装完成后,你需要编写一个Dockerfile文件来定义Nginx容器的构建过程。一个简单的例子如下: ```dockerfile FROM nginx:latest COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` 这个Dockerfile使用最新版本的Nginx作为基础镜像,然后将自定义的`nginx.conf`文件复制到容器中的`/etc/nginx/nginx.conf`路径下。接着,将容器的80端口暴露出来,并设置Nginx以非守护进程的方式运行。 3. 在同一目录下创建`nginx.conf`文件,并在其中进行Nginx的相关配置。例如,可以指定Nginx监听的端口、代理规则等。 4. 接下来,使用Docker命令来构建镜像。在终端中切换到Dockerfile所在的目录,并执行以下命令: ``` docker build -t my-nginx . ``` 这个命令会根据Dockerfile构建一个名为`my-nginx`的镜像。注意最后的`.`表示Dockerfile所在的路径。 5. 构建完成后,你可以使用以下命令来运行Nginx容器: ``` docker run -d -p 80:80 my-nginx ``` 这个命令会在后台运行一个名为`my-nginx`的容器,并将主机的80端口映射到容器的80端口。 现在,你已经成功地使用Docker部署了Nginx。你可以通过在浏览器中访问`http://localhost`来验证Nginx是否正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值