记录一次 特殊的 nginx No input file specified

公司建了个wp的博客,想改域名,从.com改到.cc  在nginx中将对应的配置修改了,提示 No input file specified ,改回原来的目录就没问题,不知道什么情况,从网上找了些东西,试了各种方法,没什么效果(可能对你有些帮助)

最后对比了下两个文件夹下的文件,感觉 有个叫 .user.ini 的东西有点嫌疑,最后发现就是这个东西的问题,这是个啥子东西呢?

官方文档是这么说的:

自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件

http://php.net/manual/zh/configuration.file.per-user.php

 

文件中的配置是这样的:

open_basedir=/home/wwwroot/xxx.com:/tmp/:/proc/

心想,把这个改成xxx.cc不就可以了

修改的时候出问题了,没权限,我去 ,我可是牛B的root啊(虽然用root帐号不好),最后从网上找了些东西,看了下这个文章 http://www.ha97.com/5172.html 解决了,下面是cp过来的一些详细解释,如果你想往下看的话,不想看就是这么操作的:

 

#去除锁定
chattr -i .user.ini
#修改文件
vi .user.ini
#加锁
chattr +i .user.ini

 

下面有些理论的解释,可以看看

 

PS:有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了。chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的linux系统都是2.6以上内核了。通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。lsattr命令是显示chattr命令设置的文件属性。

这两个命令是用来查看和改变文件、目录属性的,与chmod这个命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制是由chattr来改变的。

chattr命令的用法:chattr [ -RVf ] [ -v version ] [ mode ] files…
最关键的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTtu]这些字符组合的,这部分是用来控制文件的
属性。

+ :在原有参数设定基础上,追加参数。
- :在原有参数设定基础上,移除参数。
= :更新为指定参数设定。
A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
S:硬盘I/O同步选项,功能类似sync。
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
d:即no dump,设定文件不能成为dump程序的备份目标。
i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
s:保密性地删除文件或目录,即硬盘空间被全部收回。
u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。
各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。

应用举例:

1、用chattr命令防止系统中某个关键文件被修改:
# chattr +i /etc/resolv.conf

然后用mv /etc/resolv.conf等命令操作于该文件,都是得到Operation not permitted 的结果。vim编辑该文件时会提示W10: Warning: Changing a readonly file错误。要想修改此文件就要把i属性去掉: chattr -i /etc/resolv.conf

# lsattr /etc/resolv.conf
会显示如下属性
----i-------- /etc/resolv.conf

2、让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:
# chattr +a /var/log/messages

 

到这里了,推荐下一个自己的收藏夹站 https://top9.cc/

乐观锁与悲观锁

本文引用自Elasticsearch的版本控制

变化越是频繁,或读取和更新间的时间越长,越容易丢失我们的更改。

在数据库中,有两种通用的方法确保在并发更新时修改不丢失:

悲观并发控制(Pessimistic concurrency control)

这在关系型数据库中被广泛的使用,假设冲突的更改经常发生,为了解决冲突我们把访问区块化。典型的例子是在读一行数据前锁定这行,然后确保只有加锁的那个线程可以修改这行数据。

乐观并发控制(Optimistic concurrency control):

被Elasticsearch使用,假设冲突不经常发生,也不区块化访问,然而,如果在读写过程中数据发生了变化,更新操作将失败。这时候由程序决定在失败后如何解决冲突。实际情况中,可以重新尝试更新,刷新数据(重新读取)或者直接反馈给用户。

乐观并发控制

Elasticsearch是分布式的。当文档被创建、更新或删除,文档的新版本会被复制到集群的其它节点。Elasticsearch即是同步的又是异步的,意思是这些复制请求都是平行发送的,并无序(out of sequence)的到达目的地。这就需要一种方法确保老版本的文档永远不会覆盖新的版本。

上文我们提到indexgetdelete请求时,我们指出每个文档都有一个_version号码,这个号码在文档被改变时加一。Elasticsearch使用这个_version保证所有修改都被正确排序。当一个旧版本出现在新版本之后,它会被简单的忽略。

我们利用_version的这一优点确保数据不会因为修改冲突而丢失。我们可以指定文档的version来做想要的更改。如果那个版本号不是现在的,我们的请求就失败了。

