发布信息

如何构建高效安全的 Nginx Web 服务器?看这篇就够了

作者:软荐小编      2024-07-19 14:02:49     89

摘要:Web服务是互联网上暴露最多的服务,选择合适的软件搭建Web服务器,使自己的Web服务器支持高并发服务、抵御外部攻击是提供互联网服务时需要面对的长期问题。本文作者根据自身的实践经验,搭建了高效、安全的Nginx Web服务器。

1.为什么选择Nginx搭建Web服务器

Apache 和 Nginx 是目前使用最广泛的两个 Web 服务器。Apache 出现的时间比 Nginx 早。Apache HTTP Server(简称 Apache)是全球排名第一的 Web 服务器软件,音译为 Apache,是 Apache 软件基金会的开源 Web 服务器,几乎可以在所有计算机平台上运行。其次,凭借其开放的 API 接口,任何组织或个人都可以在其上扩展和添加各种所需的功能,实现定制化功能。

Nginx(“engine x”)是一款高性能 HTTP 和反向代理服务器,同时也是一款 IMAP/POP3/SMTP 代理服务器。Nginx 由 Igor Sysoev 为俄罗斯访问量第二大的网站 Rambler.ru 开发,第一个公开版本 0.1.0 于 2004 年 10 月 4 日发布。它以类似 BSD 的许可证形式发布其源代码,并以其稳定性、丰富的功能集、示例配置文件和低系统资源消耗而闻名。

在互联网发展的早期,网站规模并不是很大,访问量也很少,一个网站的最大访问量每天也就几万个 IP 地址。那时候,Apache 完全可以满足需求,人们为其开发了各种模块,比如重写模块、访问控制列表、缓存模块等。然而随着互联网的飞速发展,网站的访问量成倍增长,大型网站除了硬件投入增加外,典型的 Web 服务器 Apache 已经无法应付。然而,Apache 并不完美,已经不再适合大型系统。

为什么呢?因为它的处理模式虽然简单灵活,但是并不适合大规模,特别是处理像PHP这种需要大量内存的应用代码的时候。于是Nginx开始崛起,最初的设计是俄罗斯工程师为了解决大型网站的高并发而设计的。所以高并发注定是它永远的优势。第二是反向代理,现在大型网站都有详细的分工,哪些服务器处理数据流,哪些服务器处理静态文件,谁来指挥这些,一般都会使用nginx反向代理到内网服务器,起到负载均衡和分流的作用。再次,nginx在设计上是高度模块化的,写模块比较简单。

Nginx 是一个高性能的 Web 和反向代理服务器,具有许多优秀的功能:

作为 Web 服务器:与 Apache 相比,Nginx 占用资源更少,支持并发连接数更多,效率更高,这让 Nginx 特别受虚拟主机提供商的青睐。它最多可以支持 50000 个并发连接,这要感谢 Nginx 为我们选择了 epoll 和 kqueue 作为开发模型。

作为负载均衡服务器:Nginx 内部可以直接支持 Rails 和 PHP,也可以作为 HTTP 代理服务器对外提供服务。Nginx 是用 C 编写的web代理服务器软件,系统资源开销和 CPU 效率比 Perlbal 好很多。

Nginx的安装非常简单,配置文件非常简洁(还支持perl语法),服务器的bug也非常少:Nginx的启动非常容易,而且几乎可以7*24不停的运行,即使运行几个月也不需要重新启动。还可以在不中断服务的情况下升级软件版本。

二、Nginx 安装 1、安装说明

系统环境:CentOS-6.6

软件:nginx-1.8.0.tar.gz

安装方式:源码编译安装

安装位置:/opt/program/nginx-1.8.0

下载链接:

2.安装所需软件

# yum install gcc-c++
# yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
# find -name nginx
#./nginx
#./nginx/sbin/nginx
#./nginx-1.2.6/objs/nginx

检查系统上安装的Nginx:

卸载原有的Nginx

