WEB应用

Nginx发布1.9.0版本,新增支持TCP代理和负载均衡的stream模块

昨天在公司微信群,CTO分享了这个消息,对运维来说以后基于TCP协议的后端业务的高可用又多了一个新的选择,实在是棒极了! 一直以来,Nginx 并不支持tcp协议,所以后台的一些基于TCP的业务就只能通过其他高可用负载软件来完成了,比如Haproxy。 这算是一个nginx比较明显的缺憾。不过,在1.90发布后这个认知将得到改写: 2015-04-28 nginx-1.9.0 mainline version has been released, with the stream module for generic TCP proxying and load balancing. nginx-1.9.0 已发布,该版本增加了 stream 模块用于一般的 TCP 代理和负载均衡。 The ngx_stream_core_module module is available since version 1.9.0. This module is not built by default, it should be enabled with the --with-stream configuration parameter. ngx_stream_core_module 这个模块在1.90版本后将被启用。但是并不会默认安装,需要在编译时通过指定 --with-stream 参数来激活这个模块。 其他改进包括: Change: 删除过时的 aio 和 rtsig 事件处理方法 Feature: 可在 upstream 块中使用 "zone" 指令 Feature: 流模块,支持 TCP 代理和负载均衡 Feature: ngx_http_memcached_module 支持字节范围 Feature: Windows 版本支持使用共享内存,带随机化地址空间布局. Feature: "error_log" 指令可在 mail 和 server 级别 Bugfix: the "proxy_protocol" parameter of the "listen" directive did not work if not specified in the...
阅读全文
WEB应用

Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法

最近一直在帮一个购买了张戈博客付费服务的朋友做网站防护,为了简单抵挡一下竞争对手的DDoS攻击,他给网站开启了Incapsula的免费CDN服务。 开启CDN之后,我之前给他写的Shell防护脚本也就宣告无效了,因为不管是正常访问还是攻击访问,脚本拿到的IP都是CDN节点的,而我不可能把CDN的节点IP也给禁用了,那就都不能访问了。 为了解决这个窘迫,我想到了以前看过的Nginx访问限制。通过查资料,让我拜读了一枚大神的神作,感觉收获颇丰!于是转过来整理一下,分享给更多需要的人! Nginx 有2个模块用于控制访问“数量”和“速度”,简单的说,控制你最多同时有 多少个访问,并且控制你每秒钟最多访问多少次, 你的同时并发访问不能太多,也不能太快,不然就“杀无赦”。 HttpLimitZoneModule    限制同时并发访问的数量 HttpLimitReqModule      限制访问数据,每秒内最多几个请求 一、普通配置 什么叫普通配置? 普通配置就是针对【用户浏览器】→【网站服务器】这种常规模式的nginx配置。那么,如果我要对单IP做访问限制,绝大多数教程都是这样写的: 这样一个最简单的服务器安全限制访问就完成了,这个基本上你 Google 一搜索能搜索到  90% 的网站都是这个例子,而且还强调用“$binary_remote_addr”可以节省内存之类的云云。 二、CDN之后 目前国内已经争相出现了百度云加速、加速乐、360网站卫士以及安全宝等免费CDN。让我们这些小网站也能免费享受以前高大上的CDN加速服务。 于是,网站的访问模式就变为: 用户浏览器 → CDN节点 → 网站源服务器 甚至是更复杂的模式: 用户浏览器 → CDN节点(CDN入口、CC\DDoS攻击流量清洗等) → 阿里云盾 → 源服务器 可以看到,我们的网站中间经历了好几层的透明加速和安全过滤, 这种情况下,我们就不能用上面的“普通配置”。因为普通配置中基于【源IP的限制】的结果就是,我们把【CDN节点】或者【阿里云盾】给限制了,因为这里“源IP”地址不再是真实用户的IP,而是中间CDN节点的IP地址。 我们需要限制的是最前面的真实用户,而不是中间为我们做加速的加速服务器。 其实,当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入一个记录 X-Forwarded-For :  用户IP, 代理服务器IP 如果中间经历了不止一个代理服务器,这个记录会是这样 X-Forwarded-For :  用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, …. 可以看到经过好多层代理之后, 用户的真实IP 在第一个位置, 后面会跟一串中间代理服务器的IP地址,从这里取到用户真实的IP地址,针对这个 IP 地址做限制就可以了。 那么针对CDN模式下的访问限制配置就应该这样写: 三、echo模块 作者原文提到了nginx的一个echo模块,特意玩了下感觉挺有意思的,下面贴一下简单集成步骤。 ①、给nginx集成echo模块: ②、echo用法举例: 其实就和shell的echo差不多,能否输出自定义信息。 比如,在nginx里面配置如下: 访问http://yourdomain.com/hello 就会在浏览器里面输出hello, world! 了(如果域名开了CDN可能会报404)。 又比如,测试本文提到的真实用户的IP,只要在本文第二步配置基础上,加上如下规则并reload即可: 生效后,访问http://yourdomain.com/realip 就能显示你所用电脑(宽带)的真实IP了(可在ip138查验准确性): Ps:感兴趣又喜欢学习的童鞋可以看下相关wiki文档:http://wiki.nginx.org/HttpEchoModule 本文介绍到这就差不多结束了,也是在神作的基础上精简整理并测试的,如果看完还有些许疑问,请前往查看神作原文,也许还是大神写的比较好理解(是否是原创我就不深究了,感觉也是转来转去,都没留链接,悲哀的互联网)! 本文整理自【棒主妇开源】,原文地址:《网站安全配置(Nginx)防止网站被攻击》。
阅读全文
WEB应用

