3Pub / zh-CN three pub Tue, 07 Feb 2017 10:47:00 +0000 Tue, 07 Feb 2017 10:47:00 +0000 【转】 了解PHP中的钩子 register_shutdown_function /index.php/archives/47/ /index.php/archives/47/ Tue, 07 Feb 2017 10:47:00 +0000 Karp (PHP 4, PHP 5, PHP 7)

register_shutdown_function — Register a function for execution on shutdown

执行PHP文件的时候,php会拉起一个进程或者线程。当这个进程或者线程执行完毕、或者异常中断,或使用exit()、die() 函数中断的时候,就调用 register_shutdown_function 中定义的函数。我认为这个功能更类似于钩子,这个函数建立在PHP的线程或者进程的监控之上。

可以通过下面的例子清晰的看到该函数的作用:

<?php
header("content-type:text/html;chaset=utf-8");

register_shutdown_function('user_shutdown');
register_shutdown_function('user_shutdown_2');

function user_shutdown()
{
    echo "<font color='red'>hello world</font>";
    echo "<br/>";
}

function user_shutdown_2()
{
    echo "<font color='orange'>Are You OK</font>";
    echo "<br/>";
}

echo 11111;
echo '<br/>';
echo 22222;
echo '<br/>';

class Demo
{
    public function __construct()
    {
        register_shutdown_function(array($this, 'user_shutdown_3'));
    }

    public function getName()
    {
        echo "Hello China<br/>";
    }

    public function user_shutdown_3()
    {
        echo "I'm class shutdown method<br/>";
    }


}

$DemoClass = new Demo();
$DemoClass->getName();

执行该文件,最后的结果如下:

11111
22222
Hello China
hello world
Are You OK
I'm class shutdown method

由此我们可以得出,在一个进程或者线程之上可以注册多个register_shutdown_function 函数。并且可以在类中注册该函数。类中该函数必须对外部暴露,必须使用public关键字修饰。

原文转载自 : http://www.cnblogs.com/roverliang/p/6105467.html

]]>
0 /index.php/archives/47/#comments /index.php/feed/archives/47/
浏览器访问网站一个HTTP请求的执行流程是什么? /index.php/archives/46/ /index.php/archives/46/ Tue, 07 Feb 2017 02:19:00 +0000 Karp 访问一个网址http://www.libenfu.com 时,发生了些什么?

1. 用户在浏览器中输入网址

2. 浏览器拿到网址后通过DNS 查询它的ip地址

3. NS服务器根据网址返回ip地址 101.200.241.194

4. 浏览器得到地址后,和该地址建立一条通道(TCP连接)

5. 浏览器向服务器发出一个请求,包括 URL,协议版本号(http 1.0等),协议头(请求的方法get,客户端cookie,agent信息等等),协议内容等等

6. 服务器拿到请求后,根据请求中的内容找相应的数据,如果不能正常拿到,返回一个错误码(例如404),如果能正常拿到,返回一坨内容(包括正常的状态码,header头,例如是否压缩,是否分段传输等等.返回实体内容,例如页面的内容)

7. 断开连接吗?一般情况下,服务器就关闭了tcp连接,但是如果有Connection:keep-alive,则不会关闭tcp,下次有请求的时候还是用同一个连接了(http/1.1)

8.浏览器拿到返回的数据后,开始渲染html数据并展示给用户了.

写的 比较浅显, DNS 原理不做解释, TCP 握手,分手原理不解释, 服务端处理请求不做详解

]]>
0 /index.php/archives/46/#comments /index.php/feed/archives/46/
MongoDB 赎金事件 自省 /index.php/archives/45/ /index.php/archives/45/ Fri, 03 Feb 2017 12:42:00 +0000 Karp 昨天在从老家回北京的火车上逛微博,看到一篇去年的文章;

http://coolshell.cn/articles/17607.html?from=singlemessage

看这个文章是因为前阵子 gitlab 误删生产数据库问题 所以我就往前翻了翻;


诶 年前公司的测试mongoDB 数据库就一直存在问题 , 现象是数据库中数据总是丢失,
我们每天都测试,总是发现数据库中数据全部被删除,就剩下一个库 ,这么一个数据库是干嘛的也不清楚,
因为数据库是 java 自己在测试服务器上搭建的 我没有管理权限, 跟经理反应情况,经理让我看看什么问题 ....
无语 了 我没有权限,也不知道谁有权限,我一个phper ,还想着什么问题都给我,问题是我给有服务器权限呀!!!

