分类归档 Linux平台

通过清心醉

WordPress目录安全权限

不管实在Linux还是Windows系统,我们都需要对PHP的系统应用进行权限的控制

Windows上我不懂,不给与评价

但是Liunx,默认很多权限是755,其实也足够了,但是不排除很多漏洞引起的垃圾文件被POST上传,其中最常见的就是POST木马脚本,什么一键改代码,改数据库的

针对WordPress,首先,我们给与整个web站点设置555权限

然后,因为我们的后台发布的文章,可能会需要上传图片/音频/视频等文件类型,这里就需要进行写入的权限

因此我们给与对应的上传目录设置755权限即可.

即:/web/wp-content/uploads

(切忌不要设置777,755就足够,777如果目录及文件权限过高,当心整个服务器给黑!)

通过清心醉

Linux执行ASP.NET

由于作者一直都喜欢在LINUX系统下进行环境编译配置,为什么呢?肯定不用说,因为LINUX的开源,LANMP的开源组合,让我可以轻松的部署任意环境的WEB网站,包括APP的SERVER;

以前曾经在LINUX用APACHE跑过ASP,但非APSX这种编译类型的,好吧,说到编译,APP也算是了!

回到整题,LINUX执行ASP.NET程序,可以用XSP或者APACHE的扩展模块支持!

(尊重开源,使用开源,维护开源,从我做起!)

XSP

XSP是一个轻量级的Web服务器,它是用100%的C#代码写成的纯.Net应用程序。当然,它也是完全公开源代码的。XSP使用 System.Web命名空间下的类去完成Asp.Net的执行任务,它也可以运行在Windows上(使用Microsoft .Net Framework)。

相对的来说,XSP的安装和配制都比较简单,它的源码包下载地址是在:XSP web server 1.0

下载软件包后,执行:tar zxfv xsp-1.0.tar.gz来完成解压缩,会在当前目录下生成一个名称为xsp-1.0的目录,进入目录后,按照以下顺序进行编译:

./configuration
make
make install

完成编译后,进入server子目录下,你可以看见里面有一个名字叫xsp.exe的可执行文件,这个就是xsp的主程序。

接下来可以进行测试工作,在xsp-1.0的目录下有一个名字叫做test的子目录,下面有很多aspx文件,这些就是随包附带的测试页面,进入test目录后,执行:

mono /…xsp的目录…/server/xsp.exe

加入看见如下提示信息:
Adding applications ‘/:.’…
Registering application:
Host:          any
Port:          any
Virtual path:  /
Physical path: /
Listening on port: 8080
Listening on address: 0.0.0.0
Root directory: /
Hit Return to stop the server.
则表示 xsp已经在8080端口进行监听(默认是8080端口),如果想要关闭服务器的话直接敲回车键。
现在可以打开Web浏览器,直接输入:

http://你的服务器的地址:8080/

如果一切都正常的话,你可以看见测试首页。
XSP还有一些参数选项,输入–help的参数就可以看见这些选项的列表和说明。这里做一个简单的介绍:

–port
设置XSP服务器监听的端口号,默认是8080,如果XSP是你服务器上唯一的WEB服务器的话,你可以把它设置为80。

–adress
设置XSP服务器监听的IP地址,默认是0.0.0.0,表示在所有地址上接受请求。

–root
设置网站的根目录,默认是当前目录。

–appconfigfile
设置XSP的配置文件。配置文件是一个XML格式的文件,可以将这些参数选项进行“打包”配置。

–appconfigdir
设置XSP的配置文件目录。假如你在一个文件中写不完配置的话(几乎不可能吧),可以把配置信息写到多个文件中,xsp会读取这个目录下所有扩展名为.webapp的配置文件。

–applications
设置XSP的虚拟目录。一个XSP服务器可以设置多个虚拟目录,格式是:虚拟目录名:真实路径,如果有多个的话,中间用分号隔开。

–nonstop
敲回车键不关闭服务器。

–version
显示XSP的版本号。

–verbose
打印出一些附加信息,主要用来调试用。

Apache Mono module

前面介绍的XSP是一个轻量级的服务器,那么这个应该可以算做是一个重量级的了(其实也重不到哪里去,Apache在这里只是一个代理请求的功能,主要 处理其实都转到mod_mono去了),Apache Mono module是Apache服务器的一个外挂的模块,可以让Apache服务器支持Asp.Net应用程序。

mod_mono在Apache Mono module 1.0 处下载,下载后同样是:

./configuration
make
make install

编译完成后,就可以来配制apache服务器了,找到你的apache配置文件,一般是位于:/etc/httpd/conf/httpd.conf,使用vi编辑器打开这个文件,在文件里面加上:

LoadModule mono_module modules/libmod_mono.so
Alias /虚拟目录名 “真实路径”
MonoApplications “/虚拟目录名:真实路径”

SetHandler mono
假如你的mono和xsp没有安装在标准路径,还需要加上一些额外的参数:

MonoExecutablePath 设置mono的执行路径

MonoServerPath 设置mod-mono-server.exe文件的路径,注意这个文件是在XSP的软件包中的,所以这个要设置为XSP的路径。

一般设置了这些参数就可以了,其它的参数选项都设置为默认。

现在可以重启Apache服务器,找到你的apachectl命令的路径,一般是在/usr/sbin目录下,然后使用:

apachectl restart

这时你就可以打开浏览器输入服务器地址和虚拟目录来验证是否已经配置成功了。

