如何构建高效安全的 Nginx Web 服务器?看这篇就够了
创始人
2026-03-15 12:20:35
0次

摘要: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.控制并发连接

相关内容

热门资讯

大浪淘金APP黑幕揭秘:内盘操...   大浪淘金APP平台最隐蔽的黑幕,在于其完全封闭的内盘交易系统。这个看似与国际市场接轨的交易平台,...
告别固定工资实现财富自由?一品...   普通投资者被广告宣传诱导,注册就送现金,充值返现金券等等这些宣传方式,都是在引流到平台开户,不怕...
哈易购APP打着现货交易幌子搞...   网络上各类白银、铂金等贵金属投资广告铺天盖地,不少平台以"现货交易"为名,暗中却从事着非法期货交...
5元起投!高额收益?中国白银、...   上海华通白银国际交易中心有限公司(以下简称“华通白银国际”)打着“白银、铂金现货订购”的旗号,实...
"九州订购APP、起...   近年来,贵金属投资热度持续攀升,但乱象也随之而来。一些不法分子趁机搭建虚假交易平台,打着"低门槛...
坚锅淘金APP投资者频繁爆仓亏...   坚锅淘金APP对外宣称是贵金属现货交易平台,日常出入金看似畅通无阻,给人一种合规运营的假象。但事...
斗金订购APP“5元订购现货”...   斗金订购APP“5元订购现货”骗局揭秘:充值易、回本难,越陷越深!  许多投资人在未核实平台合规...
贵金属APP乱象曝光:&quo...   当前市场上部分贵金属类APP未取得正规交易资质,涉嫌误导消费者参与白银、铂金等商品的非合规交易!...
华通白银、银宝街APP被指虚假...   警惕现货白银投资陷阱:上海华通白银背后的平台涉嫌非法期货交易  近年来,各类现货白银交易平台以“...
充值送300,月入过万?别被量...   如今,网络上充斥着大量未经批准的贵金属及其他产品订购交易平台。这些平台普遍缺乏合法经营资质,却将...
鑫汇智投APP贵金属非法期货、...   鑫汇智投APP贵金属非法期货、人为控盘,大量投资者遭恶意收割  鑫汇智投APP长期以“低门槛、高...
矅光智策APP非法贵金属交易骗...   不少投资人在矅光智策APP上进行贵金属交易后出现了严重亏损。许多人在下载该平台时,根本不清楚其是...
飞鸽订购APP非法期货交易骗局...   飞鸽订购APP非法期货交易骗局,很多投资者根本没搞懂规则就盲目充值,买涨买跌跟买cai票一样!平...
天龙白银APP被操控的非法期货...   中小投资者在网络平台参与商品现货订购交易,表面看似合规合法,实则暗藏诸多难以察觉的风险。商品现货...
下载送试玩金?千万别碰!带你揭...   当前,许多贵金属APP交易平台正采用欺诈性营销手段。它们通过抖音等短视频平台,以“5元起投”“充...
泡泡淘金APP骗局:打着&qu...   泡泡淘金APP骗局:打着"商品订购"幌子,实则非法期货收割投资者!投资需谨慎,切勿轻信“高额回报...
南商云购APP虚假电子盘背后的...   南商云购是虚假电子盘吗?它是否具备合规的交易资质?这个曾经的"现货电子盘"如今摇身一变,披上了"...
警惕"祥龙订购&qu...   祥龙订购APP、掌上银牛APP等平台背后的运营方——四川禄宏商品现货市场有限公司,仅具备现货交易...
中国白银、华银:虚假宣传、后台...   中国白银APP宣称是上市公司“中国白银集团”与“上海华通白银国际交易中心”旗下的现货交易平台,提...
起底“优品订购”APP非法期货...   “优品订购”APP根本不具备任何合法的交易资质。其背后的运营方仅凭随便注册一家公司、开发一款交易...