Linux+Nginx/Apache/Tomcat新增SSL证书,开启https访问教程

上上篇文章《nginx平滑升级&新增模块》提到了公司的https访问需求。当我新增了SSL模块之后,却发现以前还真没部署过https访问。 下面整理我的部署过程,并收集了一下Apache和Tomcat这2种Linux下常用的WEB软件配置SSL的简单简单步骤,以便回头翻阅。 一、下载证书 成功申请SSL证书之后,就可以下载到配置SSL的证书了!一般情况下,都可以选择下载相应WEB服务器的不同证书,或者直接打包下载主流WEB服务器的证书,如图所示: 下载后,就可以根据不同的WEB服务器来选择相应的证书了。 二、Nginx 先确认nginx安装时已编译http_ssl模块,也就是执行如下命令查看是否存在--with-http_ssl_module参数: 如果没有这个参数,说明没有编译SSL模块,那么请参考上上篇文章自行解决,此处就不赘述了。 ①、准备证书 Nginx需要用到2个证书文件: I.  证书公钥 (crt格式) II. 证书私钥(key格式) 拿到证书后,将其上传到nginx下的ssl目录(也可自定义位置)。 ②、修改配置 A. http和https全局共存 在原server模块新增监听443端口,然后新增如下代码(具体看注释)。 保存配置之后,先执行如下命令测试配置是否正确: 确认无误之后,执行如下命令重载nginx,让配置生效: 如无错误,现在应该可以顺利访问https://yourdomain.com/了!值得说明的是,这样配置后,http和https是全局共存的,你能http访问到的页面,https也可以访问得到。 B. 全局强制https 如果是全局https访问,那么额外写一个监听80的server,让http访问跳转到https上即可,下面是参考模板: C. 部分强制https,部分强制http 可能有部分强迫症会有这样的需求:我只要部分页面强制https访问,比如后台及登陆页面,其他常规页面强制http访问,我该如何设置? 思路:和B方案一样,分别2个server模块,并新增判断规则,指定部分页面http访问,部分页面https访问。 具体可以参考一下张戈博客的配置(主要修改中文注释部分,其他配置保持不变): 二、Apache 同样,先确认Apache安装时已添加SSL支持模块。如果没有请自行搜索搞定,本文不再赘述。 ①、准备证书 Apache需要用到三个证书文件: I. 根证书:root_bundle.crt II. 证书公钥:yourdomain.com.crt III. 证书私钥:yourdomain.com.key 将下载好的三个证书文件,上传到apache下的ssl目录中(可自定义位置)。 ②、修改配置 I. 编辑httpd.conf文件,取消以下内容的#注释符号: II. 编辑http-ssl.conf文件,如下修改: III. 保存退出,并重启Apache即可。 三、Tomcat ①、准备证书 Tomcat只需要用到一个jks格式的证书文件,比如yourdomain.com.jks。 拿到文件后,将其上传到Tomcat下的conf目录中。 ②、修改配置 打开conf目录下的server.xml文件,找到以下内容: 去掉前后的注释,并如下修改(或者直接其后添加以下代码亦可): 退出并保存,最后重启Tomcat即可。 四、解决警告 如果网页中存在不带https的资源,比如http协议的js、css或图片,那么访问这个https页面,某些浏览器(比如IE)就会发出警告,提示页面中存在不安全的内容,并且不会加载这些http协议的资源,导致页面错乱等问题: 解决办法: 方法①、使用相对地址 只要将这些http的资源链接,改为相对地址。比如原链接是<img src="http://yourdomain.com/images/demo.png">那么改成<img src="/images/demo.png">即可。 方法②、修改网站代码 如果是全局https访问,那么你将网站代码中的链接均改为https好了。如果是http和https混合的,那么准备2套网站文件也行。然后在nginx当中设置不同的root路径。 为了省事,我推荐方法①。 好了,本文就写到这,希望能解您的燃眉之急!
阅读全文
WEB应用

Nginx在线服务状态下平滑升级或新增模块的详细操作记录