通过清心醉

网站进阶-什么叫并发-什么叫访问量

首先一张图,来看看常规的WEB请求:

bingfa

 

以上规则,为每一个用户的请求,包括建立HTTP协议连接;

何为并发?并发其实就是短暂时间内进行访问,比如1-3秒内同时2000个用户执行以上操作,就是2000个实际并发;
何为访问量?访问量为非同一短暂时间内进行服务器的访问,比如有100个用户是17:00访问,又有100个用户是17:01分访问,实际2分钟内就有200个访问量,但实际并发量只有100;
注:高并发如果为真实用户访问即会消耗系统、带宽等资源;如果非法访问,就是所谓的DDOS攻击,即1秒内发起10000+的伪用户进行网站访问,消耗服务器所有资源,导致其他用户打不开,包括服务器宏机!

 

附:

针对高并发,吞吐量来说,大家都知道使用NGINX,因为占用内存资源少,如果是APACHE,会浪费过多的内存资源,基于带宽来说,消费的基本都是同等的!

通过清心醉

LANMP负载均衡之静态文件的分发

好久没看负载均衡了,以前自己的框架站点因为CSS和JS文件的集中分散在站内的多处目录,为了可以更好的兼容负载均衡,让CSS和JS以及GOOGLE字体和其他样式文件放在第二个服务器来实现网络带宽的分发负载,特写此文章!

我们要载入css文件的话,一般都会以目录形式,还有就是域名方式。而后者就是流量负载均衡常用的写法。

比如义个qingxinzui.css文件

我可以放在根目录内,

直接请求的URL为./qingxinzui.css

如果为域名请求,为qingxinzui.com/qingxinzui.css

很明显,如果域名替换成其他的域,就可以实现静态文件的负载调用!

由于是测试服务器,所以有时会出现“已阻止跨源请求:同源策略禁止读取“的错误请求信息,原因是头部进行请求的时候,文件所属的IP、域、地址都是相同的。

要解决也很简单,当然了这是静态文件负载均衡的重中之重了

<VirtualHost 127.0.0.1:1688>
DocumentRoot /var/www/qingxinzui
ServerName qingxinzui.com
</VirtualHost>
<Directory “/var/www/qingxinzui”>
Header set Access-Control-Allow-Origin *
Options Indexes FollowSymLinks ExecCGI Includes
AllowOverride All
Require all granted
</Directory>

由于作者的程序是在动态载入CSS/JS文件的,而服务器使用NGINX反响请求APACHE模式,所以修改后端的APAHCE就可以了,因为PHP解析完成之后仍然会生成伪静态文件。

如果你的是NGINX为前后服务器,直接修改NGINX的配置,语法转换下就可以了!

附带一提:Header set Access-Control-Allow-Origin *,这里的*表示服务器可以分发请求的所有域,建议实际线上服务器写上自己认为合法的域名!

通过清心醉

开源一个B2B多域名独立SEO站点的伪静态规则

该多站多域名服务器集群独立SEO伪静态规则由作者“清心醉”独立编写,转发请注明出处!

您对开源的尊重,让更多一个人尊重源代码的原始作者!

function rewrite($link) {
$url_info = parse_url(str_replace(‘&amp;’, ‘&’, $link));
$url = ”;
$product_id=null; #–定义产品ID  //平台直接跳转
$data = array();
parse_str($url_info[‘query’], $data);
foreach ($data as $key => $value) {
if (isset($data[‘ipanying’])) {
if (($data[‘ipanying’] == ‘product/product’ && $key == ‘product_id’)
|| (($data[‘ipanying’] == ‘product/manufacturer/info’ || $data[‘ipanying’] == ‘product/product’) && $key == ‘manufacturer_id’)
|| ($data[‘ipanying’] == ‘information/information’ && $key == ‘information_id’)
|| ($data[‘ipanying’] == ‘ckz/word/word’ && $key==’word_id’ )  ) {

if ($data[‘ipanying’] == ‘product/product’ && $key == ‘product_id’ && STORE_ID==0){ #–如果为产品ID并且是平台的话
$product_id=$value;
}
$query = $db->query(“SELECT * FROM ” . DB_PREFIX . “url_alias WHERE `query` = ‘” . $db->escape($key . ‘=’ . (int)$value) . “‘”);

if ($query->num_rows && $query->row[‘keyword’]) {
$url = ‘/’ . $query->row[‘keyword’];

unset($data[$key]);
}
} elseif ($key == ‘path’) {
$categories = explode(‘_’, $value);

foreach ($categories as $category) {
$query = $db->query(“SELECT * FROM ” . DB_PREFIX . “url_alias WHERE `query` = ‘category_id=” . (int)$category . “‘”);

if ($query->num_rows && $query->row[‘keyword’]) {
$url = ‘/’ . $query->row[‘keyword’];
} else {
$url = ”;

break;
}
}

unset($data[$key]);

} elseif ($key == ‘ipanying’) {
$query = $db->query(“SELECT * FROM ” . DB_PREFIX . “url_alias WHERE `query` = ‘” . $db->escape($value) . “‘”);
if ($query->num_rows) {
$url = ‘/’ . $query->row[‘keyword’];
unset($data[$key]);
}
}
}
}

if ($url) {
unset($data[‘ipanying’]);

$query = ”;

if ($data) {
foreach ($data as $key => $value) {
$query .= ‘&’ . rawurlencode((string)$key) . ‘=’ . rawurlencode((string)$value);
}

if ($query) {
$query = ‘?’ . str_replace(‘&’, ‘&amp;’, trim($query, ‘&’));
}
}

//if (STORE_ID==0 && !empty($product_id)){
if (STORE_ID!=0){ #-如果非平台
$product_url=$model->getStoreUrl(STORE_ID); #-强制获取店铺URL
$url=str_replace(‘/’,”,$url);  #– 提取URL
return $product_url. $url . $query; #– 返回拼接URL
}  else if(STORE_ID==0 && !empty($product_id)){ #如果是平台并且有产品调用(因为产品是二级域名)
$store_id=$model->getProductAsStore($product_id); #– 获取产品对应的店铺ID
$product_url=$model->getStoreUrl($store_id); #– 根据店铺ID获取网站URL
$url=str_replace(‘/’,”,$url);  #– 因为店铺URL中已经存在‘/’符号,所以进行删除
return $product_url. $url . $query; #– 返回拼接URL
}  else {
return $url_info[‘scheme’] . ‘://’ . $url_info[‘host’] . (isset($url_info[‘port’]) ? ‘:’ . $url_info[‘port’] : ”) . str_replace(‘/index.php’, ”, $url_info[‘path’]) . $url . $query; #-否则就是平台而且无PRODUCT产品的时候的平台直属URL
}

} else {
return $link;
}
}

 

