nginx错误:File Not Found

使用php-fpm解析PHP,”No input file specified”,”File not found”是令nginx新手头疼的常见错误,原因是php-fpm进程找不到SCRIPT_FILENAME配置的要执行的.php文件,php-fpm返回给nginx的默认404错误提示。

比如我的网站doucument_root下没有test.php,访问这个文件时通过抓包可以看到返回的内容。

HTTP/1.1 404 Not Found
Date: Fri, 21 Dec 2012 08:15:28 GMT
Content-Type: text/html
Proxy-Connection: close
Server: nginx/1.2.5
X-Powered-By: PHP/5.4.7
Via: 1.1 c3300 (NetCache NetApp/6.0.7)
Content-Length: 16

File not found.

很多人不想用户直接看到这个默认的404错误信息,想自定义404错误.

给出解决办法前我们来先分析下如何避免出现这类404错误,然后再说真的遇到这种情况(比如用户输入一个错误不存在的路径)时该怎么办,才能显示自定义的404错误页。

一、错误的路径被发送到php-fpm进程

出现这类错误,十个有九个是后端fastcgi进程收到错误路径(SCRIPT_FILENAME),而后端fastcgi收到错误路径的原因大都是配置错误。

常见的nginx.conf的配置如下:
[codesyntax lang=”php”]

server {
    listen   [::]:80;
    server_name  example.com www.example.com;
    access_log  /var/www/logs/example.com.access.log;  

    location / {
        root   /var/www/example.com;
        index  index.html index.htm index.pl;
    }

    location /images {
        autoindex on;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com$fastcgi_script_name;
        include fastcgi_params;
    }
}

[/codesyntax ]
这个配置中有很多不合理的地方,其中一个明显的问题就是root指令被放到了location / 块。如果root指令被定义在location块中那么该root指令只能对其所在的location生效。其它locaiont中没有root指令,像location /images块不会匹配任何请求,需要在每个请求中重复配置root指令来解决这个问题。因此我们需要把root指令放在server块,这样各个location就会继承父server块定义的$document_root,如果某个location需要定义一个不同的$document_root,则可以在location单独定义一个root指令。

另一个问题就是fastCGI参数SCRIPT_FILENAME 是写死的。如果修改了root指令的值或者移动文件到别的目录,php-fpm会返回“No input file specified”错误,因为SCRIPT_FILENAME在配置中是写死的并没有随着$doucument_root变化而变化,我们可以修改SCRIPT_FILENAME配置如下:

[codesyntax lang=”php”]
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
[/codesyntax ]

所以我们不能忘记在server块中配置root指令,不然$document_root的值为空,只会传$fastcgi_script_name到php-fpm,这样就会导致“No input file specified”错误。

二、请求的文件真的不存在

当nginx收到一个不在的.php文件的请求时,因为nginx只会检查$uri是否是.php结尾,不会对文件是否存在进行判断,.php结尾的请求nginx会直接发给php-fpm处理。php-fpm处理时找不到文件就会返回“No input file specified”带着“404 Not Found”头。

解决办法:

我们在nginx拦截不存在的文件,请求并返回自定义404错误

使用 try_files 捕捉不存在的urls并返回错误。
[codesyntax lang=”php”]

location ~ .php$ {
 try_files $uri =404;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME ....
 ...................................
 ...................................
}

[/codesyntax ]
上面的配置会检查.php文件是否存在,如果不存在,会返回404页面。

 

本文参考至:  运维与架构

MySQL常用备份方法

mysql按照备份恢复方式分为逻辑备份和物理备份。逻辑备份是备份sql语句,在恢复的时候执行备份的sql语句实现数据库数据的重现,物理备份就是备份数据文件了,比较形象点就是cp下数据文件,但真正备份的时候自然不是的cp这么简单。

这2种备份各有优劣,一般来说,物理备份恢复速度比较快,占用空间比较大,逻辑备份速度比较慢,占用空间比较小

下面介绍以下3种常用的备案方法

一、mysqldump工具备份

mysqldump由于是mysql自带的备份工具,所以也是最常用的mysql数据库的备份工具。支持基于InnoDB的热备份。但由于是逻辑备份,所以速度不是很快,适合备份数据量比较小的场景。
mysqldump完全备份+二进制日志 —>实现时间点恢复

温备:

在使用MyISAM引擎中,只能使用温备份,这时候要防止数据的写入,所以先加上读锁

这时候可以进入数据库手动加读锁。这样比较麻烦,在mysqldump工具中直接有一个加锁的选项

