nginx使用ngx_http_empty_gif_module模块

在nginx官网看到有ngx_http_empty_gif_module这个模块,可以默认输出一个空白的gif,某个png透明的插件要用到这种透明的gif文件,简单看了下,配置方法很简单:

location = /_.gif {
    empty_gif;
}

最开始我本地总是提示File not found.针对php框架的rewrite将这个请求重定向到了php请求,在rewrite最开始添加了一行 rewrite ^/_\.gif$ /_.gif break; 将文件重定向一次OK了

参考链接:
ngx_http_empty_gif_module: http://nginx.org/en/docs/http/ngx_http_empty_gif_module.html

 

关于nginx配置PATH_INFO的坑

之前在网上找nginx配置PATH_INFO的方法,有一种是将PATH_INFO的值指定为$fastcgi_script_name,在php.ini中设置cgi.fix_pathinfo的值为1,前天在使用某款依赖PATH_INFO的框架时,果断被坑。将入口文件改为请求 http://localhost/index-dev.php时,PATH_INFO的值为 index-dev.php,框架将index-dev框架识别为controller报错。

附可用的配置方法:

set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
    set $real_script_name $1;
    set $path_info $2;
}
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_NAME $real_script_name;

几种配置方案PATH_INFO值的对比:

配置类型 请求地址 PATH_INFO PHP_SELF SCRIPT_NAME 说明
Apache /test.php /test.php /test.php Apache的值为参考
  /test.php/abc/123 /abc/123 /test.php/abc/123 /test.php Apache的值为参考
nginx设置PATH_INFO
和SCRIPT_NAME
/test.php no value /test.php /test.php 正常
  /test.php/abc/123 /abc/123 /test.php/abc/123 /test.php 正常
nginx设置PATH_INFO的值为
$fastcgi_script_name
/test.php /test.php /test.php/test.php /test.php PATH_INFO异常
PHP_SELF异常
  /test.php/abc/123 /abc/123 /test.php/abc/123 /test.php PHP_SELF异常

另外:网上所提的 cgi.fix_pathinfo 打开时的露洞,已修补。cgi.fix_pathinfo的值设为0时,请求/test.php/abc/123的地址时,会报 Access denied. 的错误。

nginx更换启动脚本

之前使用的nginx启动脚本交互提示信息不全,使用起来不太方便。浏览nginx wiwk时看到一个启动脚本,想尝试一下。
脚本地址:http://wiki.nginx.org/RedHatNginxInitScript

配置好参数和启动脚本权限后启动nginx使用时报如下错误。

/etc/init.d/nginx start
grep:无法识别的选项“--prefix=/usr/local/nginx.base”
用法: grep [选项]... PATTERN [FILE]...
试用‘grep --help’来获得更多信息。
useradd:无法识别的选项“--prefix=/usr/local/nginx.base”

细看启动脚本,找到这段内容。

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}

脚本每次都会调用nginx -V,取得编译时用--user指定的用户名。如果指定的用户不存在,则会创建该用户。还会根据编译的参数创建临时目录,并且修改权限。没有考虑未使用--user指定用户的场景,我编译nginx时没有加--user参数,就报错了。

重新编译了nginx,添加--user参数,指定用户以后正常了。这个启动脚本考虑的情况较多,交互提示较之前的更为人性化,效果不错。如果应用场景不允许重新编译nginx,可以直接跳过 make_dirs() 这个函数,在 # make required directories 上面加入一行 return 1 即可。

附本人nginx编译参数,系统是CentOS 6.3。

./configure --prefix=/usr/local/nginx.base \
--user=www \
--group=www \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-mail --with-mail_ssl_module \
--http-client-body-temp-path=/usr/local/nginx.base/tmp/client \
--http-proxy-temp-path=/usr/local/nginx.base/tmp/proxy \
--http-fastcgi-temp-path=/usr/local/nginx.base/tmp/fastcgi \
--http-uwsgi-temp-path=/usr/local/nginx.base/tmp/uwsgi \
--http-scgi-temp-path=/usr/local/nginx.base/tmp/scgi

linux web服务器iptables设置

最近弄了个vps玩,配置lnmp想着配下iptables,总结了些经验,分享出来。
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# 先把所有规则打开,则否ssh可能直接断掉

iptables -F
iptables -X
# 清除已有规则

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 先把ssh端口加上

iptables -P INPUT DROP
iptables -P FORWARD DROP
# 设置INPUT和FORWARD为封锁

iptables -A INPUT -i lo -j ACCEPT
# 开启本地环路,使得ping 127.0.0.1这样的包以通过。php-fpm的http://127.0.0.1:9000可以使用
iptables -A INPUT -p icmp -j ACCEPT
# 允许其它机器ping这台服务器
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许自己发送包的返回通信,不开启这个,机器上面使用ping www.google.com这样的无法拼通

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 开放web端口

/etc/init.d/iptables save
# 保存设置
/etc/init.d/iptables restart
# 重启iptables