调用的模型类中其实就是对数据库的操作!

$store_id=$model->getProductAsStore($product_id); #– 获取产品对应的店铺ID
$product_url=$model->getStoreUrl($store_id); #– 根据店铺ID获取网站URL

根据自己定义的实际URL来进行

该处代码为平台显示二级域名的产品时所产生伪静效果

 

 

通过清心醉

NGINX反向请求APACHE的伪静态出现404错误

刚在配置盼盈信息港的时候,出现了404,这页面不陌生。

首先看看NGINX的配置吧:

server {
listen 80;
server_name ipanying.cn *.ipanying.cn;
location / {
root /var/webs/ipanying/public_html/;
index index.php index.html index.htm;

location ~ .*\.(js|css)$ {
access_log off;
expires 1d;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
access_log off;
expires 3d;
}
location ~ .*\.(php?|cgi|pl|py)$ {
proxy_pass http://127.0.0.1:9999;
proxy_set_header Host $host;
}
}
}

 

很清楚的看到location ~ .*\.(php?|cgi|pl|py)$反向请求给APACHE的9999端口

因为APACHE端口默认是80,而我修改成127.0.0.1:9999

自认没错啊,因为9999端口只允许内网访问(即外网无法非法获取,甚至我可以在NGINX进行更多的负载均衡的反向请求);

在根目录内放个文件打印phpinfo()却没问题;这让我联想到反向请求的根本,问题自然就清晰了!

location ~ .*\.(php?|cgi|pl|py)$居然都把请求发向转发给APACHE了,而伪静态是.html做结尾,自然而然该页面是由NGINX进行动作!可是NGINX对伪静态之后的.html文件进行数据解析,却是不存在的。

所以,以下的这段

location ~ .*\.(php?|cgi|pl|py)$ {
proxy_pass http://127.0.0.1:9999;
proxy_set_header Host $host;
}

明显就有问题。如果是针对DEDE这种国产高I/O开销的纯静态页面是可以进行的,因为静态.html文件是实实在在存在的。所以针对动态伪静态,应该修改为:

#location ~ .*\.(php?|cgi|pl|py)$ {
proxy_pass http://127.0.0.1:9999;
proxy_set_header Host $host;
#}

没错,注释掉就解决问题!

如果你有更多的服务器配置问题,欢迎咨询,LANMP任意组合任意版本!

 

 

通过清心醉

可伸缩Web架构的4个问题:瓶颈,CPU,数据库,IO

负载均衡器扩展

可以通过将DNS指向多个IP以及使用DNS轮循查找IP地址的方式来实现负载均衡器的横向扩展。或者可以使用多级负载均衡,使上一级负载均衡器来分发至下一级负载均衡器,但使用多个负载均衡器的情况比较少,主要是由于Web容器一般可以处理几千并发请求,而使用nginx或者HAProxy的单个负载均衡器可以处理超过20000的并发请求,因此单个负载均衡器完全可以代理多个web应用。

数据库功能扩展

数据库功能扩展是非常常用的方式,但是扩展数据库功能(比如创建存储过程或自定义函数)都会给数据层带来额外开销以及增加数据层的复杂性。

关系型数据库

关系型数据库可以通过主从同步的模式实现扩展,主库以写入数据为主,从库只做读操作。但是,如果业务量比较大时主从同步模式所提供的扩展能力非常有限,此外,开发人员还需要通过数据库拆分技术来进一步满足业务需求。

NoSQL

CAP定理(译者注:不熟悉的读者可通过谷歌查阅)告诉我们一个应用不可能同时满足一致性、可用性、分区容错性三个要求。而NoSQL一般则是通过牺牲一定的一致性来获得更高可用性以及更好的分区容错性。

数据库拆分

数据库拆分可以垂直拆分和水平拆分:

 垂直拆分(Partitioning):根据领域模型概念的基础可以将数据库拆分为几个松耦合的子库。例如,拆分为消费者数据库、产品数据库。另一种垂直拆分数据库的方式是将一个实体的一部分字段拆分出来作为一个新数据库,另一部分字段作为另一个数据库。例如,将消费者数据拆分为消费者联系信息和订单数据两部分。

 水平拆分(Sharding):可以根据数据的离散属性将数据进行水平分割。例如,消费者可以根据地域不同拆分为美国消费者数据库和欧洲消费者数据库。