[codesyntax lang=”sql”]
mysqldump –databases mydatabase –lock-all-tables –flush-logs> /tmp/backup-`date +%F-%H-%M`.sql
[/codesyntax]

如果是针对某张表备份,只要在数据库名称后面加上表名称就行了

这里注意,要实现时间点的恢复,加上–flush-logs选项,在使用备份文件恢复后,然后再基于二进制日志进行时间点的恢复

时间点的恢复方法

[codesyntax lang=”sql”]
mysqlbinlog mysql-bin.000000x > /tmp/PointTime.sql
[/codesyntax]

然后用mysql命令导入这个sql脚本就行了

热备:如果使用的是InnoDB引擎,就不必进行对数据库加锁的操作,加一个选项既可以进行热备份:–single-transaction

[codesyntax lang=”sql”]
mysqldump –databases mydb –single-transaction –flush-logs –master-data=2 > /tmp/backup-`date +%F-%H-%M`.sql”
[/codesyntax]

注意:
恢复的时刻关闭二进制日志
mysql>set sql_log_bin=0;
因为这是基于逻辑备份方式,在恢复日志时会执行sql语句插入数据,而恢复时候插入数据的日志没有意义。

二、基于LVM快照备份

在物理备份中 ,有基于文件系统的物理备份(LVM的快照),也可以直接用tar之类的命令打包。但这些只能进行冷备份
不同的存储引擎能备份的级别也不一样,MyISAM能备份到表级别,而InnoDB不开启每表一文件的话就只能备份整个数据库。

下面就介绍下使用LVM的快照功能进行备份:

1. 为了安全 在数据库上施加读锁

[codesyntax lang=”sql”]
mysql>FLUSH TABLES WITH READ LOCK;
[/codesyntax]

2. 刷新一下二进制日志,便于做时间点恢复

[codesyntax lang=”sql”]
mysql>FLUSH LOGS;
[/codesyntax]

3. 创建快照卷

[codesyntax lang=”sql”]
lvcreate –L 1G –s –n data-snap –p –r /dev/myvg/mydata
[/codesyntax]

4. 进入数据库释放读锁

[codesyntax lang=”sql”]
UNLOCK TABLES;
[/codesyntax]

5. 挂载快照卷进行备份

[codesyntax lang=”sql”]
mount –r /dev/myvg/data-snap /mnt/snap
[/codesyntax]

6. 对/mnt/snap下的文件进行打包备份
还原的时候,关闭mysqld,然后备份二进制日志后将原来备份的文件还原进去,然后通过二进制日志还原到出错的时间点(通过二进制还原时间点的时候不要忘了暂时关闭二进制日志)

三、使用percona提供的xtrabackup(推荐)

支持InnoDB的物理热备份,支持完全备份,增量备份,而且速度非常快,而且支持InnoDB引擎的数据在不同数据库迁移
为了让xtrabackup支持更多的功能扩展,配置InnoDB每表一个文件的功能
在my.cnf的mysqld中加入此项: innodb_file_per_table=1
此项不启用将不支持备份单独的表
但如果之前没有启用这个选项,要实现单表一文件的话,可以用mysqldump导出数据,然后启用该选项,恢复回去后就是单表一文件了

首先下载xtrabackup,下载地址:http://www.percona.com/software/percona-xtrabackup,可以直接下载rpm包安装即可。

xtrabackup有完全备份,增量备份和部分备份(前面开启innodb每表一文件,就是为了此功能)

1.完全备份整个数据库

[codesyntax lang=”sql”]
innobackupex –user=root –password=123456 /tmp/backup
[/codesyntax]

此时会在/tmp/backup目录下生成以时间为名的文件夹,里面是备份文件

在这里,备份的数据还不能直接用来还原。因为备份数据中会含有尚未提交的事务或者未同步到数据文件中的事物。这里需要用prepare回滚事物使数据文件处于一致性。

[codesyntax lang=”bash”]
innobackupex –apply-log /tmp/backup/dir
[/codesyntax]

处理完成后才能用来还原数据,用此命令还原

[codesyntax lang=”bash”]
innobackupex –copy-back /tmp/backup/dir
[/codesyntax]

要实现时间点还原,还是需要使用二进制日志

2.增量备份

增量备份支持Innodb,对于MyISAM只能完全备份

[codesyntax lang=”bash”]
innobackupex –incremental /tmp/backup/incremental –incremental-basedir=/tmp/backup/dir
[/codesyntax]

在进行一次增量备份–incremental-basedir要指向上一次增量备份的目录

