Nginx配置文件try_files语法及在WP Super Cache中的应用

try_files 是nginx0.6.36 后新增一个功能,用于搜索指定目录下的N个文件,如果找不到fileN,则调用fallback中指定的位置来处理请求。个人认为,作为nginx核心的内容,可以部分替代烦琐的rewrite功能,笔者把它用在wp super cache的rewrite重写中,也取得了不错的效果。

try_files
语法: try_files file1 [file2 … filen] fallback
默认值: 无
作用域: location

这个指令的作用就是可接收多个路径作为参数,当前一个路径的资源无法找到,则自动查找下一个路径,如当请求的静态资源不存在,就将请求fallback指定位置到后台服务器上进行动态处理。
简单的例子:

1
2
3
4
5
6
7
8
location / {
    try_files index.html index.htm @fallback;
}

location @fallback {
    root /var/www/error;
    index index.html;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
    set $cache /wp-content/cache/supercache/$host;
        #wp-super-cache的路径
    listen 80;
    server_name _;
    location / {
        root /home/html/s0001/domains/$host;
        index index.php index.html;
                #直接调用gzip压缩后的html静态文件
        add_header Content-Type "text/html; charset=UTF-8";
        add_header Content-Encoding "gzip";
        try_files $cache/$uri/index.html.gz @proxy;
 
    }
    #所有静态文件都由nginx处理,并用gzip压缩输出
    location ~* \.(jpg|jpeg|png|gif|css|js|swf|mp3|avi|flv|xml|zip|rar)$ {
        expires 30d;
        gzip on;
        gzip_types  text/plain application/x-javascript text/css application/xml;
        root /home/html/s0001/domains/$host;
    }
    #找不到的文件都交给后端的apache处理了
    location @proxy {
        index  index.php index.htm index.html;
        root   /home/html/$user/domains/$host;
            proxy_pass   http://127.0.0.1:8080;
            proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Nginx常用的超时配置说明

1
client_header_timeout

语法 client_header_timeout time
默认值 60s
上下文 http server
说明 指定等待client发送一个请求头的超时时间(例如:GET / HTTP/1.1).仅当在一次read中,没有收到请求头,才会算成超时。如果在超时时间内,client没发送任何东西,nginx返回HTTP状态码408(“Request timed out”)

1
client_body_timeout

语法 client_body_timeout time
默认值 60s
上下文 http server location
说明 该指令设置请求体(request body)的读超时时间。仅当在一次readstep中,没有得到请求体,就会设为超时。超时后,nginx返回HTTP状态码408(“Request timed out”)

1
keepalive_timeout

语法 keepalive_timeout timeout [ header_timeout ]
默认值 75s
上下文 http server location
说明 第一个参数指定了与client的keep-alive连接超时时间。服务器将会在这个时间后关闭连接。可选的第二个参数指定了在响应头Keep-Alive: timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了。没有这个参数,nginx不会发送Keep-Alive响应头(尽管并不是由这个头来决定连接是否“keep-alive”)
两个参数的值可并不相同
注意不同浏览器怎么处理“keep-alive”头
MSIE和Opera忽略掉”Keep-Alive: timeout=” header.
MSIE保持连接大约60-65秒,然后发送TCP RST
Opera永久保持长连接
Mozilla keeps the connection alive for N plus about 1-10 seconds.
Konqueror保持长连接N秒

1
lingering_timeout

语法 lingering_timeout time
默认值 5s
上下文 http server location
说明 lingering_close生效后,在关闭连接前,会检测是否有用户发送的数据到达服务器,如果超过lingering_timeout时间后还没有数据可读,就直接关闭连接;否则,必须在读取完连接缓冲区上的数据并丢弃掉后才会关闭连接。

1
resolver_timeout

语法 resolver_timeout time
默认值 30s
上下文 http server location
说明 该指令设置DNS解析超时时间

1
proxy_connect_timeout

语法 proxy_connect_timeout time
默认值 60s
上下文 http server location
说明 该指令设置与upstream server的连接超时时间,有必要记住,这个超时不能超过75秒。
这个不是等待后端返回页面的时间,那是由proxy_read_timeout声明的。如果你的upstream服务器起来了,但是hanging住了(例如,没有足够的线程处理请求,所以把你的请求放到请求池里稍后处理),那么这个声明是没有用的,由于与upstream服务器的连接已经建立了。

1
proxy_read_timeout

语法 proxy_read_timeout time
默认值 60s
上下文 http server location
说明 该指令设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。这个时间不是获得整个response的时间,而是两次reading操作的时间。

1
proxy_send_timeout

语法 proxy_send_timeout time
默认值 60s
上下文 http server location
说明 这个指定设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到新的数据,nginx会关闭连接

1
proxy_upstream_fail_timeout(fail_timeout)

语法 server address [fail_timeout=30s]
默认值 10s
上下文 upstream
说明 Upstream模块下 server指令的参数,设置了某一个upstream后端失败了指定次数(max_fails)后,该后端不可操作的时间,默认为10秒

Debian修改ssh端口和禁止root远程登陆设置

linux修改端口22

1
vi /etc/ssh/sshd_config

找到#port 22
将前面的#去掉,然后修改端口 port 1234
重启服务就OK了

1
service sshd restart

1
/etc/init.d/ssh restart

为增强安全
先增加一个普通权限的用户,并设置密码

1
2
useradd test
passwd test

然后禁止ROOT远程SSH登录:

1
vi /etc/ssh/sshd_config

把其中的

1
PermitRootLogin yes

改为

1
PermitRootLogin no

重启sshd服务

1
service sshd restart

1
/etc/init.d/ssh restart

远程管理用普通用户test登录,然后用

1
su root

切换到root用户就可以拿到最高权限

国外VPS修改系统时间为北京时间

修改美国vps的系统时间为北京时间
也许大家在使用国外vps时感觉vps上的时间不是北京时间,感觉很别扭,今天我们就来改回为北京时间,首先登录你的vps,先用date命令查看下当前时间

1
date

Sun Aug 14 23:18:41 EDT 2011
现在我们就来改

1
2
rm -rf /etc/localtime  
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

再用date命令看下,你的vps的时间改变了吗?大部分linux vps的母鸡是允许每个vps修改时间的!看vpsma的时间已经修改好了。

1
date

Mon Aug 15 11:20:00 CST 2011
如果此时你的vps时间已经改成北京时间就不用看下面了,如果此时你的vps时间还没有修改好。再试下命令:

1
ntpdate stdtime.sinica.edu.tw

使用ntpdate stdtime.sinica.edu.tw 时候如果提示这个命令,先安装 ntpdate就可以了。
centos 系统的vps用命令:

1
yum -y install ntpdate ntp

Ubuntu系统的:

1
sudo apt-get install -y ntpdate ntp

安装完毕再试这个命令,如果还不可以的话,一般情况就是母鸡做了设置不让修改你vps的时间了。

手工创建casper-rw文件(用于liveusb保存文件)

casper-rw文件是用于我们在liveusb linux中保存我们对系统所做的更改,下面的方法用于手工创建casper-rw文件(我们甚至还能更改已创建casper-rw文件的大小)
1.创建新的casper-rw文件
打开终端,输入以下命令

1
dd if=/dev/zero of=casper-rw bs=1M count=1024

注: 把上面的count=1024改成你需要的大小
这样就在当前目录下生成了casper-rw文件,但这时候的casper-rw还不能用,你还需要格式化它在终端输入以下命令进行格式化

1
mkfs.ext3 casper-rw

OK,现在你可以把casper-rw文件拷到你的u盘投入应用了。

2.更改现有casper-rw文件的大小
打开终端,切换到casper-rw文件所在的目录,然后输入以下命令(最好先备份一下原文件)

1
dd if=/dev/zero bs=1M count=1024 >> casper-rw

注:把上面的count=1024改成你需要的大小
然后我们还需要check一下casper-rw文件,输入以下命令

1
e2fsck -f casper-rw

最后我们重新指定一下分区大小,输入以下命令

1
resize2fs casper-rw

如果以上的命令都正确执行了,那恭喜你,你已经得到一个新尺寸的casper-rw文件。

winscp使用sftp服务限制用户登录HOME目录

sftp和ftp是两种协议是不同的,sftp是ssh内含的协议,只要sshd服务器启动了,它就可用,它本身不需要ftp服务器启动。

1.查看openssh软件版本,想sftp服务用户只能访问特定的文件目录,版本需要4.8以上

1
2
3
4
rpm -qa | grep openssh
openssh-server-5.3p1-81.el6_3.x86_64
openssh-5.3p1-81.el6_3.x86_64
openssh-clients-5.3p1-81.el6_3.x86_64

2.新增用户,限制用户只能通过sftp访问

1
useradd -m -d /opt/ftp/dave -s /sbin/nologin dave

3.限制用户通过sftp登录进来时只能进入主目录,修改/etc/ssh/sshd_config文件

1
vim /etc/ssh/sshd_config
1
2
3
4
5
6
7
#Subsystem  sftp    /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User dave
         ChrootDirectory /opt/ftp/dave
         X11Forwarding no
         AllowTcpForwarding no
         ForceCommand internal-sftp

重启ssh

目录权限设置上要遵循2点:
ChrootDirectory设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root;
ChrootDirectory设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,权限最大设置只能是755。
如果不能遵循以上2点,即使是该目录仅属于某个用户,也可能会影响到所有的SFTP用户。

Debian或Ubuntu运行php5-fpm报错connect() to unix:/var/run/php5-fpm.sock

在ubuntu12.04中安装配置LNMP时 出现在php5-fpm的错误

1
2
3
4
5
6
7
8
2013/04/26 04:01:05 [crit] 6119#0:
 *4 connect() to unix:/var/run/php5-fpm.sock failed
(2: No such file or directory) while connecting to upstream,
client: 159.53.110.141,
server: 216.238.88.42,
request: "GET / HTTP/1.1",
upstream: "fastcgi://unix:/var/run/php5-fpm.sock:",
host: "216.238.88.42:9090

nginx中是这样配置的

1
2
3
4
5
6
7
8
9
10
11
location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

    # With php5-cgi alone:
    fastcgi_pass 127.0.0.1:9000;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

我个人的配置是想用sock的方法 毕竟sock方式对于高并发来说 还是比使用cgi方式好的
问题其实出现在 fastcgi_pass得配置上面。在ubuntu 12.10安装了php5-fpm之后。我们可以去

1
/etc/php5/fpm/pool.d/www.conf

里面找到这样一段代码:

1
listen = 127.0.0.1:9000

在这上面代码的下面添加一行:

1
listen = /var/run/php5-fpm.sock

保存后启动php5-fpm

1
/etc/init.d/php5-fpm restart

这时就可以正常访问了

另外有可能是sock文件的执行权限有问题,对sock文件执行

1
chmod 777 php5-fpm.sock

再启动php5-fpm问题解决。

linux zip 命令详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
功能说明:压缩文件。
语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时间>][-<压缩效率>][压缩文件][文件...][-i <范本样式>][-x <范本样式>]
补充说明:zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有".zip"扩展名的压缩文件。
参 数:
-A 调整可执行的自动解压缩文件。
-b<工作目录> 指定暂时存放文件的目录。
-c 替每个被压缩的文件加上注释。
-d 从压缩文件内删除指定的文件。
-D 压缩文件内不建立目录名称。
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
-F 尝试修复已损坏的压缩文件。
-g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件。
-h 在线帮助。
-i<范本样式> 只压缩符合条件的文件。
-j 只保存文件名称及其内容,而不存放任何目录名称。
-J 删除压缩文件前面不必要的数据。
-k 使用MS-DOS兼容格式的文件名称。
-l 压缩文件时,把LF字符置换成LF+CR字符。
-ll 压缩文件时,把LF+CR字符置换成LF字符。
-L 显示版权信息。
-m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。
-n<字尾字符串> 不压缩具有特定字尾字符串的文件。
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
-q 不显示指令执行过程。
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
-S 包含系统和隐藏文件。
-t<日期时间> 把压缩文件的日期设成指定的日期。
-T 检查备份文件内的每个文件是否正确无误。
-u 更换较新的文件到压缩文件内。
-v 显示指令执行过程或显示版本信息。
-V 保存VMS操作系统的文件属性。
-w 在文件名称里假如版本编号,本参数仅在VMS操作系统下有效。
-x<范本样式> 压缩时排除符合条件的文件。
-X 不保存额外的文件属性。
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
-z 替压缩文件加上注释。
-$ 保存第一个被压缩文件所在磁盘的卷册名称。
-<压缩效率> 压缩效率是一个介于1-9的数值。
linux unzip 命令详解
功能说明:解压缩zip文件
语 法:unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>][.zip文件][文件][-d <目录>][-x <文件>]unzip [-Z]
补充说明:unzip为.zip压缩文件的解压缩程序。
参 数:
-c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
-f 更新现有的文件。
-l 显示压缩文件内所包含的文件。
-p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
-t 检查压缩文件是否正确。
-u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-v 执行是时显示详细的信息。
-z 仅显示压缩文件的备注文字。
-a 对文本文件进行必要的字符转换。
-b 不要对文本文件进行字符转换。
-C 压缩文件中的文件名称区分大小写。
-j 不处理压缩文件中原有的目录路径。
-L 将压缩文件中的全部文件名改为小写。
-M 将输出结果送到more程序处理。
-n 解压缩时不要覆盖原有的文件。
-o 不必先询问用户,unzip执行后覆盖原有文件。
-P<密码> 使用zip的密码选项。
-q 执行时不显示任何信息。
-s 将文件名中的空白字符转换为底线字符。
-V 保留VMS的文件版本信息。
-X 解压缩时同时回存文件原来的UID/GID。
[.zip文件] 指定.zip压缩文件。
[文件] 指定要处理.zip压缩文件中的哪些文件。
-d<目录> 指定文件解压缩后所要存储的目录。
-x<文件> 指定不要处理.zip压缩文件中的哪些文件。
-Z unzip -Z等于执行zipinfo指令