将数据库从单个数据库使用分区或者sharding拆分为多个数据库是一项非常有挑战性的任务。

架构瓶颈

可扩展系统出现性能瓶颈的原因主要在于以下两方面:

 中心化组件 应用中一个不可扩展的组件直接影响整个系统或者请求处理通道所能处理请求数的上限。

 高延迟组件 一个高延迟的组件会影响整个系统响应时间的下限,使整个系统响应时间更长。通常解决这个问题的办法是使高延迟的组件作为后台任务线程或者使用异步队列来解决。

CPU消耗型应用

如果一个应用的吞吐量受CPU的限制,那么该应用就是CPU消耗型应用。此类引用通过增加CPU计算速度即可减少响应时间。

以下这些应用场景可能属于CPU消耗性:

 需要计算或者处理数据而不需要做IO操作的应用(财务或者交易类系统)

 非常依赖缓存而且不做任何IO操作的应用

 异步(非阻塞)模型而且不需要等待外部资源的应用(被动应用或者使用NoJs的应用)

在以上使用场景中已经正常运行的应用,如果在一些应用场景中写了糟糕的或者效率低下的代码来对每次请求做大量额外的计算或者循环,那么这些应用的CPU占用率将非常高。但是通过分析应用可以很容易发现并修改效率低的问题。

IO消耗型应用

如果一个应用的吞吐量受IO或者网络操作影响而且提升CPU计算速度并不能减少响应时间,那么该应用即为IO消耗型应用。大多数应用是IO消耗型应用主要是由于要做增、删、改、查操作。而性能调优和对iO消耗型应用进行扩展也由于这些系统依赖于其他系统的下行流量变得非常困难。

以下这些应用场景可能是IO消耗性:

 依赖数据库并进行增、删、改、查操作的应用

 需要下行流量来完成本身操作的应用

让我们先来了解一些术语。稍后我将对Web应用扩展过程中所遇到的不同问题进行讲解,例如:

1:架构瓶颈

2:数据库扩展

3:CPU消耗型应用

4:IO消耗型应用

性能

Web系统的性能受多方面因素的影响,但大多数开发人员主要关心的是响应时间和可扩展性这两方面。

响应时间

响应时间是指Web应用从收到请求到返回响应结果所花费的时间。而应用系统应该在可接受的时间范围内返回响应结果,否则就不能算是一个性能良好的应用系统。

可扩展性

如果Web应用通过增加更多硬件可以使处理的请求数呈线性增长,那么该应用是可扩展的。

扩展的方式可以分为以下两种:

1) 纵向扩展(垂直扩展):为单台机器增加CPU或者提高单台机器CPU性能。

2) 横向扩展(水平扩展):增加服务器数量

垂直扩展 VS 水平扩展

一般情况下水平扩展比垂直扩展更重要,主要是因为普通硬件商品远比需要特殊配置的硬件便宜(比如大型机);但是增强单个应用在一个硬件商品上处理的请求数同样也是比较重要的。同时,一个应用系统在不降低响应时间的前提下,如果通过添加更多的资源能够处理更多的请求,那么这个系统表现良好。

响应时间 VS 可扩展性

在同一个应用中,响应时间和可扩展性并不总是能够同时达到最好的效果。要么应用程序有可接受的响应时间但是不能处理超过一定数量的请求;要么应用程序可以处理大量请求,但是响应时间却不尽如人意,甚至非常糟糕。因此,通常情况下我们需要在这两个要素中寻求平衡点使我们的应用系统性能达到最佳状态。

容量规划

容量规划需要我们根据产品期望的负载量来预估所需要的硬件数量。除了整体的预估外,这通常还包括使用更少硬件时系统的性能表现情况以及单台机器下的性能的测试及评估。

架构扩展

如果Web应用的每一层在多层架构体系中都是可扩展的,那么该应用也具有可扩展性(横向扩展)。例如,如下图所示,我们就可以通过增加额外的资源来实现应用层和数据库层的线性扩展。

 

 

通过清心醉

实战LANMP负载均衡部署2-NGINX结合MEMCACHE提供SESSION会话保留

接上文,上文作者写了实战LANMP负载均衡部署1-实现NGINX反向APACHE服务器集群,居然NGINX反向给了APACHE服务器的集群之后,我们就要考虑SESSION丢失的问题了

实战LANMP负载均衡部署2-NGINX结合MEMCACHE提供SESSION会话保留

首先我们需要给210的NGINX服务器添加MEMCACHE服务,用于存储缓存信息,
而220/230的服务器只需要添加PHP的MEMCACHE扩展,调用210服务器上的MEMCACHE

由于yum源要找过PHP5.3.3的memcache
所以作者编译过环境为PHP7
可以参考
php7添加memcache扩展

在这要特别说下:

memcache是一个服务

memcached是PHP的扩展支持

pecl-memcache-php7 安装在APACHE集群的220/230的服务器的PHP上

重启HTTPD,打印phpinfo查看是否已经启用了memcachee
然后切换会210的NGINX服务器

安装memcached-1.4.25 (记得yum install -y libevent-devel)

安装完成后启用:
/usr/local/bin/memcached -d -m 256 -l 192.168.0.210 -p 7788 -u root