甩锅也是没谁了....

行了上面吐槽差不多了 ,也介绍了遇到的问题, 因为没有服务器权限,我误以为是数据库管理员误删数据,
因为每天写入都数据都会生成,就是第二天数据丢失

简单说下 mongoDB 的二进制包安装 非常简单 我们公司java 安装 mongoDB 后并没有设置登陆权限...

属于没有账号没有密码的一个状态, 有ip地址 知道默认端口27017 就可以获取读写权限了!

昨天看了文章后,发现类似问题, 和我们公司测试服务器数据消失问题很类似,
今天下了火车,我看了下公司的测试mongoDB 结果如我猜想一样 让人黑了 还想勒索

alt

{
    "_id" : ObjectId("588112246d3d690225c9f717"),
    "info" : "Your DB is Backed up at our servers, to restore send 0.1 BTC to the Bitcoin Address then send an email with your server ip (or domain name)",
    "Bitcoin Address" : "1AwkbxDziATSXAbqkLhrqCSsqvGr3PHgjU",
    "amount" : "0.1 BTC (~$80)",
    "Email" : "mongobackup7@sigaint.org"
}

alt

我估计 告我们公司mongoDB的 哥们都疯了 弄了这么就 没人理他 连毛 多没给.

反映下中招的现象, 去年我自己的redis 也被人黑了 服务器让人挖矿了

简单几下这个教训吧 , 也是mongoDB 3.0 版本 支持的数据库管理工具真心很少, 好用的感觉就属 Robomongo 了

总结下:

  个人在这个事件上并不重视, 主要原因应该是 事不关己, 没有服务器权限, 没有想到被黑的问题;

 个人在解决问题的态度和能力上还是存在欠缺,  吃一堑长一智.
]]>
0 /index.php/archives/45/#comments /index.php/feed/archives/45/
MongoDB 二进制包安装 教程 /index.php/archives/44/ /index.php/archives/44/ Fri, 03 Feb 2017 11:53:00 +0000 Karp 二进制mongodb 包 解压有直接用不用编译

MongoDB 版本:3.4.2

alt

本人的安装路径是 /usr/local

1.解压安装:

wget  http://len7.cc/mongodb-linux-x86_64-rhel62-3.4.2.tgz.gz
cd /usr/local
tar -zxvf mongodb-linux-x86_64-rhel62-3.4.2.tgz.gz

得到解压目录,这里我把目录改个名为:mongodb

mv mongodb-linux-x86_64-3.0.7 mongodb

2.创建数据库和日志的目录:

cd mongodb
mkdir log
mkdir db

3.以后台运行方式启动:

(如果认证的话 在后边 加 --auth 表示认证如命令 ./bin/mongod --dbpath=/usr/local/mongodb/db --logpath=/usr/local/mongodb/log/mongodb.log --fork --auth )

这里先不认证:

./bin/mongod --dbpath=/usr/local/mongodb/db --logpath=/usr/local/mongodb/log/mongodb.log --fork

会显示如下内容:

about to fork child process, waiting until server is ready for connections.
forked process: 4623
child process started successfully, parent exiting
    

这里表示成功启动了....


iptables -A INPUT -p tcp -m tcp --dport 27017 -j ACCEPT 

设置开机启动:

这个是带认证的

echo "/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/db --logpath=/usr/local/mongodb/log/mongodb.log --fork --auth" >> /etc/rc.local

这个是不带认证的

echo "/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/db --logpath=/usr/local/log/mongodb.log --fork" >> /etc/rc.local

查看是否有启动相关信息

ps -ef |grep mongo

----------
netstat -nalupt | grep mongo

以下是启动的信息

 tcp   0   0 0.0.0.0:27017    0.0.0.0:*    LISTEN     4623/./bin/mongod

关闭mongodb

pkill mongod

killall mongod

添加数据库和用户

./bin/mongo
会出现相关信息如下:

MongoDB shell version: 3.4.2
connecting to: test
...


>use admin
switched to db admin