范例:
zip命令可以用来将文件压缩成为常用的zip格式。unzip命令则用来解压缩zip文件。
1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip:

1
zip -r yasuo.zip abc.txt dir1

2.我下载了一个yasuo.zip文件,想解压缩:

1
unzip yasuo.zip

3.我当前目录下有abc1.zip,abc2.zip和abc3.zip,我想一起解压缩它们:

1
unzip abc\?.zip

注释:?表示一个字符,如果用*表示任意多个字符。
4.我有一个很大的压缩文件large.zip,我不想解压缩,只想看看它里面有什么:

1
unzip -v large.zip

5.我下载了一个压缩文件large.zip,想验证一下这个压缩文件是否下载完全了

1
unzip -t large.zip

6.我用-v选项发现music.zip压缩文件里面有很多目录和子目录,并且子目录中其实都是歌曲mp3文件,我想把这些文件都下载到第一级目录,而不是一层一层建目录:

1
unzip -j music.zip

Linux常用知识杂汇

操作系统环境Ubuntu
笔记本触摸板
对于使用笔记本的情况,控制触摸板,需要root权限
关闭笔记本触摸板:

1
sudo rmmod psmouse

开启笔记本触摸板:

1
sudo modprobe psmouse

笔记本亮度
对于使用笔记本的情况,开机时调节屏幕亮度
编辑rc.local文件