Let’s create a new blog post: 让我们创建一个新的博文:

PUT /website/blog/1/_create
{
  "title": "My first blog entry",
  "text":  "Just trying this out..."
}

响应体告诉我们这是一个新建的文档,它的_version1。现在假设我们要编辑这个文档:把数据加载到web表单中,修改,然后保存成新版本。

首先我们检索文档:

GET /website/blog/1

响应体包含相同的_version1

{
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "1",
  "_version" : 1,
  "found" :    true,
  "_source" :  {
      "title": "My first blog entry",
      "text":  "Just trying this out..."
  }
}

现在,当我们通过重新索引文档保存修改时,我们这样指定了version参数:

PUT /website/blog/1?version=1 <1>
{
  "title": "My first blog entry",
  "text":  "Starting to get the hang of this..."
}
  • <1> 我们只希望文档的_version1时更新才生效。

This request succeeds, and the response body tells us that the _version has been incremented to 2:

请求成功,响应体告诉我们_version已经增加到2

{
  "_index":   "website",
  "_type":    "blog",
  "_id":      "1",
  "_version": 2
  "created":  false
}

然而,如果我们重新运行相同的索引请求,依旧指定version=1,Elasticsearch将返回409 Conflict状态的HTTP响应。响应体类似这样:

{
  "error" : "VersionConflictEngineException[[website][2] [blog][1]:
             version conflict, current [2], provided [1]]",
  "status" : 409
}

这告诉我们当前_version2,但是我们指定想要更新的版本是1

我们需要做什么取决于程序的需求。我们可以告知用户其他人修改了文档,你应该在保存前再看一下。而对于上文提到的商品stock_count,我们需要重新检索最新文档然后申请新的更改操作。

所有更新和删除文档的请求都接受version参数,它可以允许在你的代码中增加乐观锁控制。

附上Elasticsearch中文文档地址 http://es.xiaoleilu.com/

当使用悲观锁的时候可以使用 RabbitMQ 消息队列 http://blog.csdn.net/anzhsoft/article/details/19563091

yum 错误TypeError: rpmdb open failed

解决办法
是因为RPM数据库出现损坏导致的,它导致所有的软件的升级、安装甚至是删除都会出现问题,终端出现乱码,YUMEX也用不成,RPM命令也用不成。原因是RPM数据库被破坏,解决方法如下:
$ su            切换到root权限
# cd /var/lib/rpm/
# for i in `ls | grep ‘db.’`;do mv $i $i.bak;done
# rpm –rebuilddb     重建该数据库
# yum clean all

redis 添加自启动

lnmp这个系统装了redis后没有设置自启动

那就让我们加下吧!

1.修改redis.conf,打开后台运行选项:

daemonize yes

2.编写脚本,vim /etc/init.d/redis:

# description: Start and Stop redis
PATH=/usr/local/bin:/sbin:/usr/bin:/bin

REDISPORT=6379 #实际环境而定
EXEC=/usr/local/redis/bin/redis-server #实际环境而定
REDIS_CLI=/usr/local/redis/bin/redis-cli #实际环境而定

PIDFILE=/var/run/redis.pid
CONF="/usr/local/redis/etc/redis.conf" #实际环境而定

case "$1" in
 start)
 if [ -f $PIDFILE ]
 then
 echo "$PIDFILE exists, process is already running or crashed."
 else
 echo "Starting Redis server..."
 $EXEC $CONF
 fi
 if [ "$?"="0" ]
 then
 echo "Redis is running..."
 fi
 ;;
 stop)
 if [ ! -f $PIDFILE ]
 then
 echo "$PIDFILE exists, process is not running."
 else
 PID=$(cat $PIDFILE)
 echo "Stopping..."
 $REDIS_CLI -p $REDISPORT SHUTDOWN
 while [ -x $PIDFILE ]
 do
 echo "Waiting for Redis to shutdown..."
 sleep 1
 done
 echo "Redis stopped"
 fi
 ;;
 restart|force-reload)
 ${0} stop
 ${0} start
 ;;
 *)
 echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
 exit 1
esac

3.添加可执行权限

chmod +x /etc/init.d/redis