已经切换到了admin,然后创建用户:

>db.createUser(
  {
    user: "root",
    pwd: "root",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

回车,看到 Successfully added user: 表示添加成功。
然后可以查看一下刚才添加的:

> db.system.users.find()
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "bUhMAodI9w6OPDt9GL5Auw==", "storedKey" : "jBhWrBoYjwz86PqlCUTMkSh3h2A=", "serverKey" : "DMq1OYN45RfPjWIi4jFKNW6BJ6k=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" }, { "role" : "readWriteAnyDatabase", "db" : "admin" } ] }

如果你要想自己的数据库 mydbname ,则:

>use mydbname
switched to db mydbname

添加用户:

>db.createUser(
 {
   user: "test",
   pwd: "123456",
   roles: [
      { role: "readWrite", db: "mydbname" },
      { role: "read", db: "mydbname" }
   ]
 }
)

成功的话,你可以添加一张表试试,比如:

>db.createCollection("testtable")

以上是没有认证的情况下,客户端如:RobomongoMongoVUE 能直接连到数据库,如果认证了的话,这些客户端就连不上了,因为3.0以上的数据库不支持,
下边的配置就是为了让这些可视化客户端能连接:


>use admin
switched to db admin
>show collections
system.indexes
system.users
system.version
>db.system.version.find()
{ "_id" : "authSchema", "currentVersion" : 5 }

从上面可以看到"currentVersion" : 5
currentVersion为5则表示当前数据库的认证机制是SCRAM-SHA-1
而在mongodb 2.x中采用的默认认证机制是MONGODB-CR

然后我们需要把 5 改成 3,这样用客户端就能连上

命令如下:

>var schema=db.system.version.findOne({"_id" : "authSchema"})
>schema.currentVersion=3
3
>db.system.version.save(schema)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.system.version.find()
{ "_id" : "authSchema", "currentVersion" : 3 }

在这表示已经修改成功了。

因为之前创建过,所以先drop掉用户:

>use mydbname

>db.dropUser("mydbname");
true   ------ 表示 ok

>use admin

>db.dropUser("admin");

然后再创建:

>use admin
>db.createUser(
  {
    user: "root",
    pwd: "root",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
>db.auth("root","root")
1   -------- 表示ok
>use mydbname
>db.createUser(
 {
   user: "test",
   pwd: "123456",
   roles: [
      { role: "readWrite", db: "mydbname" },
      { role: "read", db: "mydbname" }
   ]
 }
)
>db.auth("test",,"123456");
1   -------- 表示ok

然后退出:

>exit
bye

看看是否在运行

ps -ef |grep mongo
netstat -nalupt | grep mongo

有的话,先关闭掉:

killall mongod

然后 以后台运行方式启动:加了 --auth,认证方式

./bin/mongod --dbpath=/usr/local/mongodb/db --logpath=/usr/local/mongodb/log/mongodb.log --fork --auth

如下内容表示成功启动:

about to fork child process, waiting until server is ready for connections.
forked process: 4627
child process started successfully, parent exiting

然后用客户端连接:RobomongoMongoVUE mongochef...

name:自己取一个连接的名称
server:你的服务器IP
port:27017
Username:test --- 刚才创建用户名
Password:123456  --- 刚才创建用户的密码
Database:mydbname

文章是从MongoDB开发群-第3群 339100233 分享群里的txt文件中copy

]]>
0 /index.php/archives/44/#comments /index.php/feed/archives/44/
2017 新年印象 /index.php/archives/43/ /index.php/archives/43/ Sat, 28 Jan 2017 14:46:00 +0000 Karp 2017 新年印象

今年的春节给我的感觉就是平淡,无聊, 去年一年的总结过了我就不在这里啰嗦了.

从北京到老家用了27小时 农历29早上才到家, 到老家回家吃口饭,就去上坟了.
上坟回来看望大奶家 ,收到了今年唯一的压岁钱.

过年回家什么年货也没带,就带了这个月工资回来给妈妈.

年三十早上7点开始 微信发红包到初一为止 发出去1k 多, 发的有点多呀. 真实钱不是现金.发红包就没什么截至了....

最有价值的就是有了一个值得我奋斗的目标, 缩短5年计划 还剩下2年时间, 让更好的自己站在你的面前, 再看一眼更好你的!