1
sudo vim /etc/rc.local

加入如下指令,500是亮度值,具体根据设备不同,亮度值会有不同的设置

1
echo 500 > /sys/class/backlight/intel_backlight/brightness

可以在终端中直接输入如上命令,更改亮度值,觉得合适的时候,将此亮度值作为开机启动的设置亮度的默认值

文本编辑器
较好的文本编辑器sublime-text,目前版本2
sublime-text比较特别,原则上是收费的,但是不限制使用,偶尔会弹出让使用者购买正版认证,不买可以继续用
目前作为linux下的文本编辑器,在开发中使用个人电脑编辑程序或者阅读程序推荐使用sublime-text
安装需要使用ppa

1
2
3
4
sudo add-apt-repository ppa:webupd8team/sublime-text-2
sudo apt-get update
sudo apt-get install sublime-text-2-beta
sudo apt-get install sublime-text-2-dev

等待安装结束

修复grub
需要使用Live CD,可以用usb存储器虚拟一个,以便不时之需
进入Live CD,打开终端,开启root权限

1
sudo -i

查看分区

1
fdisk -l

找到你的ubuntu硬盘分区,如sda*
挂在你的ubuntu硬盘分区到/mnt文件夹

1
mount /dev/sda* /mnt

安装grub到ubuntu硬盘分区