# yum remove nginx

3.安装编译

将安装包文件上传至/opt/software目录,并执行以下操作:

# cd /opt/program
# mkdir nginx
# tar -zxvf ../software/nginx-1.8.0.tar.gz
# cd nginx-1.8.0
# ./configure --prefix=/opt/program/nginx


注意:这是安装Nginx的目录,大多数用户习惯安装在/usr/local/nginx下

# make 编译
# make install 安装

4.配置服务项目

修改防火墙配置:
# vi + /etc/sysconfig/iptables
添加配置项
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
重启防火墙
# service iptables restart

5. 开始

方法 1

# /opt/program/nginx/sbin/nginx -c /opt/program/nginx/sbin/nginx/conf/nginx.conf

方法 2

# /opt/program/nginx/sbin/nginx
查询nginx主进程号
# ps -ef | grep nginx
强制停止
# pkill -9 nginx
重启
# /opt/program/nginx/sbin/nginx -s reload
测试
# netstat –na|grep 80
#浏览器中测试
http://ip:80

三、配置Nginx支持高并发1、Nginx常规优化

编辑nginx.conf,修改相关参数进行优化。

worker_processes 8;

Nginx 进程数建议根据 CPU 数量指定,通常是 CPU 数量的倍数(比如 2 个四核 CPU 算作 8 个)。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_rlimit_nofile 65535;

该指令指的是Nginx进程打开的最大文件描述符数。理论值应该是打开的最大文件描述符数。

文件数(ulimit -n)是除以 nginx 进程数得到的,但是 Nginx 并不是均匀分配请求的,所以最好和 ulimit -n 的值保持一致。现在 Linux 2.6 内核的打开文件数是 65535,所以 worker_rlimit_nofile 也要相应地填入 65535。

worker_connections 65535;

每个进程允许的最大连接数,理论上每个nginx服务器的最大连接数为worker_processes*worker_connections。keepalive_timeout 60;keepalive超时时间。

client_header_buffer_size 4k;

客户端请求头的缓冲区大小可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,但由于系统分页一般都大于1k,所以这里就设置为分页大小。

open_file_cache max=65535 inactive=60s;

这将指定打开文件的缓存。默认情况下不启用。max 指定缓存的数量。建议与打开文件的数量一致。inactive 指的是如果文件没有被请求,缓存会在多长时间后被删除。

open_file_cache_valid 80s;

这是指检查缓存中有效信息的频率。

open_file_cache_min_uses 1;
open_file_cache 指令中的inactive

参数时间内文件的最小使用次数。如果超过此次数,则文件描述符始终在缓存中打开。例如,在上面的例子中,如果文件在非活动时间内未使用一次,则会被删除。

2. 内核参数优化

编辑sysctl.conf来优化Linux内核。

net.ipv4.tcp_max_tw_buckets = 6000

timewait的次数,默认是180000。

net.ipv4.ip_local_port_range = 1024 65000

系统允许开放的端口范围。

net.ipv4.tcp_tw_recycle = 1

启用timewait快速回收。

net.ipv4.tcp_tw_reuse = 1

启用重用。允许 TIME-WAIT 套接字被新的 TCP 连接重用。

net.ipv4.tcp_syncookies = 1

启用 SYN cookies。当 SYN 等待队列溢出时,启用 cookies 来处理。

net.core.somaxconn = 262144

Web应用中listen函数的backlog会默认限制我们的内核参数net.core.somaxconn为128,而nginx定义的NGX_LISTEN_BACKLOG默认值是511,所以需要调整这个值。

net.core.netdev_max_backlog = 262144

当每个网络接口接收数据包的速度比内核处理数据包的速度快时,允许发送到队列的最大数据包数。

net.ipv4.tcp_max_orphans = 262144

系统中未与任何用户文件句柄关联的 TCP 套接字的最大数量。如果超过此数量,孤立连接将立即重置并打印警告消息。此限制仅用于防止简单的 DoS 攻击。不要过分依赖它或人为地降低此值。您应该增加此值(如果您增加内存)。

