WEB应用

Nginx网站使用CDN之后禁止用户真实IP访问的方法

做过面向公网WEB运维的苦逼们肯定见识过各种恶意扫描、拉取、注入等图谋不轨行为吧?对于直接对外的WEB服务器,我们可以直接通过 iptables 、 Nginx 的deny指令或者是程序来ban掉这些恶意请求。 而对于套了一层 CDN 或代理的网站,这些方法可能就失效了。尤其是个人网站,可能就一台VPS,然后套一个免费的CDN就行走在互联网了。并不是每个CDN都能精准的拦截各种恶意请求的,更闹心的是很多CDN还不支持用户在CDN上添加BAN规则,比如腾讯云CDN。。。 因此,就有了本文的折腾分享。 一、真假难辨 如何禁止访问,我们先了解下常见的3种网站访问模式: ①、用户直接访问对外服务的普通网站 浏览器 --> DNS解析 --> WEB数据处理 --> 数据吐到浏览器渲染展示   ②、用户访问使用了CDN的网站 浏览器 --> DNS解析 --> CDN节点 --> WEB数据处理 --> 数据吐到浏览器渲染展示   ③、用户通过代理上网访问了我们的网站 浏览器 --> 代理上网 --> DNS解析 --> 上述2种模式均可能 对于第一种模式,我要禁止这个用户的访问很简单,可以直接通过 iptables 或者 Nginx的deny指令来禁止均可: iptabels: iptables -I INPUT -s 用户ip -j DROP   Nginx的deny指令: 语    法:     deny address | CIDR | unix: | all; 默认值:     — 配置段:     http, server, location, limit_except 顺   序:从上往下 Demo: location / { deny 用户IP或IP段; } 但对于后面2种模式就无能为力了,因为iptables 和 deny 都只能针对直连IP,而后面2种模式中,WEB服务器直连IP是CDN节点或者代理服务器,此时使用 iptable 或 deny 就只能把 CDN节点 或代理IP给封了,可能误杀一大片正常用户了,而真正的罪魁祸首轻轻松松换一个代理IP又能继续请求了。 那该怎么办? 二、火眼金睛 如果长期关注张戈博客的朋友,应该还记得之前转载过一篇分享Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法。说明Nginx还是可以实实在在的拿到用户真实IP地址的,那么事情就好办了。 要拿到用户真实IP,只要在Nginx的http模块内加入如下配置: 那么,$clientRealIP 就是用户真实IP了,其实就是匹配了...
阅读全文
WEB应用

分享一下php7和其他php多版本共存的配置教程

年前,终于迎来了期待已久的php7正式版,我也在第一时间就给博客用上了。性能确实有了质的飞跃,问题还是有不少的。比如鱼叔的微信插件在php7下面自动回复异常等。 为了继续使用微信插件,我只好将php5.6又开了起来,下面简单分享一下多个版本php共存的方法。 一、编译路径 多个版本php要共存,必须使用不同的安装路径。比如,之前php5.6安装在/usr/local/php,那么我们安装php7的时候,就应该定义到 /usr/local/php7 等不一样的路径。 就如之前php7编译安装分享的那样,把安装目录和配置文件目录都指向新的路径: 具体安装这里就不多说了,请自行翻看之前的文章==>传送门 二、配置修改 编译安装完php7之后,我们需要将配置文件中涉及的路径都更新为php7的实际路径,具体如下: ①、php-fpm.conf 如此一来,php5.6和php7的sock监听文件分别为/dev/shm/php-cgi.sock和/dev/shm/php7-cgi.sock。 ②、nginx配置 nginx配置只需要修改php动态解析的sock指向即可: 在站点对应的nginx配置文件中(比如,vhost/zhang.ge.conf )找到: 将其中的 然后重启nginx就能将此站点环境更新到php7了。 说白了,就是你想让站点用哪个版本就修改为该版本的监听文件路径。当然,也有一些php用的是端口的监听模式,修改原理一致! 如果只是某些特殊的页面需要使用php的其他版本,也只要新增额外的location。假如,网站有一个目录是另外的建站程序,不支持php7,那么我们需要额外设置下即可: 更多需求,举一反三即可! 三、启动脚本 在第二步,我们修改了php的配置,但是也没启动php。怎么启动很简单,我们先修改下服务脚本: 找到 PHP5.6 的服务脚本 /etc/init.d/php-fpm 现在,我们就可以使用 service php7 start 启动php7了,而之前的php5.6则继续使用 service php-fpm start 启动。 四、其他考虑 上述修改,只是让多个版本的php能够同时run起来,并未考虑多个版本的资源抢占问题。其实,还是有些许文章可以做的。 比如,php-fpm.conf 会对php的进程数量、响应超时等进行优化配置,很多时候我们都是用的单个php环境的最优配置。不过,当我们跑了多个php版本的时候,这些配置就应该折中考虑一下了。 就拿我博客举例,我让php5.6继续存在只是为了微信的一个插件,也就只是博客的小部分功能,其他绝大多数功能还是要用php7的,所以我在配置这个php-fpm的时候,会将php7的线程等资源给多一些,php5.6我就只给了一个主进程和一个子线程了。 好了,以上内容就是php多版本共存分享,充分理解下nginx和php的交互,本文分享可有可无。 2016-3-2:分享一个纯属巧合的事情,早上搜索资料的时候,发现linuxeye.com--linux运维笔记比我更早的发布了php多版本共存教程,而且更是巧合的是,改的方式都基本一致。。。搞得好像是我抄袭的一样o(︶︿︶)o 不过php的安装和配置基本也都是从他的脚本中扒的,好吧,就当我也伪原创了一把。。。
阅读全文
WEB应用

