当前位置: 首页 > Linux

搭建高效安全的NginxWeb服务器

时间:2023-04-06 01:43:02 Linux

摘要:Web服务是互联网上暴露最多的服务。选择合适的软件搭建web服务器,让你的web服务器能够支持高并发服务,抵御外部攻击,是提供互联网服务需要长期面对的问题。本文作者根据自己的实践经验搭建了一套高效安全的NginxWeb服务器。1、为什么选择Nginx搭建web服务器?Apache和Nginx是目前最流行的两种Web服务器。Apache出现的时间早于Nginx。ApacheHTTPServer(简称Apache)是世界排名第一的网络服务器软件,音译为Apache,是Apache软件基金会开源的网络服务器,几乎可以运行所有的计算机平台,其开放的API接口,任何组织个人可以在上面扩展和添加各种需要的功能,实现为自己量身定做的功能。Nginx(“enginex”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx由IgorSysoev开发,用于俄罗斯访问量第二大的Rambler.ru网站。第一个公共版本0.1.0于2004年10月4日发布。它在类BSD许可下发布其源代码,并以其稳定性、丰富的功能集、示例配置文件和低系统资源消耗而著称。在互联网发展初期,网站的规模不是很大,访问量也很轻。一个网站的访问量最多一天几万个IP。这时候Apache就完全可以满足需求了。人们为它开发了各种模块,比如Rewrite模块、访问控制列表、缓存模块等等。然而,随着互联网的飞速发展,网站的访问量呈几何级数增长。大型网站除了加大硬件投入外,典型的网络服务器Apache此时也无能为力;但Apache并不完美,不再适合大型系统。为什么?因为他的进程模式虽然简单灵活,但是不适合大规模,尤其是在处理像PHP这种需要大量内存的应用代码时。于是Nginx开始兴起。最初的设计是俄罗斯工程师为了解决大型网站的高并发而设计的。所以就注定了高并发是它永远的优势。第三个是反向代理。现在大型网站都有详细的分工。哪些服务器处理数据流,哪些服务器处理静态文件。谁指挥他们一般使用nginx反向代理到内网服务器,起到负载均衡和分流的作用。再次,nginx具有高度模块化的设计,编写模块相对简单。Nginx是一个高性能的web和反向代理服务器,它有很多非常优越的特性:作为web服务器:Nginx与Apache相比,使用的资源更少,支持更多的并发连接,体现出更高的效率,这使得Nginx特别受到web的欢迎托管服务提供商。它可以支持最多50,000个并发连接的响应。感谢Nginx选择epoll和kqueue作为我们的开发模型。作为负载均衡服务器:Nginx可以对内直接支持Rails和PHP,也可以作为HTTP代理服务器支持对外服务。Nginx是用C写的,在系统资源开销和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下载地址:http://nginx.org/en/download....2。安装所需软件#yuminstallgcc-c++#yum-yinstallzlibzlib-developensslopenssl--develpcrepcre-devel#find-namenginx#./nginx#./nginx/sbin/nginx#./nginx-1.2.6/objs/nginx查看系统中安装的Nginx:卸载原来的Nginx#yumremovenginx3,安装编译上传安装包文件到/opt/software中执行以下操作:#cd/opt/program#mkdirnginx#tar-zxvf../software/nginx-1.8.0.tar.gz#cdnginx-1.8.0#./configure--prefix=/opt/program/nginx注意:这里是指定安装目录Nginx的,大部分用户习惯安装在/usr/local/nginx下iptables添加配置项-AINPUT-mstate--stateNEW-mtcp-ptcp--dport80-jACCEPTrestartfirewall#serviceiptablesrestart5,启动方法1#/opt/program/nginx/sbin/nginx-c/opt/program/nginx/sbin/nginx/conf/nginx.conf方法2#/opt/program/nginx/sbin/nginx查询nginx主进程数字#ps-ef|grepnginxforcestop#pkill-9nginxrestart#/opt/program/nginx/sbin/nginx-sreloadtest#netstat–na|grep80#在浏览器中测试http://ip:80三、配置Nginx支持高并发1、Nginx例程优化编辑nginx.conf,修改相关参数优化worker_processes8;Nginx进程号,建议按照CPU号指定,一般是它的倍数(比如2个四核CPU算8个)。worker_cpu_affinity0000000100000010000001000000100000010000001000000100000010000000;worker_rlimit_nofile65535;该指令指的是一个Nginx进程打开的最大文件描述符数。Nginx分配请求不是那么均匀,所以最好和ulimit-n的值保持一致。现在linux2.6内核下的打开文件数是65535,所以worker_rlimit_nofile应该相应填65535。worker_connections65535;每个进程允许的最大连接数,理论上每个nginx服务器的最大连接数是worker_processes*worker_connections。keepalive_timeout60;保活超时。client_header_buffer_size4k;客户端请求头的缓冲区大小,可以根据你系统的分页大小来设置,一般一个请求头的大小不会超过1k,但是由于一般系统分页都大于1k,所以设置为分页这里的大小。open_file_cachemax=65535inactive=60s;这里会为打开的文件指定缓存,默认不启用,max指定缓存的个数,建议与打开文件的个数保持一致,inactive是指文件在删除前多长时间未被请求缓存。open_file_cache_valid80秒;这是指多久检查一次缓存的有效信息。open_file_cache_min_uses1;在open_file_cache命令中的非活动参数时间内文件被使用的最少次数。如果超过这个数字,文件描述符总是在缓存中打开。如上例,如果一个文件在非活动时间内没有被使用一次,它将被删除。2.内核参数优化编辑sysctl.conf,优化linux内核。net.ipv4.tcp_max_tw_buckets=6000timewait个数,默认180000。net.ipv4.ip_local_port_range=102465000系统允许开放的端口范围。net.ipv4.tcp_tw_recycle=1启用timewait快速回收。net.ipv4.tcp_tw_reuse=1启用重用。允许TIME-WAIT套接字重新用于新的TCP连接。net.ipv4.tcp_syncookies=1启用SYNCookies,当SYN等待队列溢出时,启用cookies来处理。net.core.somaxconn=262144web应用中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,然后发送一个ACK??以响应前一个SYN。这是所谓的三次握手中的第二次握手。此设置确定在内核放弃连接之前发送的SYN+ACK数据包的数量。net.ipv4.tcp_syn_retries=1在内核放弃建立连接之前要发送的SYN数据包数。net.ipv4.tcp_fin_timeout=1如果socket被本端请求关闭,这个参数决定了保持FIN-WAIT-2状态的时间。对等方可能会出错而永远不会关闭连接,甚至会意外崩溃。默认值为60秒。2.2内核通常的值是180秒,3你可以按这个设置,但是记住即使你的机器是轻载的WEB服务器,也有大量deadsockets导致内存溢出的风险,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和autoindex模块,您可以执行以下命令:#./configure–without-http_autoindex_module–without-http_ssi_module#make#makeinstall使用以下命令查看编译Nginx时可以打开或关闭哪些模块服务器:#./configure--help|less然后禁用你不需要的Nginx模块。2.安装SELinux策略加强NginxWeb服务器。默认的SELinux不会保护NginxWeb服务器。我将在这里安装和编译保护软件。安装编译SELinux所需的环境支持#yum-yinstallselinux-policy-targetedselinux-policy-devel下载SELinuxpolicy以加强Nginxwebserver。#cd/opt#wget'http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz?use_mirror=nchc'解压编译文件#tar-zxvfse-ngix_1_0_10.tar.gz编译文件#cdse-ngix_1_0_10/nginx#make会输出如下:Compilingtargetednginxmodule/usr/bin/checkmodule:loadingpolicyconfigurationfromtmp/nginx.tmp/usr/bin/checkmodule:policyconfigurationloaded/usr/bin/checkmodule:将二进制表示(版本6)写入tmp/nginx.mod创建目标nginx.pp策略包#rmtmp/nginx.mod.fctmp/nginx.mod安装生成的nginx.ppSELinux模块:#/usr/sbin/semodule-inginx.pp3.控制缓冲区溢出攻击编辑nginx.conf为所有客户端设置缓冲区大小限制。#vi/usr/local/nginx/conf/nginx.conf如下编辑和设置所有客户端缓冲区的大小限制:##Start:SizeLimits&BufferOverflows##client_body_buffer_size1K;client_header_buffer_size1k;client_max_body_size1k;large_client_header_buffers21k;##结束:大小限制和缓冲区溢出##4。控制并发连接数使用NginxHttpLimitZone模块在特殊情况下限制指定会话或IP地址的并发连接数。编辑nginx.conf:limit_zonelimits$binary_remote_addr5m;limit_conn限制5;以上表示每个远程IP地址的客户端不能同时打开超过5个连接。5.限制可用的请求方式GET和POST是互联网上最常用的方式。Web服务器的方法在RFC2616中定义。如果Web服务器不需要启用所有可用方法,则应禁用它们。以下指令将过滤仅允许GET、HEAD和POST方法:##仅允许这些请求方法##if($request_method!~^(GET|HEAD|POST)$){return444;}##不接受DELETE、SEARCH等方法##6。拒绝某些用户代理您可以轻松阻止用户代理,例如滥用您的服务器的扫描仪、机器人和垃圾邮件发送者。##阻止下载代理##if($http_user_agent~*LWP::Simple|BBBike|wget){return403;}##阻止搜搜和有道机器人:##阻止一些机器人##if($http_user_agent~*Sosospider|YodaoBot){return403;}7.防止图片盗链图片或HTML盗链是指有人直接使用你网站的图片地址,在他的网站上展示。最终结果,您需要为宽带支付额外费用。它需要被阻止并防止盗链。#停止深度链接或热链接location/images/{valid_referersnoneblockedwww.example.comexample.com;if($invalid_referer){return403;}}8.在防火墙级别限制每个IP的连接数。Web服务器必须监控连接数和每秒连接数限制。PF和Iptales都能够在最终用户访问到达您的Nginx服务器之前阻止它。LinuxIptables:限制每次Nginx连接数下面的例子将在60秒内阻止超过15个从一个IP到80端口的连接。#/sbin/iptables-AINPUT-ptcp–dport80-ieth0-mstate–stateNEW-mrecent–set#sbin/iptables-AINPUT-ptcp–dport80-ieth0-mstate–state新-mrecent--update--seconds60--hitcount15-jDROPserviceiptablessave我设置同一个IP在60秒内只允许10个Nginx连接。9:配置操作系统保护web服务器。Nginx程序一般以nginx用户运行。但根目录(/nginx或/usr/local/nginx/html)不应设置为属于用户nginx或对用户nginx可写。要查找权限错误的文件,可以使用以下命令:#find/nginx-usernginx#find/usr/local/nginx/html-usernginx确保将所有权更改为root或其他用户,典型的权限设置/usr/local/nginx/html/ls-l/usr/local/nginx/html/示例输出:-rw-r–r–1rootroot925Jan300:50error4xx.html-rw-r–r–1rootroot52Jan310:00error5xx.html-rw-r–r–1rootroot134Jan300:52index.html删除由vi或其他文本编辑器创建的备份文件:#find/nginx-name'.?*'-not-name.ht*-or-name'*~'-or-name'*.bak*'-or-name'*.old*'#find/usr/local/nginx/html/-name'.?*'-not-name.ht*-or-name'*~'-or-name'*.bak*'-or-name'*.old*'通过-delete选项删除这些文件查找命令。10.限制传出的Nginx连接黑客会使用wget等工具在您的服务器上下载本地文件。使用nginx用户的Iptables来阻止传出连接。ipt_owner模块尝试匹配本地生成的数据包的发起者。在下面的例子中,只允许用户user在外面使用80个连接。#/sbin/iptables-AOUTPUT-oeth0-mowner–uid-ownervivek-ptcp–dport80-mstate–stateNEW,ESTABLISHED-jACCEPT5.总结Web服务器,希望对你有所帮助。Nginx是一个很好的工具和工具。Nginx的功能不仅仅局限于搭建web服务器。它更多的功能还有待大家去开发。期待Nginx能给我们带来更多的惊喜。欢迎大家关注我的微信公众号【移民哥技术之路】,最新2TB技术干货:包括架构师实战教程、大数据、Docker容器、系统运维、数据库、redis、MogoDB、电子书,Java基础课程,Java实战项目,ELKStack,机器学习,BAT面试精讲视频等。只需在“打工哥技术之路”微信公众号对话框回复关键字:1024即可获取全部资料.

猜你喜欢