1
grub-install --root-directory=/mnt /dev/sda

重启系统

1
reboot

如果之前硬盘上有引导记录,那么恢复之后应该会有正常的启动项列表

如果grub无记录
提示符号grub>需要手动配置启动镜像,并加载

1
2
find /grub/core.img
find /boot/grub/core.img

找到所属硬盘分区,如(hd n,n)

1
2
3
4
root (hd n,n)
kernel /grub/core.img
kernel /boot/grub/core.img
boot

boot成功进入ubuntu

1
sudo grub-install /dev/sda

更新grub菜单

1
sudo update-grub

查看Linux硬件信息

内存型号

1
dmidecc -t memory

CPU型号

1
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

CPU核心

1
cat /proc/cpuinfo | grep physical | uniq -c

机器支持的运算位数

1
getconf LONG_BIT

查看CPU是否支持LONG MODE,64位运算

1
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l

结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit

查看当前操作系统内核信息

1
uname -a

查看当前操作系统发行版信息

1
cat /etc/issue | grep Linux

查看机器型号

1
dmidecc | grep "Product Name"

查看网卡信息

1
dmesg | grep -i eth

测试硬盘IO

1
2
dd if=/dev/zero of=test bs=64k count=16k oflag=dsync
dd if=/dev/zero of=test bs=64k count=4k oflag=dsync

UB测试,权威的Unix性能测试,需要获取测试脚本,非系统原生

1
2
wget http://www.CTOHome.com/linux-vps-pack/unixbench.sh;
sh ./unixbench.sh