升级Nginx1.9.5以上版本,开启博客网站http2.0时代

最近给张戈博客全站开启了https,所以对这块关注比较多。昨天脑补的时候发现http2.0只支持SSL加密的网站,即https。于是心血来潮,给张戈博客开启了http 2.0,尝尝鲜。 查了下资料,发现Nginx不久前发布的 1.9.5版本支持http2.0,而1.8.x时代只是对SPDY进行了支持。一直用的1.62稳定版,此次为了测试http2.0,直接进行了版本跳跃,升级到了1.9.5版本,下面简单的分享下部署分解。 Ps:特别说明的是,http2.0只支持开启了https的网站,所以没开启https的网站就只能看看了! 一、编译Nginx 编译Nginx是我博客老生常谈的问题,之前都不想赘述的内容,这次还是耐着性子说一下在已有Nginx的服务器上重新编译一个Nginx的做法。 ①、下载Nginx最新版 目前Nginx最新版是今年11月份发布的 1.9.7 版本,反正1.9+是没有稳定版,所以干脆弄个最新版: 话说1.9+版本还支持TCP负载均衡呢,感兴趣的可以看下张戈博客之前的分享: Nginx发布1.9.0版本,新增支持TCP代理和负载均衡的stream模块 ②、编译Nginx 在已有环境下编译Nginx,一般做法是先取得目前运行的Nginx的运行参数,然后在这个参数的基础上加上本次编译想新增的参数即可。所以,我们先执行 nginx -V 查看它的编译参数是什么: 可以看到张戈博客目前用的是1.6.2版本,当然也是淘宝定制过的Tengine。 如果你发现参数里面也存在 --add-module=../xxx 这种使用相对路径的参数,就得注意了。你重新编译的时候得保证新的Nginx编译文件夹的相对路径存在对应的模块,否则请重新指定一个正确的路径,比如上面代码中出现的 ngx_cache_purge-2.3,否则会提示找不到路径啦! 既然知道了老的Nginx的编译参数,那么直接按照下面操作,解压、编译、平滑升级搞定Nginx1.9x: 二、配置http2.0 配置Nginx开启http 2.0特别简单,只要在Nginx配置文件中找到你要开启http2.0的域名server模块,然后将 listen 443 ssl;改成 listen 443 ssl http2; 即可。 比如,张戈博客之前的Server模块配置如下: 直接改成: Tips:开启http2.0后,谷歌浏览器无法访问,显示如下信息? 无法显示此网页 ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY 网址为 https://zhang.ge/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。 吐下苦水,张戈博客配置好http2.0之后,得知谷歌浏览器支持http2.0,于是访问看了下,居然提示以上错误!关掉http2之后,又正常了!!搜遍了都没找到为什么!最终,鬼使神差的把SSL额外配置全部屏蔽,只剩下指定证书和key部分,发现居然好了? 后来发现Nginx官方给出的SSL中都用到了 TLSv1.2,而我的配置还停留在TLSV1! 保存配置文件之后,重启或重载Nginx即可生效:/usr/local/nginx/sbin/nginx -s reload 三、测试http2.0 配是配好了,到底有没有生效呢?还需要测试下才行。 ①、在线测试 直接访问 https://spdycheck.org/#你的域名 即可测试是否成功开启 http2.0: 比如访问:https://spdycheck.org/#zhang.ge,可以看到如下信息: 发现居然是SPDY有木有?想了半天为什么,才想起来我用了腾讯云的CDN,这个SPDY肯定是腾讯云CDN为了优化https启用的!跟上文的操作没有半毛钱关系!所以,目前张戈博客虽然开启了http2.0,但是走了CDN之后,就只有SPDY了,本次权当测试。。。 于是,试着搜了下http2 check,没想到还真有!不过可惜功能不可用,测任何网站都是失败: https://www.h2check.org/ ②、浏览器测试 看来要得到确切的结果,还得借助谷歌、火狐等浏览器了。 打开谷歌浏览器,先访问一下你的网站,比如访问下张戈博客 然后,在谷歌浏览器地址栏输入 chrome://net-internals/#http2 并回车,列表里面即为已支持http2.0的域名: 没错,开启成功! 进一步看一下Nginx日志,可以很明显的发现刚刚的访问是走的http2.0协议: 四、简单总结 上文仅仅是简单配置,http2.0其实还有其他几个优化参数,感兴趣的朋友可以前往Nginx官方文档查看:http://nginx.org/en/docs/http/ngx_http_v2_module.html http2.0是下一代http协议,现在还没普及,而且大部分浏览器都不支持使用http2.0访问。只有少数浏览器,比如谷歌、火狐,貌似IE10也在蠢蠢欲动,具体行不行有待测试。所以,测试这个功能也只是抱着尝鲜和学习的目的。 对http2.0感兴趣,并希望了解http2.0优点特性的朋友,可以看下开源中国对http2.0的详细介绍。当然,网上还有很多对HTTP1.0、SPDY及HTTP2.0详细测试对比的技术文章,都可以很明显看出http2.0绝对是以后互联网的主流趋势! 开启http2.0的前提是你的网站已经支持了https,所以开启https是第一步! 以下是相关文章: 借助腾讯云CDN开启全站https及问题解决分享 分享一个免费SSL证书申请网站,给网站开启https协议 Linux+Nginx/Apache/Tomcat新增SSL证书,开启https访问教程 不长不短,又是一篇折腾分享,希望你能用得上~
阅读全文
WEB应用