如果要进行还原,先进行prepare处理

这里处理的方式,将备份合并

[codesyntax lang=”bash”]
innobackupex –apply-log –redo-only /tmp/backup/dir
innobackupex –apply-log –redo-only /tmp/backup/dir –incremental-dir=/tmp/backup/incremental
[/codesyntax]

3. 使用全备份还原

至于差异备份,只要每次将basedir指向完全备份文件夹就行了

最后再废话一句:要实现时间点还原,是需要使用二进制日志的,所以备份好二进制日志至关重要。除非在恢复时间点和上一次备份时间点这段时间的数据对你来说无所谓。

本文参考至: 威易网

MySQL:Can’t connect to local MySQL server through socket

今天启动MySQL的时候 突然间提示:

Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

上网搜索了一下解决方法,结果发现这个问题很有可能是由于MySQL服务器未启动导致的 于是,赶紧用service命令查看一下mysqld的启动情况

[codesyntax lang=”bash”]

service mysqld status

[/codesyntax]

结果的确发现服务未启动  于是赶紧将服务启动,结果就可以正常使用了

[codesyntax lang=”bash”]

service mysqld start

[/codesyntax]

不过  后来在网上查看了一下 ,结果发现出现这个问题也有可能是在安装MySQL的时候mysql.sock文件出现问题,如使用上述方法仍旧出现报错的话,则需要查看一下mysql.sock文件的情况了

[codesyntax lang=”bash”]

mysql -u [user] -p -S /var/lib/mysql/mysql.sock

[/codesyntax]

好了 就这样问题就完全解决了~~

python下载文件的三种方法

Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块。
当然你也可以利用ftplib从ftp站点下载文件。此外Python还提供了另外一种方法requests。
下面来看看三种方法是如何来下载zip文件的:

方法一:

[codesyntax lang=”python”]
import urllib
import urllib2
import requests
print “downloading with urllib”
url = ‘http://www.iprayz.com/test/demo.zip’
print “downloading with urllib”
urllib.urlretrieve(url, “demo.zip”)
[/codesyntax]

方法二:

[codesyntax lang=”python”]
import urllib2
print “downloading with urllib2”
url = ‘http://www.iprayz.com/test/demo.zip’
f = urllib2.urlopen(url)
data = f.read()
with open(“demo2.zip”, “wb”) as code:
code.write(data)
[/codesyntax]

方法三:

[codesyntax lang=”python”]
import requests
print “downloading with requests”
url = ‘http://www.iprayz.com/test/demo.zip’
r = requests.get(url)
with open(“demo3.zip”, “wb”) as code:
code.write(r.content)
[/codesyntax]

看起来使用urllib最为简单,一句语句即可。当然你可以把urllib2缩写成:

[codesyntax lang=”python”]
f = urllib2.urlopen(url)
with open(“demo2.zip”, “wb”) as code:
code.write(f.read())
[/codesyntax]

设置常见站点视频分享

现在很多视频站点上都提供了分享的功能,在进行收集转载的过程中,很多朋友会禁止FLV、SWF等视频文件自动播放,但在某些情况下也有些人需要让他们自动播放。
今天总结了一下,针对不同站点提供的视频分享,让其能根据自己喜好来进行播放是否自动的设定。

 

搜狐视频自动播放详解

自动播放:

<embed src="http://news.sohu.com/player/20091120/Main.swf" flashVars="type=Singleton&domain=inner&skin=0&flv=http://data.vod.sohu.com/20090605/4dc649f4-b8c8-44b0-a01e-9e9befb32ac4V.mp4&cover=&autoPlay=true&recommend=http://s.sohu.com/tv_tuijian.html&pageUrl=http://tv.sohu.com/20090605/n264359598.shtml" quality="high" bgcolor="#000000" width="510" height="420" allowFullScreen="true" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />

不自动播放:

<embed src="http://news.sohu.com/player/20091120/Main.swf" flashVars="type=Singleton&domain=inner&skin=0&flv=http://data.vod.sohu.com/20090605/4dc649f4-b8c8-44b0-a01e-9e9befb32ac4V.mp4&cover=&autoPlay=false&recommend=http://s.sohu.com/tv_tuijian.html&pageUrl=http://tv.sohu.com/20090605/n264359598.shtml" quality="high" bgcolor="#000000" width="510" height="420" allowFullScreen="true" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />

优酷视频自动播放详解

不自动播放:

http://player.youku.com/player.php/sid/XNDA3OTM4NA==/v.swf

自动播放:

http://player.youku.com/player.php/sid/XNDA3OTM4NA==/p/1.swf

代码修改:将原始地址中的v换成p/1。

也可以直接加上参数来进行修改
加上自动播放参数isAutoPlay=true,使用&连接。
如原始地址:

http://player.youku.com/player.php/sid/XNDA3OTM4NA==/v.swf。

播后地址:

http://static.youku.com/v1.0.0270/v/swf/qplayer.swf?VideoIDS=XNDA3OTM4NA==&embedid=-&showAd=0

1、经修改后,能自动播放,不显示相关视频,不插播广告的地址:

http://static.youku.com/v/swf/qplayer.swf?VideoIDS=XNDA3OTM4NA=&isAutoPlay=true&isShowRelatedVideo=false&embedid=-&showAd=0

2、如果有的朋友想将这段视频以MP3的格式出现贴子中,那么就用下面这段代码来实现吧,同样只需将绿色部分的代码替换就OK了,非常简单实用,最重要是可加入在空间、博客做为背景音乐。

http://static.youku.com/v/swf/qplayer.swf?VideoIDS=XNDA3OTM4NA=&isAutoPlay=true&isShowRelatedVideo=false&embedid=-&showAd=0#.mp3

注意变化,后缀已变成.mp3;其中,isShowRelatedVideo=false:不显示相关视频,showAd=0:不显示广告。
这时就可用我们平时习惯用的自动播放的代码,直接把地址贴进去,这样很方便得到后缀为.MP3的视频地址了。其实,这个方法只是换了个播放器而已,给了我们一个是MP3播放器的假象。