IP必须为内网IP 127.0.0.1的话就只允许本机了
修改220/230的php.ini
session.save_handler = memcache;
session.save_path = “tcp://192.168.0.210:7788”;

不过建议在执行的PHP上动态修改:
ini_set(‘session.save_handler’, ‘memcache’);
ini_set(‘session.save_path’, ‘ tcp://192.168.0.210:7788’);

先来做个测试,看看SESSION是否可以共享:
修改220/230服务器的index.php内容为:

<?php
header(“Content-Type: text/html; charset=UTF-8”);
echo “当前反向请求的服务器IP为:”.$_SERVER[“SERVER_ADDR”].”<br>”;
ini_set(‘session.save_handler’, ‘memcache’); #修改SESSION的保存方式
ini_set(‘session.save_path’, ‘ tcp://192.168.0.210:7788’); #SESSION保存路径
session_start();

#unset($_SESSION[‘time’]); die();
#如果设置错误先把数据删除
$time=time(); #获取当前时间
if(!isset($_SESSION[‘time’])){ #如果不存在SESSION的时间
$_SESSION[‘time’]=$time; #赋值
}
echo “共享的SESSION[‘time’]的值=”.$_SESSION[‘time’].”<br>”;
#输出共享的SESSION[‘time’]
echo “现在的时间=”.time();
#输出当前的时间
?>

可以看到结果:

1

2

到现在为止,负载均衡的SESSION共享就算完成了,当然也包括数据缓存共享;

为了您的服务器敏感信息不泄漏,建议MEMCACHE只开启内网IP段

即/usr/local/bin/memcached -d -m 256 -l 192.168.0.210 -p 7788 -u root

如果是实际服务器,切记别使用:

/usr/local/bin/memcached -d -m 256 -l 外网IP -p 7788 -u root

 

因为缓存的数据很容易就被黑客抓取,所以如果不是使用服务器集群的话,建议别开启MEMCACHE

 

作者在说说,MEMCACHE是如何减轻数据库的瓶颈的,代码就不写了,思路写了自己琢磨下就懂了:

对SQL的操作,莫过“增删改查”

首先,每次SELECT的时候,先判断MEMCACHE里是否存在对应的KEY,存在提取值,这些值是怎么来的呢?

假设MEMCACHE内没有所需的值

数据库中提取,可以为数组也可以为字符串,然后Memcached::set(‘key’,’value’)写入KEY名称和对应的值,值可以为数组

那么下次再访问的时候,就先不直接读取数据库了

而是if(Memcached::get(‘key’,’value’))就可以判断是否存在,存在直接return即可。

 

比如说有留言什么的,就进行更新,更新之后同样更新下key的value即可

更多可以参考Memcached类

通过清心醉

实战LANMP负载均衡部署1-实现NGINX反向APACHE服务器集群

本文只讲解进行负载均衡的反向代理及memcache的使用,至于MYSQL服务器的话,因为是直接使用PHP进行连接的,所以作者就不怎么讲解了

实战LANMP负载均衡部署1-实现NGINX反向APACHE服务器集群

本机:Windows 7
VM虚拟机: CentOS 64 * 3

修改本机的hosts文件,添加
192.168.0.210 www.ipanying.com
192.168.0.210 ipanying.com

负载均衡使用循环反向代理模式

因为实际项目部署的话,肯定不能使用IP,而且作者详细开发部署的时候,也是会对IP进行限定的
服务器的部署为yum源

服务器部署为:
192.168.0.210 NGINX实现负载均衡及memcache #只编译NGINX+memcache
#由于电脑只有8GB的内存,不能再开启更多的VM了

192.168.0.220 APACHE处理PHP程序 #只编译APACHE+PHP
192.168.0.230 APACHE处理PHP程序 #只编译APACHE+PHP
服务器:192.168.0.210
如果不会编译请参考yum安装nginx
service nginx restart

服务器:192.168.0.220/230
yum install -y httpd php php-mysql php-gd php-xml php-mbstring
service httpd restart

接着在两台APACHE服务器上的/var/www/html/添加index.php

vi /var/www/html/index.php
220的IP写入:
192.168.0.220 <br>
<?php echo phpinfo();?>
230的IP写入:
192.168.0.230 <br>
<?php echo phpinfo();?>
service iptables stop
关闭防火墙来访问: 你也可以设置220、230的IP服务器只允许210访问,具体细节自行GOOGLE

01

如果可以看到该数据,说明访问成功

看看NGINX是否运行正常: #记得关闭防火墙

访问:192.168.0.210

02

由于只对单一的站点测试,所以不需要修改太多的NGINX配置
本机访问:www.ipanying.com 因为hosts的关系,会跳转到192.168.0.210的服务器,然后根据反向条件反向请求给220/230服务器。

而且220/230的服务器的端口默认就为80

NGINX(210服务器上)
添加/var/www/html/index.php 空文件,因为PHP文件会进行反向给APACHE服务器集群

接着修改/etc/nginx/nginx.conf
在httpd{}节点内添加:
upstream ipanying{
server 192.168.0.220:80;
server 192.168.0.230:80;
}

修改/etc/nginx/conf.d/defautl.conf文件
server{}节点内添加:
location ~ .*\.(php?|cgi|pl|py)$ {
proxy_pass http://ipanying;
}

这时候,访问www.ipanying.com

3

输出的IP就不同了:

192.168.0.220 或 192.168.0.230

 

因为这两台服务器上的index.php文件最上面都有写入,看的出文字的变化

这样,NGINX反向PHP给APACHE集群的负载均衡就算完成了

注:APACHE集群内有的PHP文件在NGINX必须也存在,否则访问NGINX文件不存在就会403错误,除非URL直接添加才会反向给APACHE;

而且NGINX有PHP的代码文件存在,实际上是不响应任何请求动作的,只是作为一个反响跳转的一个需求而已

至于APACHE进行域名验证作者也不去写了,配置下vhost就是了,因为只是后端交互,所以没多大的关系,直接修改端口或者防火墙限制IP

 

 

 

 

通过清心醉

什么环境我们才应该使用memcache

一直都有看到有提到memcache可以提高网站速度,事实真是如此?

就作者的博客来说,使用memcache把数据缓存,的确是可以减少了数据库的使用率,可是,就加载到内存的缓存数据,测试了下,打开响应时间起码慢了2秒以上,作者用的还是PHP7+Opcache,使用了memcache之后性能下降的可怕,于是不使用了memcache。

就包括现在很多的网络公司都说要熟悉memcache缓存技术,事实上真的用的上吗?

memcache最大的好处是单一网站的分布式的存储,如果日访问量过百万级别的网站,一般都会有做负载均衡来减少服务器的压力,做了负载均衡,memcache就能很好的发挥本该有的效果。数据写入内存,虽然响应一样会慢点,但起码不会导致服务器宏机。

其次,memcache配合负载均衡用来保持会话的SESSION,我们就可以用一台服务器来保存SESSION会话信息,其他的用于动静态文件的均衡处理,可以保证用户的每一次访问,SESSION会话都是在保持连接状态。

这里就还会有一个疑问,虽然作者未曾测试过:

比如自行开发的后台,使用的是SESSION的判断,假设用户登录成功之后存在$_SESSION[‘admin_user’];

如果把该信息写入memcache的话,如果一个服务器内有多个站点,都是需要该值的。

这时候访问A站生成的SESSION会话,访问B网站如果也从memcache来读取会话信息,如此一来,B站提取了合法的SESSION,就能跨站访问了;

当然,该疑问可以当作是PHP开发时的一个安全顾虑

如果只是一个服务器跑多个类型的网站,用户群体不一样,memcache不能发挥它的最大性能,更可能让你的服务器针对SESSION会话及缓存效果减少。

如果是服务器集群,一个用户登录之后可以访问服务器内的所有站点数据,那么,memcache是很理想的!

 

通过清心醉

php7添加memcached扩展

即使网站的访问量不大,memcached也能就SESSION的存储问题上做很好的处理

因为SESSION是以文件的方式存储在服务器上的,这样一样磁盘I/O负荷就是个很大的问题,哪怕文件在小,数量多了就麻烦

本文先不说SESSION的配置环境,只先说PHP7整合memcached的方法

memcached-1.4.25.tar

pecl-memcache-php7.tar

首先把pecl-memcache-php7.tar.gz和 memcached-1.4.25.tar.gz文件上传到自定义的目录内
然后解压

进入目录

[root@IPanYing home]# cd pecl-memcache-php7

执行下phpize,如果无法执行请执行完整的PHP目录,因为你的PHP没有添加到环境目录
如: /usr/local/php7/bin/phpize

[root@IPanYing pecl-memcache-php7]# phpize
Configuring for:
PHP Api Version:         20151012
Zend Module Api No:      20151012
Zend Extension Api No:   320151012

[root@IPanYing pecl-memcache-php7]# ./configure –with-php-config=/usr/local/php7/bin/php-config

[root@IPanYing pecl-memcache-php7]# make && make install

如果安装顺利会提示:
Installing shared extensions:     /usr/local/php/lib/php7/extensions/no-debug-non-zts-20151012/

修改php.ini,让PHP添加memcache扩展
[root@IPanYing pecl-memcache-php7]# echo “[memcache]” >> /etc/php.ini
[root@IPanYing pecl-memcache-php7]# echo “extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/memcache.so” >> /etc/php.ini

接下来安装个事件触发管理:
[root@IPanYing pecl-memcache-php7]# yum install -y libevent-devel

然后重启httpd和nginx

接下来安装memcached
cd memcached-1.4.25

[root@IPanYing memcached-1.4.25]# ./configure

[root@IPanYing memcached-1.4.25]# make && make install

启用memcached
[root@IPanYing memcached-1.4.25]# /usr/local/bin/memcached -d -m 256 -l 127.0.0.1 -p 7788 -u root
#256为memcached占用的内存大小,127.0.0.1为服务器的地址 7788为启用的端口,root为用户组,当然这可以使用其他的主机,负载均衡的时候再讲解

查看下是否生效:
[root@IPanYing memcached-1.4.25]# ps aux|grep memcached
root      7654  0.0  0.0 331112  1032 ?        Ssl  14:32   0:00 /usr/local/bin/memcached -d -m 256 -l 127.0.0.1 -p 7788 -u root
root      7671  0.0  0.0 103260   852 pts/0    S+   14:34   0:00 grep memcached

然后站点根目录打印phpinfo()看看

memcache

memcache support enabled
Active persistent connections 0
Version 2.2.7
Revision $Revision$

如果显示以上信息表示PHP7已经完整支持memcache了哦!
到此完成php7+memcached

 

 

通过清心醉

php7.0.1-magento出现500错误

最近测试PHP7对magento的性能影响,结果出现500错误。一开始以为是伪静态出错搞的鬼,后来安装了个wordpress重写伪静态发现又没问题,后来GOOGLE了一翻:

在app/code/core/Mage/Core/Model/Layout.php文件里第555行:

$out .= $this->getBlock($callback[0])->$callback[1]();

修改为:$out .= $this->getBlock($callback[0])->{$callback[1]}();

就可以解决问题了。

通过清心醉

php添加pdo_mysql扩展

由于作者是完全编译安装的,所以需要进入编译的源文件里:

cd /temp/php-5.6.17/ext/pdo_mysql;

执行下:

/usr/local/php-5.6/bin/phpize

再预编译:

./configure –with-php-config=/usr/local/php-5.6/bin/php-config –with-pdo-mysql=/uar/local/mysql-5.6.24/

再编译安装:

make && make install

接着写入php.ini

echo “extension=/usr/local/php-5.6/lib/php/extensions/no-debug-non-zts-20121212/pdo_mysql.so” >> /mydata/php.ini

通过清心醉

Apache配置站点泛解析

作品前几篇文章写了:

Nginx配置域名泛解析

针对作者开发的盼盈网,由于是B2B的模式,需要对泛域名的解析

而且作者刚重构了WEB架构。APACHE的泛解析作者在进行共享:

首先我们要知道,Nginx把动态数据反向请求给apache

 

<VirtualHost 127.0.0.1:88>
DocumentRoot /var/www/ipanying
ServerName ipanying.com
ServerAlias *.ipanying.com
</VirtualHost>
<Directory “/var/www/ipanying”>
Options Indexes FollowSymLinks ExecCGI Includes
AllowOverride All
Require all granted
</Directory>

如此一来,apache就可以无限解析ipanying.com的二级域名了。

通过清心醉

zend加密

由于国外的开源程序基本都是PHP5.3 ++ 所以导致很多无法使用

zend-loader

作者是针对LINUX进行编写:

不管你使用的是XAMPP还是WDCP还是自行编译后的环境,默认都是不存在Zend Guard Loader

php -v查看下:

[root@ChenKuiZong]# php -v
PHP 5.5.31 (cli) (built: Aug 13 2015 13:47:29)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend Guard Loader v3.3, Copyright (c) 1998-2014, by Zend Technologies
with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies

说明是加载成功了的。

说下添加方法:

下载上面的两个文件

放在自己定义的目录

然后修改php.ini

文章最后面添加:

[zend]
zend_extension= /var/Zend/ZendGuardLoader.so
zend_extension= /var/Zend/opcache.so

记得修改成你那文件的目录位置

以上两个文件为ZEND 编译之后的,直接使用即可

同时说明下: 使用Zeend Guard加密的时候,注意下PHP的版本

5.5版本支持php 5.3 – 5.4

7.0开始的支持php 5.5 – 5.6

比如作者使用的是php 5.5.9

7.0加密文件的时候切记选择php 5.5 否则加密之后在环境上市无法使用的!

作者就是加密的时候疏忽的使用了php5.6的版本,结果导致请求500错误

我们再来看看探针:

Zend Guard Loader

Zend Guard Loader enabled
License Path no value
Obfuscation level 0

 

 

通过清心醉

WDCP-LANMP添加soap扩展

前提:你懂得如何升级WDCP的PHP版本

如作者现在使用的是PHP5.6.2的版本:

[root@QingXinZui files]# wget -c http://us1.php.net/distributions/php-5.6.2.tar.gz

下载对应的版本

[root@QingXinZui files]# tar zxvf php-5.6.2.tar.gz

解压

[root@QingXinZui soap]# cd php-5.6.2/ext/soap

进入目录内

[root@QingXinZui soap]# /www/wdlinux/php/bin/phpize

执行PHP配置

[root@QingXinZui soap]# ./configure –with-php-config=/www/wdlinux/php/bin/php-config –enable-soap

编译PHP

[root@QingXinZui soap]# make

[root@QingXinZui soap]# make install

安装

[root@QingXinZui files]# echo ‘extension=soap.so’ >>/www/wdlinux/etc/php.ini

写入配置文档

[root@QingXinZui files]# service httpd restart

重启服务

 

 

 

通过清心醉

WDCP(WDLINUX)安装VPN

最近老想翻墙看GOOGLE之类的了,可无奈翻墙软件要么收费要么免费的不稳定,居然自己有个香港的VPS,所以就试试.

由于作者的还有独立的VPS做FTP空间群(使用WDCP架设),直接开工吧.

把以下代码写成一个脚本.

yum remove -y pptpd ppp
iptables –flush POSTROUTING –table nat
iptables –flush FORWARD
rm -rf /etc/pptpd.conf
rm -rf /etc/ppp
arch=`uname -m`
wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-2.el6.$arch.rpm

yum -y install make libpcap iptables gcc-c++ logrotate tar cpio perl pam tcp_wrappers dkms kernel_ppp_mppe ppp
rpm -Uvh pptpd-1.3.4-2.el6.$arch.rpm

mknod /dev/ppp c 108 0
echo 1 > /proc/sys/net/ipv4/ip_forward
echo “mknod /dev/ppp c 108 0” >> /etc/rc.local
echo “echo 1 > /proc/sys/net/ipv4/ip_forward” >> /etc/rc.local
echo “localip 172.16.22.254” >> /etc/pptpd.conf
echo “remoteip 172.16.22.1-253” >> /etc/pptpd.conf
echo “ms-dns 8.8.8.8” >> /etc/ppp/options.pptpd
echo “ms-dns 8.8.4.4” >> /etc/ppp/options.pptpd

pass=`openssl rand 6 -base64`
if [ “$1” != “” ]
then pass=$1
fi

echo “vpn pptpd ${pass} *” >> /etc/ppp/chap-secrets

iptables -t nat -A POSTROUTING -s 172.16.22.0/24 -j SNAT –to-source `ifconfig  | grep ‘inet addr:’| grep -v ‘127.0.0.1’ | cut -d: -f2 | awk ‘NR==1 { print $1}’`
iptables -A FORWARD -p tcp –syn -s 172.16.22.0/24 -j TCPMSS –set-mss 1356
iptables -A OUTPUT -p tcp -m tcp –sport 1723 -j ACCEPT
iptables -A OUTPUT -p 47 -j ACCEPT
iptables -A INPUT -p tcp -m tcp –dport 1723 -j ACCEPT
iptables -A INPUT -p 47 -j ACCEPT

service iptables save

chkconfig iptables on
chkconfig pptpd on

service iptables start
service pptpd start

echo “VPN service is installed, your VPN username is vpn, VPN password is ${pass}”

在后台—安全管理—防火墙中,查看添加规则。
在目标端口中填写:1723  操作–选择通过。

提示:如果防火墙中已经有了这条规则请先删除再重新添加。

VPN用户管理:
直接编辑文件:,按照相同格式添加用户名和密码即可。
vi /etc/ppp/chap-secrets

修改密码之后别忘记了service pptpd restart哦

通过清心醉

PHP使用PDO连接ACCESS

上文说了使用php_com_dotnet.dll扩展来操作ACCESS数据库,但PHP默认已经不使用该方法了,而是基本统一使用了PDO的连接模式.

上一段代码,用于显示所有的admin_users管理员信息:

<?php

$db = new PDO(“odbc:driver={microsoft access driver (*.mdb)};dbq=”.realpath(“data.mdb”))or die(“连接出错”);  //连接参数
$data = $db->query(‘select * from admin_users’);
print_r($data->fetchAll());

?>

如果出现:Uncaught exception ‘PDOException’ with message ‘could not find driver’ in

那是因为PDO模式虽然是PHP推荐使用的,而PDO可以操作10多种数据库,官网没有全部打开

修改PHP.ini

;extension=php_pdo_odbc.dll

修改为:
extension=php_pdo_odbc.dll

小提示:在这里有很多php_pdo_xxx.dll扩展,其实就是PDO对那些数据库的支持

通过清心醉

ecshop Access is denied

ecshop重新安装之后,配置邮件服务器时,提示”ecshop Access is denied”,一开始以为端口被封了,又不想给服务器安装TELNET来测试连接.经过一番的测试,发现是SELINUX的安全机制的影响.

关闭SELINUX服务即可:

vi /etc/selinux/config

#SELINUX=enforcing修改为SELINUX=disabled

然后reboot即可.

通过清心醉

配置ecshop的Nginx+Apache+Mysql+Php环境

为什么一定要使用Nginx,还有搭配的教程作者在NGINX+APACHE+PHP+MYSQL整合已经说过了.

可是配置ecshop真的好麻烦,主要麻烦在PHP不能使用超过5.3的版本,否则就是修改所有的核心代码,那工程量会要人命的.

首先根据作者链接中所说,安装nginx+apache

确保nginx是可以正常访问的,并且apache启动是无错误的

注:在这假设目录使用apache的默认目录/var/www/html

然后我们来安装mysql,由于centos自带的mysql可能有点老,所以如果可以的话update下

yum install mysql mysql-server

记得顺便修改下mysql的root密码

mysql -u root;

mysql> use mysql;

mysql> UPDATE user SET password= PASSWORD(‘新密码’) WHERE user = ‘root’;

mysql> FLUSH PRIVILEGES;

然后:service mysqld restart;

重新进入MYSQL创建个UTF的ECSHOP数据库

create database if not exists ecshop default charset utf8 collate utf8_general_ci;

至于安装PHP,其实ecshop对PHP的最大限制是php 5.3.3

直接yum  也可以.

编译准备工作 yum groupinstall “Development tools”
然后是编译安装 PHP 需要用到的 devel 包:
yum install libxml2-devel gd-devel libmcrypt-devel libcurl-devel openssl-devel
接下来下载对应的PHP
编译安装 php的参数:
进入PHP目录
./configure –with-apxs2=/usr/local/apache2/bin/apxs –disable-cli –enable-shared –with-libxml-dir –with-gd –with-openssl –enable-mbstring –with-mcrypt –with-mysqli –with-mysql –enable-opcache –enable-mysqlnd –enable-zip –with-zlib-dir –with-pdo-mysql –with-jpeg-dir –with-freetype-dir –with-curl –without-pdo-sqlite –without-sqlite3

make
make install
cp php.ini-production /usr/local/lib/php.ini

是时候让 apache 知道有 php 的存在了,在 apache 配置文件 httpd.conf 中添加:
LoadModule php5_module modules/libphp5.so
#上面那行可能在编译安装 php 的过程中已经由系统自动添加了
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>

OK!重启 apache,人品好的人是不会出现问题的。

因为Nginx接收到的动态请求会转发给apache,所以不需要使用php-fpm,除非使用nginx+mysql+php的搭配。

好了,到此ecshop的Nginx+Apache+Mysql+Php环境配置完成。