PHP7.0正式版编译安装升级及WordPress问题解决分享

盼望以久的PHP 7.0正式版,终于在今天发布了! 官方给出的新特性如下: PHP 7.0.0 comes with new version of the Zend Engine with features such as (incomplete list): Improved performance: PHP 7 is up to twice as fast as PHP 5.6 Consistent 64-bit support Many fatal errors are now Exceptions Removal of old and unsupported SAPIs and extensions The null coalescing operator (??) Combined comparison Operator (<=>) Return Type Declarations Scalar Type Declarations Anonymous Classes 至于新特性是什么,百度一下都有大牛给出很详细的解释,不过我也看不太懂,但是我看懂了一条: Improved performance: PHP 7 is up to twice as fast as PHP 5.6 PHP7的性能将是PHP5.6的2倍! 好了,其他就不用看了,单这一条就已经有升级的动力了吧! 之前就用过RC版本,性能确实提高了很多,但是在PHP7.0环境中,Begin主题存在不少问题,由于不是正式版,我也就懒得花时间去解决了。 今天官方发布了正式版,于是利用下班时间给博客编译安装了PHP7.0,且一并解决了Begin主题依然存在的不兼容问题,下面简单的分享下。 一、编译安装 以下安装步骤是在已有PHP5的环境下进行的,不保证能够顺利完成,仅供参考。 ①、下载PHP 这是PHP官方的PHP7.0正式版的国内CDN下载地址,可以放心下载。 ②、解压编译 基本大家伙都已经安装了PHP的5.6或更老的版本,所以我们可以编译安装到一个新的路径。 上面的编译安装激活了opcache缓存,如果不需要可以去掉 --enable-opcache,个人推荐使用。 ③、设置参数 Ps:以上参数等代码从lnmp一键安装包中提取。 ④、版本替换 php 7 已经安装到了 /usr/local/php7,为了让2个版本暂时都存在,方便过渡,这里我们使用软链接搞定 哦了,做完以上步骤,要是没报错基本就已经搞定了,执行一下php...
阅读全文
WEB应用