时刻提醒自己时间不多,需要用2年时间 成长为更好的自己! 加油 为了自己 为了未来!!!!!

]]>
0 /index.php/archives/43/#comments /index.php/feed/archives/43/
【转】 Linux下搭建FTP服务器 /index.php/archives/42/ /index.php/archives/42/ Tue, 24 Jan 2017 08:53:00 +0000 Karp Linux 下我们使用vsftp来作为我们的ftp server.

Server OS : Redhat 6.3

1.检查server上是否已经安装了vsftpd

rpm -qa | grep vsftpd

2.假如没有相应的vsftpd rpm包,我们需要下载安装

yum install vsftpd

3.配置vsftpd配置文件。


# ls /etc/vsftpd/
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

vim vsftpd.conf

修改对应的值如下:


anonymous_enable=NO     #禁止匿名用户登录 
local_enable=YES               #允许本地实体用户登录 
write_enable=YES               #允许用户上传数据  
local_umask=022                #建立新目录(755)与文件(644)的权限  
dirmessage_enable=YES  #若登录目录下有.message则会显示该文件内容  可以自己在登录目录下创建.message文件并写入信息  
xferlog_enable=YES           #启动日志文件记录,记录于/var/log/xferlog 
connect_from_port_20=YES #支持主动式连接功能 
xferlog_std_format=YES    #支持WuFTP的日志文件格式 
local_root=/home/xx/ftp      #限制登录用户只能在/home/xx/ftp目录下操作 
chroot_local_user=YES     #限制登录用户在主目录内local_root定义目录 
chroot_list  listen=YES       #使用stand alone方式启动vsftpd  
pam_service_name=vsftpd           #支持PAM模块的管理
userlist_enable=YES         #支持/etc/vsftpd/user_list文件内的账号登录控制 
tcp_wrappers=YES            #支持TCP Wrappers的防火墙机制

这里为了为了安全,我们可以编辑 user_list 这个文件,把禁止通过FTP登录系统的账号添加进去。这样的话,这些账户尝试远程登录的时候。会被拒绝登录。

举个栗子:

>ftp xxxxxxx

用户(xxxxxx:(none)): root
530 Permission denied.
登录失败。

我在server上创建了一个专门为ftp使用的账户 test_ftp,所以我在vsftpd.conf里面把local_root=/home/xx/ftp 改成了 local_root=/home/test_ftp/ftp

这样用test_ftp账户上传的文件会被放到 /home/test_ftp/ftp目录下。

4.重启vsftpd 服务,尝试使用ftp传输文件。

service vsftpd restart

5.在另外的机器上打开命令行:

ftp xxxxxx

配置顺利的话,现在就可以用ftp传输文件了。

原文地址 : http://blog.csdn.net/hitabc141592/article/details/41847067

]]>
0 /index.php/archives/42/#comments /index.php/feed/archives/42/
解决公司访问外网限制 nginx 反向代理 /index.php/archives/41/ /index.php/archives/41/ Sat, 21 Jan 2017 17:22:00 +0000 Karp 公司网管对一些游戏网站做了限制,请求失败 !

身为一名程序员,当然要想办法搞定!

网上的解决方案都是说些使用代理软件,做本地网络代理!

我不明白本地代理及网络代理的原理,同事说可以使用nginx 做反向代理
使用配置如下 :

server {

    listen       80;
    server_name  baidu.len7.cc;
    keepalive_timeout 90;
    client_max_body_size 4m;
    
    index index.js index.php index.html;

    location / {
        resolver 114.114.114.114;
        proxy_connect_timeout    10s;
        proxy_read_timeout       10s;
        proxy_pass             http://www.icodegame.com$request_uri;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        #proxy_set_header Host $host:$server_port;
        expires max;
    }
}

配置过程中遇到一些问题

Nginx解决“no resolver defined to resolve xxx.xxx”

文章中主要就是说明了 需要添加 :

resolver 114.114.114.114;

原因是Nginx0.6.18以后的版本中启用了一个resolver指令,在使用变量来构造某个server地址的时候一定要用resolver指令来制定DNS服务器的地址;