net.ipv4.tcp_max_syn_backlog = 262144

记录的但是还没有收到客户端确认消息的最大连接请求数。对于128M内存的系统默认值为1024,对于内存更小的系统默认值为128。

net.ipv4.tcp_timestamps = 0

时间戳可防止序列号回绕。1Gbps 链路必然会遇到以前使用过的序列号。时间戳允许内核接受此类“异常”数据包。需要关闭此功能。

net.ipv4.tcp_synack_retries = 1

为了打开到另一端的连接,内核需要发送一个 SYN 和一个响应前一个 SYN 的 ACK。这就是所谓三次握手中的第二次握手。此设置决定了内核在放弃连接之前发送的 SYN+ACK 数据包的数量。

net.ipv4.tcp_syn_retries = 1

内核放弃建立连接之前要发送的 SYN 数据包的数量。

net.ipv4.tcp_fin_timeout = 1

如果套接字被本地端关闭web代理服务器软件,此参数决定它停留在 FIN-WAIT-2 状态的时间。另一端可以犯错误并且永远不会关闭连接,甚至意外崩溃。默认值为 60 秒。2.2 内核的常用值为 180 秒。您可以将其设置为此值,但请记住,即使您的机器是负载较轻的 Web 服务器,也存在因大量死套接字而导致内存溢出的风险。FIN-WAIT-2 比 FIN-WAIT-1 危险性小,因为它最多只能消耗 1.5K 内存,但它们的寿命更长。

net.ipv4.tcp_keepalive_time = 30

启用 keepalive 时,TCP 发送 keepalive 消息的频率。默认值为 2 小时。

经过上述优化之后,Nginx可以支持5万以上的并发请求。

4.Nginx 安全配置

网上关于Nginx安全配置的方法太多了,本文根据你的实际环境选择适合自己的Nginx安全配置策略。

1.删​​除所有不必要的Nginx模块

通过直接从源代码编译 Nginx 来最小化模块数量。通过限制仅访问 Web 服务器可以使用的模块来最小化风险。例如,要禁用 SSL 和自动索引模块,您可以执行以下命令:

#./configure –without-http_autoindex_module –without-http_ssi_module
# make
# make install

使用以下命令查看在编译Nginx服务器时可以启用或禁用哪些模块:

#./configure –help | less

然后禁用您不需要的 Nginx 模块。

2. 安装 SELinux 策略来强化 Nginx Web 服务器

默认的SELinux不会保护Nginx Web服务器。我在这里将安装并编译保护软件。

安装编译SELinux所需的环境支持

# yum -y install selinux-policy-targeted selinux-policy-devel

下载 SELinux 策略来强化 Nginx 网络服务器。

# cd /opt
# wget ‘http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz?use_mirror=nchc’

解压并编译文件

# tar -zxvf se-ngix_1_0_10.tar.gz

编译文件
# cd se-ngix_1_0_10/nginx
# make

输出如下:

Compiling targeted nginx module
/usr/bin/checkmodule: loading policy configuration from tmp/nginx.tmp
/usr/bin/checkmodule: policy configuration loaded
/usr/bin/checkmodule: writing binary representation (version 6) to tmp/nginx.mod
Creating targeted nginx.pp policy package
# rm tmp/nginx.mod.fc tmp/nginx.mod

安装生成的 nginx.pp SELinux 模块:

# /usr/sbin/semodule -i nginx.pp

3.控制缓冲区溢出攻击

编辑 nginx.conf 以设置所有客户端的缓冲区大小限制。

# vi /usr/local/nginx/conf/nginx.conf
编辑和设置所有客户端缓冲区的大小限制如下:
## Start: Size Limits & Buffer Overflows ##
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
## END: Size Limits & Buffer Overflows ##

4.控制并发连接

相关内容 查看全部