php5编译安装常见错误和解决办法集锦

最近在给开发同事折腾开发测试环境,其中就有php的编译安装。由于每个人的需求不一致,所以也接触到了各种模块编译和集成,中间不乏各种编译依赖报错。 正好,搜了几次都是下面2篇文章内容,干脆就转到自己博客,以备后用,后续有相关内容再继续补充。   checking for BZip2 support… yes checking for BZip2 in default path… not found configure: error: Please reinstall the BZip2 distribution 解决办法:yum install bzip2-devel checking for cURL support… yes checking if we should use cURL for url streams… no checking for cURL in default path… not found configure: error: Please reinstall the libcurl distribution – easy.h should be in/include/curl/ 解决办法: yum install curl-devel   checking for curl_multi_strerror in -lcurl… yes checking for QDBM support… no checking for GDBM support… no checking for NDBM support… no configure: error: DBA: Could not find necessary header file(s). 解决办法: yum install db4-devel...
阅读全文
WEB应用

Nginx配置多站点下的Proxy_cache或Fastcgi_cache缓存加速

张戈博客分享过很多关于缓存加速的教程,自己也是不断的在摸索,追求最佳的网站静态缓存加速方案。在这里简单的总结一下: 1、使用虚拟主机的朋友推荐使用缓存插件或php 代码版缓存方案=>点此直达 2、使用独立主机的朋友推荐使用Nginx的Fastcgi纯静态缓存方案=>点此直达 在我分享了Nginx的Fastcgi缓存之后,有不少朋友已折腾成功。不过有朋友反馈,不知道在多站点下如何配置Nginx Fastcgi。而所有网上分享的方案都是单个站点的,我本以为多站点的直接在 php 的 location模块中插入fastcgi缓存配置就好了,结果发现会报错,提示缓存空间已被使用。 经过张戈轮番测试,最终试出了多站点下的Fastcgi缓存配置,下面简单分享下。 一、部署http模块 ①、单个站点 单个站点上篇文章已经分享过了,在http模块内加入如下配置即可: ②、多个站点 当要给多个站点开启fastcgi缓存时,以上配置就不行了,会报错。经过测试,修改如下即可: 二、部署server模块 配置好了http模块之后,server模块就很简单了! 只要在不同的站点的php模块下插入不同的fastcgi缓存配置即可,其实就是key_zone的区别而已。 比如,我同时给张戈博客和中国博客联盟2个站点的配置如下: 张戈博客: 中国博客联盟: 其实就是和http模块内定义的缓存一 一对应而已,这样才能区分开来啊!否则就会报错。 三、Proxy_cache缓存 分享了多站点的fastcgi缓存配置,顺带也分享一下Proxy_cache的多站点缓存配置好了。免得某些朋友不会依葫芦画瓢。。。 其实,我也没实际测试,但是依此类推应该如下配置即可,有需求的测试一番就知道了: ①、http模块 ②、server模块 至于server模块应该就不用跟上面介绍的那样详细了吧!不同站点只是 proxy_cache 这个配置不一样而已!比如: 站点1配置 站点2配置: Ps:可能有人又要问了,这配置是放到哪的啊?唉,就这样您还瞎折腾啥呢?老老实实写文章吧! 哦了,看懂以上配置,随便部署多少站点的fastcgi或proxy缓存都不用愁了!
阅读全文