[color=#8FBC8F][MUSIC]http://static.youku.com/v/swf/qplayer.swf?VideoIDS=XNDA3OTM4NA=&isAutoPlay=true&isShowRelatedVideo=false&embedid=-&showAd=0#.mp3[/MUSIC]][/color]

如果想要控制声音、进度或者*,还需要用鼠标拉动视频上的那个露出部分很少的工具条。
在原始地址的【=】和【/v】之间,加入“&isAutoPlay=true”。
如原始地址:

http://player.youku.com/player.php/sid/XNDA3OTM4NA==/v.swf

那么在=和/v之间,加入“&isAutoPlay=true”,就得到了可以自动播放的视频地址:

http://player.youku.com/player.php/sid/XNDA3OTM4NA==&isAutoPlay=true/v.swf

56视频播放

56视频有两种,一种是相册视频,如:
相册FLASH地址:http://www.56.com/deux_83949727.swf,这个地址不能自动播放,将地址中的deux改成p2,得到自动播放的地址:http://www.56.com/p2_83949727.swf。
另一种是视频,如:
视频的FLASH地址:

http://www.56.com/n_v41_/c24_/28_/18_/xuhui8491_/zhajm_124019538955_/226000_/0_/42719013.swf

这个地址不能自动播放,需要对原始地址进行修改:
1、打开这个视频FLASH地址:

http://www.56.com/n_v41_/c24_/28_/18_/xuhui8491_/zhajm_124019538955_/226000_/0_/42719013.swf

其目的是通过打开视频,看看出现的地址有没有变化,如地址没有变化,再换一种方法打开,直至出现的地址发生了变化。
打开视频地址的方法很多,如将地址粘贴到浏览器中打开,或将地址写入你的博客日记、QQ空间日记、word文档中打开。
本人是通过IE浏览器打开的,在浏览器地址栏出现的地址是:

http://www.56.com/flashApp/56.swf?img_host=v41.56.com&host=c24.56.com&pURL=28&sURL=18&user=xuhui8491&URLid=zhajm_124019538955&totaltimes=226000&effectID=0&flvid=42719013&56.swf

2、将打开后地址中的【flashApp/56.swf?】改成【flashApp/v_player_site_wide.swf?】即可得到可自动播放的地址。如下所示:

http://www.56.com/flashApp/v_player_site_wide.swf?img_host=v41.56.com&host=c24.56.com&pURL=28&sURL=18&user=xuhui8491&URLid=zhajm_124019538955&totaltimes=226000&effectID=0&flvid=42719013&56.swf

不过这个地址带有符号&,而QQ群空间*的FLASH中不能有这个符号,所以56视频仍然不能在QQ群空间里自动播放。

优酷视频播放

不自动播放:

http://player.youku.com/player.php/sid/XMTk1NTU2/v.swf/

自动播放:

http://player.youku.com/player.php/sid/XMTk1NTU2/p/1.swf/

代码变化:就是将SRC地址中的v改为p/1。(更多方法)。
例如,将

<embed src="http://player.youku.com/player.php/sid/XMTk1NTU2/v.swf/" quality="high" width="550" height="372"align="middle"type="application/x-shockwave-flash" />

修改为:

<embed src="http://player.youku.com/player.php/sid/XMTk1NTU2/p/1.swf/"quality="high"width="550" height="372"align="middle"type="application/x-shockwave-flash" />

利用优酷播放流畅的优点,设置width=”0″height=”0″就可以将其作为背景音乐播放器。
当然其中还是有弊病的,只能单曲播放。

土豆视频自动播放详解

1、在土豆网站找到相应的视频点开播放,在视频下面找到”贴到blog或BBS”,点击之后会出现三段代码;
2、复制第二段代码,即中间的FLASH播放器的地址:http://www.tudou.com/v/w3_GYw5nZAA。
把它打到浏览器的地址栏里,回车;
3、在地址栏会出现新地址,类似http://www.tudou.com/player/outside/player_outside.swf?iid=32179354&……。
4、将以上其中蓝色部分&……删除,将红色部分【/outside/player_outside.swf?】改成【/skin/plu.swf?】,其他保持不变。
5、地址改完,得到新的FLASH地址:

http://www.tudou.com/player/skin/plu.swf?iid=32179354

这样放在空间上就可以自动播放了。

酷6视频自动播放详解

不自动播放:

http://player.ku6.com/refer/nvGjdBHTKUWXgnNF/v.swf

自动播放:

http://player.ku6.com/refer/nvGjdBHTKUWXgnNF/v.swf&auto=1

代码变化:就是自动的多加&auto=1。

6间房视频自动播放详解

1、复制6间房的视频代码:

http://6.cn/p/r77SFhn7vd/lKf5HxWeXpQ.swf

2、在浏览器回车得到新地址:

http://6.cn/player.swf?vid=r77SFhn7vd/lKf5HxWeXpQ

3、6间房的视频播放器是:http://6.cn/player.swf?flag=1&vid=/qg在这个播放器中加上视频ID。
将视频播放器中的vid=/qg改成:vid=r77SFhn7vd/lKf5HxWeXpQ/qg。
改后的自动播放地址是:

http://6.cn/player.swf?flag=1&vid=r77SFhn7vd/lKf5HxWeXpQ/qg

 

新浪视频自动播放详解

方法一:

不自动播放:

http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=6282441&uid=1305882283

自动播放

:http://p.you.video.sina.com.cn/player/outer_player.swf?autoplay=1&vid=6282441&uid=1305882283

代码变化:就是将auto=1改成autoplay=1。

方法二:

1、复制新浪视频的Flash地址如下:。

http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=14050847&uid=1261788454

2、将以上地址中的红色部分【player/outer_player.swf?auto=1&】改成【swf/lb_player.swf?】,&vid=视频序列号;。
就得到了自动播放地址如下:。

http://p.you.video.sina.com.cn/swf/lb_player.swf?vid=14050847-1261788454

其实,对于不同的新浪视频,只要修改下面地址中的视频序列号(红色),就得到了自动播放地址!。

http://p.you.video.sina.com.cn/swf/lb_player.swf?vid=14050847-1261788454

Youtube视频自动播放

自动播放:

http://www.youtube.com/v/Lg1IjwKA0oc&autoplay=1

不自动播放:

http://www.youtube.com/v/Lg1IjwKA0oc&autoplay=1

代码变化:就是自动的多加&autoplay=1。

Mofile视频自动播放详解

Mofile网站的视频,提供了视频自动播放代码。可勾起视频播放器下的“自动播放”小方框,就出现了自动播放代码。
在这个网站上的视频代码,不自动播放的代码的链接地址后面比自动播放代码多了“&autoplay=0”,如你想要自动播。
放的,只要把不自动播放代码的这个多余的后缀去掉就行啦。详情请点此处。
例如,雪中情歌曲的不自动播放播放代码:

<EMBED src=http://tv.mofile.com/cn/xplayer.swfwidth=480height=400type=application/x-shockwave-flashFlashVars="v=8WQ6BK9E&p=/support/UploadFiles_4906/200906/20090607155408337.jpg &autoplay=0&nowSkin=0_0"allowScriptAccess="sameDomain"wmode="transparent"/>

总结起来,很多网站的视频播放代码都是大同小异,我们可以根据里面的参数如true/false来测试运行一下,Dreamweaver里面也有自动工具可以供大家测试使用!