一开始使用 8.8.8.8 因为是google 需要翻墙呀! 拉到 就用的国内的DNS

]]>
0 /index.php/archives/41/#comments /index.php/feed/archives/41/
【转】nginx常用代理配置 /index.php/archives/40/ /index.php/archives/40/ Sat, 21 Jan 2017 16:54:00 +0000 Karp 因为业务系统需求,需要对web服务作nginx代理,在不断的尝试过程中,简单总结了一下常见的nginx代理配置。

1. 最简反向代理配置

在http节点下,使用upstream配置服务地址,使用server的location配置代理映射。

upstream my_server {                                                         
    server 10.0.0.2:8080;                                                
    keepalive 2000;
}
server {
    listen       80;                                                         
    server_name  10.0.0.1;                                               
    client_max_body_size 1024M;

    location /my/ {
        proxy_pass http://my_server/;
        proxy_set_header Host $host:$server_port;
    }
}

通过该配置,访问nginx地址http://10.0.0.1:80/my的请求会被转发到my_server服务地址http://10.0.0.2:8080/


需要注意的是,如果按照如下配置:

upstream my_server {                                                         
    server 10.0.0.2:8080;                                                
    keepalive 2000;
}
server {
    listen       80;                                                         
    server_name  10.0.0.1;                                               
    client_max_body_size 1024M;

    location /my/ {
        proxy_pass http://my_server;
        proxy_set_header Host $host:$server_port;
    }
}

那么,访问nginx地址http://10.0.0.1:80/my的请求会被转发到my_server服务地址http://10.0.0.2:8080/my。这是因为proxy_pass参数中如果不包含url的路径,则会将location的pattern识别的路径作为绝对路径。

2. 重定向报文代理

即便配置了nginx代理,当服务返回重定向报文时(http code为301或302),会将重定向的目标url地址放入http response报文的header的location字段内。用户浏览器收到重定向报文时,会解析出该字段并作跳转。此时新的请求报文将直接发送给服务地址,而非nginx地址。为了能让nginx拦截此类请求,必须修改重定向报文的location信息。

location /my/ {
    proxy_pass http://my_server;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /my/;
}

使用proxy_redirect可以修改重定向报文的location字段,例子中会将所有的根路径下的url代理到nginx的/my/路径下返回给用户。比如服务返回的重定向报文的location原始值为/login,那么经过nginx代理后,用户收到的报文的location字段为/my/login。此时,浏览器将会跳转到nginx的/my/login地址进行访问。

需要注意的是,服务返回的重定向报文的location字段有时会填写绝对路径(包含服务的ip/域名和端口),有时候会填写相对路径,此时需要根据实际情况进行甄别。

location /my/ {
    proxy_pass http://my_server;
    proxy_set_header Host $host:$server_port;

    proxy_redirect http://my_server/ http://$host:$server_port/my/;
}

上述配置便是将my_server服务的根路径下的所有路径代理到nginx地址的/my/路径下。当nginx配置只有一个server时,http://$host:$server_port前缀可以省略。

3. 报文数据替换

使用nginx代理最牛(dan)逼(sui)的情况就是http响应报文内写死了服务地址或web绝对路径。写死服务地址的情况比较少见,但也偶尔存在。最棘手的是写死了web绝对路径,尤其是绝对路径都没有公共前缀。举个例子来说:

**一般的web页面会包含如下类似路径:
**

    /public:用于静态页面资源,如js脚本/public/js,样式表/public/css,图片/public/img等。
    /static:和/public类似。
    /api:用于后台服务API接口。
    /login:用于登录验证。
    其他。

对于这样的服务,可能的代理配置如下:

location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /my/;
}
location /login/ {
    proxy_pass http://my_server/public;
    proxy_set_header Host $host:$server_port;
}
location /public/ {
    proxy_pass http://my_server/public;
    proxy_set_header Host $host:$server_port;
}
location /api/ {
    proxy_pass http://my_server/api;
    proxy_set_header Host $host:$server_port;
}

由于web页面或静态资源内写死了类似的绝对路径,那么对于用户来说,通过页面内的链接进行跳转时,都会请求到nginx服务对应的路径上。

一旦存在另一个服务也包含类似的路径,也需要nginx进行代理,那么矛盾就出现了:访问nginx的同一个路径下的请求究竟转发给哪一个服务?