4.测试开关

service redis restart

5.开启自启动

chkconfig redis on

参考:

http://lnmp.org/install.html

http://my.oschina.net/indestiny/blog/197272

http://linux.51yip.com/search/chkconfig

app服务器迁移方案探究

 

方案1:两个域名服务器同时指向同一个mysql

方案2:使用302跳转

现实解决过程:

由于方案1云主机机房所在区问题,以及主机版本较老导致链接mysql比较慢,选择方案2 :302跳转。

在302跳转时发现问题:

302不支持post数据的后续跳转,header也不支持,其中将post转成get 但在post数据时与登陆状态的反馈有问题,还是直接选择方案1,将新的机子镜像成mysql主机,链接mysql测试速度较快,并针对app的访问量将新机子的php-fpm mysql配置进行修改,两个域名指向同一个mysql,测试通过。

数据导出到新数据库并修改为innodb时,出现大表修改引擎比较慢,修改方案:直接将小表alter,大表使用create table *** select * from a;再创建索引;

ffmpeg 安装 centos

1、安装基础软件

yum install -y automake autoconf libtool gcc gcc-c++

2、安装第三方更新源

rpm -ivh http://apt.sw.be/redhat/el6/en/i386/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.i686.rpm

3、安装ffmpeg

yum install ffmpeg ffmpeg-devel

4、测试一下

ffpfm -v

session导致inode 100% mysql 损坏–事故记录

df -i 100% 了

rm -rf /tmp/session 删除失败,文件太多了

find /tmp/session -name “*” | xargs rm -rf ‘*’

删除一丁后 启动mysql给出的数据有问题,分析了下表
Table ‘***’ is marked as crashed and last (automatic?) repair failed
crashed 毁坏了

那就得修复下表:
进入mysql对应的文件夹数据存储目录
#myisamchk -r <table_name>

如果这样还是不能解决, 停掉mysql,然后
#myisamchk -r -v -f <table_name>

注:
1.原来session存储到了redis,当时由于php-fpm 的配置问题导致登陆不上,就该到了文件存储,实际上应该改回redis存储;
由于被攻击导致session暴增,文件的inode 100%
2.linux 服务器增长的文件大致有:session,mysqlbinlog,图片的存储;

df 的一些用法
用法:df [选项]… [文件]…
显示每个文件所在的文件系统的信息,默认是显示所有文件系统。

长选项必须使用的参数对于短选项时也是必需使用的。
-a, –all include dummy file systems
-B, –block-size=SIZE use SIZE-byte blocks
–direct show statistics for a file instead of mount point
–total produce a grand total
-h, –human-readable print sizes in human readable format (e.g., 1K 234M 2G)
-H, –si likewise, but use powers of 1000 not 1024
-i, –inodes 显示inode 信息而非块使用量
-k 即–block-size=1K
-l, –local 只显示本机的文件系统
–no-sync 取得使用量数据前不进行同步动作(默认)
-P, –portability 使用POSIX 兼容的输出格式
–sync 取得使用量数据前先进行同步动作
-t, –type=类型 只显示指定文件系统为指定类型的信息
-T, –print-type 显示文件系统类型
-x, –exclude-type=类型 只显示文件系统不是指定类型信息
-v (忽略)
–help 显示此帮助信息并退出
–version 显示版本信息并退出

所显示的数值是来自 –block-size、DF_BLOCK_SIZE、BLOCK_SIZE
及 BLOCKSIZE 环境变量中第一个可用的 SIZE 单位。
否则,默认单位是 1024 字节(或是 512,若设定 POSIXLY_CORRECT 的话)。

SIZE 可以是一个可选的整数,后面跟着以下单位中的一个:
KB 1000,K 1024,MB 1000*1000,M 1024*1024,还有 G、T、P、E、Z、Y。

php redis 存储session注意事项

session.save_handler = redis 
session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"

假如你的host是127.0.0.1 那没问题; 假如你是连接的其他的主机 则不仅仅需要在对应的主机上装有redis,还要在本机有redis。 参考文献如下: The session handler requires a version of Redis with the SETEXcommand (at least 2.0).

https://github.com/nicolasff/phpredis#php-session-handler