今天,产品那边发来需求,说有个APP的IOS版本下载包需要新增https协议,在景安购买了免费的SSL证书。当我往nginx上新增ssl时,发现服务器上的nginx居然没编译SSL模块! 看了下旧版本nginx的configure选项: 可能是出于最小化安装的考虑,就只有一个prefix参数,而版本也挺低的,干脆就升级一下好了!由于服务器处于在线服务状态,为了避免升级带来的不良影响,我决定给nginx来个平滑升级,结果发现还真是如丝般顺滑。。。 下面记录一下平滑升级和新增模块的过程。 一、半自动平滑升级 所谓半自动,其实就是在最后迁移的时候使用源码自带的升级命令:make upgrade来自动完成。 ①、按需编译新版本的nginx 根据需求,常规编译新版本nginx,不过只要执行到make就打住,不要make install! ②、重命名nginx旧版本二进制文件,即sbin目录下的nginx(期间nginx并不会停止服务!): ③、然后拷贝一份新编译的二进制文件: ④、在源码目录执行make upgrade开始升级: 完成后,最后确认一下 nginx -V : 正常了,平滑升级成功! 二、纯手动平滑升级 纯手动模式,指的是在最后做迁移的时候,全部使用手动命令来搞定,避免编译可能存在不一致的参数啥的。 实际上,在make之后,我们可以查看nginx源码目录下的Makefile内容如下: 所以,说白了纯手动就是执行upgrade标签下的命令行而已,实际上只要确认Makefile下的命令路径都是正确的,用命令自动迁移是没有任何问题的。 总是有人会不放心的,喜欢手动一步一步的搞定,我也来整理下纯手动步骤: ①~③和半自动一样,按常规步骤先编译nginx,不过只执行到make就打住,然后将旧的sbin下的nginx文件移走,再将编译得到的objs目录下的nginx文件放到原来的sbin目录。 ④、测试新版本的nginx是否正常: ⑤、给旧nginx发送平滑迁移信号(若不清楚pid路径就用可用命令(2)): Ps:后面其实就是旧nginx的pid,所以先用ps aux找到正在运行的nginx主进程pid,再执行 kill -USR2 PID值亦可。 ⑥、等待旧版本Nginx的pid变为oldbin(执行如下命令查看是否生成) ⑦、  从容关闭旧版本的Nginx进程 此时,旧的工作进程就都会慢慢随着任务执行完毕而退出,新版的Nginx的工作进程会逐渐取代旧版工作进程。 ⑧、此时,不重载配置启动旧工作进程(个人感觉是为了将任务完全切换到新的nginx上) ⑨、结束工作进程,完成此次升级操作: ⑩、最后,验证nginx是否升级成功: 特意测试了下纯手动的做法,下面是我的操作记录,仅供参考: 为了验证平滑升级确实不影响在线业务,我特意在升级的时候,利用ab命令一直在发送请求: 直到升级完成,使用ctrl +C 终止并查看ab结果,可以发现几十万次的请求全部成功,没有失败!证明平滑升级的可行性!可惜忘记了截图,感兴趣的童鞋可以自行测试下! 好了,关于nginx的平滑升级和在线新增模块的操作记录就到这里结束了,希望对你有所帮助。
阅读全文
菜鸟教程:Ngnix安装详解 WEB应用

菜鸟教程:Ngnix安装详解

今天,不知道写什么,就找来一篇很详细的Nginx安装教程,“滥竽充数”了,另外后面附上马哥关于nginx讲解的核心视频教程。 Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、 腾讯等。 下面文字部分来自http://www.nginx.cn/install nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息。 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好。 ububtu平台编译环境可以使用以下指令 centos平台编译环境使用如下指令 安装make: 安装g++: 下面正式开始 --------------------------------------------------------------------------- 一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。 1.选定源码目录 可以是任何目录,本文选定的是/usr/local/src 2.安装PCRE库 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包: 3.安装zlib库 http://zlib.net/zlib-1.2.8.tar.gz 下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包: 4.安装ssl(某些vps默认没装ssl) 5.安装nginx Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /usr/local/nginx 目录下的详细步骤: --with-pcre=/usr/src/pcre-8.34 指的是pcre-8.34 的源码路径。 --with-zlib=/usr/src/zlib-1.2.7 指的是zlib-1.2.7 的源码路径。 6.启动 确保系统的 80 端口没被其他程序占用,运行/usr/local/nginx/nginx 命令来启动 Nginx 如果查不到结果后执行,有结果则忽略此步骤(ubuntu下必须用sudo启动,不然只能在前台运行) 打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功 ----------------------------------------------------- 到这里nginx就安装完成了,如果只是处理静态html就不用继续安装了 如果你需要处理php脚本的话,还需要安装php-fpm。 下面安装排错 附:可能遇到的错误和一些帮助信息 1.1编译pcre错误 解决办法:安装g++,别忘了重新configure 1.2 make出错 按照第4步的安装方法或ubuntu下 centos下 2.nginx编译选项 make是用来编译的,它从Makefile中读取指令,然后编译。 make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。 configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的configure命令支持以下参数: 典型实例(下面为了展示需要写在多行,执行时内容需要在同一行)
阅读全文