要解决这个问题,必须在用户收到报文前,将报文的数据中包含的绝对路径都添加统一的前缀,如/my/public,/my/api,/my/login,这样nginx代理配置则可以简化为:

location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /my/;
}
location /other/ {
    proxy_pass http://other_server/;
    proxy_set_header Host $host:$server_port;

    proxy_redirect / /other/;
}

nginx的ngx_http_sub_module模块提供了类似的报文数据替换功能,该模块默认不会安装,需要在编译nginx时添加--with-http_sub_module参数,或者直接下载nginx的rpm包。

使用sub_filter对数据包进行替换的语法如下:

location /my/ {
    proxy_pass http://my_server/;
    proxy_set_header Host $host:$server_port;
    
    sub_filter 'href="/' 'href="/my/';
    sub_filter 'src="/' 'src="/my/';
    sub_filter_types text/html;
    sub_filter_once  off;
}

上述配置会将/my/下的所有响应报文内容的href="/替换为href="/my,以及src="/替换为src="/my,即为所有的绝对路径添加公共前缀。

** 注意_,_如果需要配置多个sub_filter,必须保证nginx是1.9.4版本之上的。
**

4. 总结

即便如此,sub_filter也不能解决所有问题。目前流行的js框架都会有自动渲染url的功能,也就是说,很多绝对路径并非写死在静态页面内,也是由js代码框架动态生成的,面对这样的情况,sub_filter也是无能为力了。对于这样的情况,笔者只能由衷地奉劝,还是安静的改代码吧!

**感谢作者的归纳总结:
**

原文地址 : http://www.cnblogs.com/fanzhidongyzby/p/5194895.html

]]>
0 /index.php/archives/40/#comments /index.php/feed/archives/40/
【转】Nginx解决“no resolver defined to resolve xxx.xxx” /index.php/archives/39/ /index.php/archives/39/ Sat, 21 Jan 2017 15:18:00 +0000 Karp server { listen 80; server_name *.b2b.sdy.com; location / { if ($host ~* (.*)\.b2b\.sdy\.com) { set $company $1; proxy_pass http://www.baidu.com/$company; } }

如果使用域名作为反向代理的地址的话会在Nginx0.6.18以后的版本中都会提示“ no resolver defined to resolve ”的类似错误,而在proxy_pass 中直接设置地址却不会。

原因是Nginx0.6.18以后的版本中启用了一个resolver指令,在使用变量来构造某个server地址的时候一定要用resolver指令来制定DNS服务器的地址,所以解决这个问题的方法很简单:

在nginx的配置文件中的http{}部分添加一行resolver 8.8.8.8;即可

本文出自 “精忠报国” 博客,请务必保留此出处
http://xinsir.blog.51cto.com/5038915/1541612


**下文当中 配置项较多 请综合查看
**
最近发现将nginx跟php放在同一台服务器上压力挺大的。于是就做了个动静分离,把nginx和php分别部署在两台服务器上。

好景不长,发现后台验证码,死活刷不出来,只有一个裂图。

想了想该不会是动静分离的原因吧。登上服务器一看,果然nginx服务器上并没有生成这个图片,图片都存在了php服务器上。

这样想着,有没有什么办法能直接获取到后端呢。想着用proxy_pass代理到后端看看

location ~* /media/captcha/([a-z]*)/(.*)$ {
    proxy_pass http://proxy.test.com:88/captcha/$1/$2;
}

没想到代理后竟然报错502

于是查看日志

    2015/10/05 15:17:25 [error] 7589#0: *549967 no resolver defined to resolve proxy.test.com,
    client: 180.191.103.242, 
    server: www.test.com,                 
    request: "GET /captcha/base/299b5dd35f902f3b7502a157071f49bc.png HTTP/1.1", 
    host: "www.test.com"

发现很多这样的日志,google 之,原来是没有定义 reoliver

 location ~* /captcha/([a-z]*)/(.*)$ {
    resolver 8.8.8.8;
    proxy_pass  http://proxy.test.com:88/captcha/$1/$2;
}

这样一改就ok了。

由这个问题,还发现了一个其他的问题。也在这里做个记录吧。

当初这个动静分离之前,还想着做个反向代理。因为非80端口,转发。

首页打开倒是正常,但是样式全没了,图片也打不开。

server {
    listen       81;
    server_name  www.test.com; 
    access_log  logs/test.access.log;
    keepalive_timeout 90;
    client_max_body_size 4m;
    location / {
        proxy_redirect off;
        proxy_set_header Host $host:81; #这个地方要跟listen端口相同,否则很多页面就只是www.test.com:80 而不是81端口了。
        #以下两行为获取用户真实IP
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #一下设置防止php文件获取为502报错       
        proxy_set_header Connection "";
        proxy_connect_timeout 400s;     #连接后端服务器超时时间
        proxy_read_timeout 400s;        #后端服务器响应请求超时时间
        proxy_send_timeout 400s;        #后端服务器发送数据超时时间
        proxy_buffer_size 32k;          #代理请求缓存区大小
        proxy_buffers 4 64k;    #系统繁忙时可申请的proxy_buffers大小
        proxy_busy_buffers_size 128k; #系统繁忙时可申请的proxy_buffers大小
        proxy_ignore_client_abort on; #不允许客户端关闭连接
        proxy_pass http://192.168.0.10:81; 81端口后面,最好也不要再添加/;否则会引发一些想不到的问题
   }
}

原文地址不详 仅展示 转载地址 : http://www.xue163.com/334/1654/3346799.html

]]>
0 /index.php/archives/39/#comments /index.php/feed/archives/39/
phpinfo 加载不完整问题 /index.php/archives/38/ /index.php/archives/38/ Wed, 18 Jan 2017 06:08:00 +0000 Karp 诶 这个问题 记得在第一家公司的时候遇到过,当时的现象就是,phpinfo 加载到session 就不加载了 ,前面加载了mysql 等拓展

实际使用其他功能都是ok的,但是登陆就是存在问题, 经测试 session 获取失败,无法存储 ;

打印 phpinfo 发现仅加载一半,剩余部分加载失败;

报告给金龙, 最后告诉我应该是php-fpm 启动不成功导致;

我们线上服务器 使用 nginx - php-fpm 在服务器上 php -m 显示拓展加载 都是ok 的 . 最后也就没有深究 ,当时就是个菜鸟(现在也是)

今天 又遇到类似问题 phpinfo 加载 一小部分就停止了! 所以定位 和 去年的 错误是相同的;

alt

试着重启了 php-fpm 重新加载

#  pkill -15 php-fpm 

#  php-fpm

加载还是没改变 ..... 郁闷 我现在 就开始瞎猜 以为是php编译失败导致的. 我就重新编译了一个php


#  wget http://mirrors.sohu.com/php/php-5.6.2.tar.gz
#  tar zxf php-5.6.2.tar.gz 
#  yum install gcc gcc-c++ libxml2 libxml2-devel libjpeg-devel libpng-devel freetype-devel openssl-devel libcurl-devel libmcrypt-devel
#  cd php-5.6.2
#  ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --enable-pcntl --enable-mysqlnd --enable-opcache --enable-sockets --enable-sysvmsg --enable-sysvsem  --enable-sysvshm --enable-shmop --enable-zip --enable-ftp --enable-soap --enable-xml --enable-mbstring --disable-rpath --disable-debug --disable-fileinfo --with-mysql --with-mysqli --with-pdo-mysql --with-pcre-regex --with-iconv --with-zlib --with-mcrypt --with-gd --with-openssl --with-mhash --with-xmlrpc --with-curl --with-imap-ssl

#  make && make install

重新编译php 将原有 php-fpm kill 掉 配置新的php-fpm.conf 和 php.ini


#  cp php.ini-development /usr/local/php/etc/

#  cp php-fpm.conf /usr/local/php/etc/

启动 编译后的 php-fpm
然并软 没有任何用 效果还是一样

瞬间就不会玩了 脑袋炸了 百度查询关键次 nginx - php-fpm 页面加载不完整

网上说 出的原因有很多 有的说 短标签 问题 .... 反正就是没有对的 ..............

突然想到一个问题 , nginx 加载问题 的话 有 error.log 日志 为啥我不看呢....
太傻了

找到 error.log 日志

#  tail -f error.log 

2017/01/18 12:03:09 [error] 32202#0: *262 FastCGI sent in stderr: "PHP message: PHP Warning:  phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /home/jzb/alpha1125/test.php on line 2" while reading response header from upstream, client: 10.159.95.251, server: test.com, request: "GET /test.php HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "test.com", referrer: "http://test.com/test.php"


2017/01/18 12:03:09 [crit] 32202#0: *262 open() "/usr/localinx/fastcgi_temp/5/04/0000000045" failed (13: Permission denied) while reading upstream, client: 10.159.95.251, server: test.com, request: "GET /test.php HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "test.com", referrer: "http://test.com/test.php"

在访问 phpinfo 页面时 error.log 输出上述日志 记录 第一个错误是 时区问题, php 默认时区需要手动设置下 php.ini

copy 错误百度一下 解决方案 就是 php.ini 中

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = PRC

修改完重启 php-fpm 查看error.log 日志 ok 第一个错误不报了,现在需要

*262 open() "/usr/localinx/fastcgi_temp/5/04/0000000045" failed (13: Permission denied) while reading ... 问题

这个问题 我就不查了 一看就知道权限有问题 手动查看

[root@localhost nginx]# ll -a
total 44
drwxr-xr-x  11 jzb_service root   4096 Jan 17 18:57 .
drwxr-xr-x. 18 jzb_service root   4096 Jan 18 11:02 ..
drwx------   2 jzbzip      root   4096 Nov  8 09:34 client_body_temp
drwxr-xr-x   2 jzb_service root   4096 Jan 18 11:56 conf
drwx------  12 jzbzip      root   4096 Aug 23 17:36 fastcgi_temp
drwxr-xr-x   2 jzb_service root   4096 Dec 21 14:58 html
drwxr-xr-x   2 jzbzip      jzbzip 4096 Jan 18 11:37 logs
drwx------  12 jzbzip      root   4096 Aug 25 18:09 proxy_temp
drwxr-xr-x   2 jzb_service root   4096 Aug 22 20:31 sbin
drwx------   2 jzbzip      root   4096 Aug 22 20:33 scgi_temp
drwx------   2 jzbzip      root   4096 Aug 22 20:33 uwsgi_temp


[root@localhost nginx]# chown -R jzbzip:jzbzip *
[root@localhost nginx]# ll
total 36
drwx------  2 jzbzip jzbzip 4096 Nov  8 09:34 client_body_temp
drwxr-xr-x  2 jzbzip jzbzip 4096 Jan 18 11:56 conf
drwx------ 12 jzbzip jzbzip 4096 Aug 23 17:36 fastcgi_temp
drwxr-xr-x  2 jzbzip jzbzip 4096 Dec 21 14:58 html
drwxr-xr-x  2 jzbzip jzbzip 4096 Jan 18 11:37 logs
drwx------ 12 jzbzip jzbzip 4096 Aug 25 18:09 proxy_temp
drwxr-xr-x  2 jzbzip jzbzip 4096 Aug 22 20:31 sbin
drwx------  2 jzbzip jzbzip 4096 Aug 22 20:33 scgi_temp
drwx------  2 jzbzip jzbzip 4096 Aug 22 20:33 uwsgi_temp

用户是ok 但用户组有问题 干脆就全部都 重新授权用户, 用户组

现在查看 error.log ok 不报错了

查看 phpinfo 页面 加载成功 . 沃日 就因为这点原因就浪费了我一上午时间 ,真是够了,

总结一下 :

    1. 首先,错误认为是 php-fpm 启动不成功导致 错误 重启 php-fpm                失败
    2. 认为 php 编译不完整 重新编译php进行测试 错误依旧                        失败
    3. 查看error.log 日志 根据错误提示, 依次解决问题                           成功

上面是我遇到bug 后 解决问题的处理逻辑 ;

感慨一下: 面试总有人问遇到bug 如何解决问题 我都会说做日志监控 ,复现bug

但是 说到缺做不.........

如果能一上来就查看 错误日志 问题实际没有那么难 , 前两项 全凭 自己主观臆断,根本没有根据;

这不应该是解决bug 的方式, 吃一堑长一智 以后 处理bug 不能不过脑子乱搞 蒙对还是需要靠运气的!

]]>
0 /index.php/archives/38/#comments /index.php/feed/archives/38/