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

 

vim:NERDTree打开当前文件所在目录

自己使用vim编辑文件的时候,经常有需求将NERDTree定位到当前文件的目录,用了一点时间映射了一个组合快捷键,分享一下。
代码如下:  

nn <silent><F2> :exec("NERDTree ".expand('%:h'))<CR>
  

巧用ie条件注释解决浏览兼容问题

在做web开发的时候,最头疼的就是处理各种浏览器兼容。尤其是ie低版本的兼容。于是各种 css hack层出不穷。类似 _ * \9 \0一类的,功能是实现的,却让本来写得很整齐的 css 代码变得乱糟糟的。其实用ie的条件注释就可以很简单的解决处理这些问题。

示例:

<!DOCTYPE html>
<html>
  <!--[if lt IE 7]><html class="ie6"><![endif]-->
  <head>
    <meta charset="utf-8">
    <title>css hack</title>
    <style>
      .test {height: 40px; background: blue;}
      .ie6 .test {background: red;}
    </style>
  </head>
  <body>
    <p class="test"></p>
  </body>
</html>

继续阅读

ie9中border-collapse至box-shadow无法显示的bug

前几天维护公司项目,给一个弹出层添加box-shadow效果,在ie9中效果无法显示,搜索出的结果多为更改doctype声明。页面本身使用html5声明,不存在冲突,调试了半天找出原因,弹出层外框为table默认添加了border-collapse: collapse的样式,因为这个样式导致box-shadow无法生效,修改为border-collapse: separate后解决。

示例代码:

<!DOCTYPE HTML>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8">
    <title></title>
  </head>
  <body>
    <table style="border-collapse: collapse">
      <tr>
        <td>
          <div style="box-shadow:0 0 50px rgba(0, 0, 0, 0.5); width: 200px; height: 200px; border: 1px solid #CCC;"> </div>
        </td>
      </tr>
    </table>
    <table>
      <tr>
        <td>
          <div style="box-shadow:0 0 50px rgba(0, 0, 0, 0.5); width: 200px; height: 200px; border: 1px solid #CCC;"> </div>
        </td>
      </tr>
    </table>
  </body>
</html>

 

makefile将相对路径转换为绝对路径

工作中用makefile执行打包、压缩、转换等功能,一个需求涉及到多层相对路径嵌套,于是想到将相对路径转换为绝对路径。百度谷歌数遍,找到一曲径通幽的方法。

PUBLICDIR = $(shell cd ../public; pwd)

*2012年11月16日更新

经依云大大提点,又上网搜索了一下Makefile相关函数。Makefile自带有两个函数可以得到绝对路径。
1. realpath 函数获取文件名序列中存在的文件和目录的真实路径,会判断文件和目录是否存在,如果不存在,则返回空。
2. abspath 函数获取文件名序列中存在的文件和目录的真实路径,函数不会检查文件或者目录是否存在。
示例:
PUBLICDIR = $(abspath ../public; pwd)

经本人测试,realpath abspath 能跨过软链接,获取文件的真实路径。

例如:
ln -s /usr/local/www /www

Makefile:

WWWDIR = $(abspath /www)
test:
    echo $(WWWDIR) #output /usr/local/www

make test #output /usr/local/www

 

vim清空quickfix列表

一个偶尔的情况,需要清空 quickfix 列表,百度+谷歌试了多个关键字,未找到结果。最后在google上面搜"vim clean quickfix"终于找到结果。方法如下:

:call setqflist([])

设置一个空的quickfix列表替换到现在的quickfix列表。

git添加本地过滤文件

项目开发中,有时需要添加一些本地的过滤文件,不提交到仓库中。可以采用以下方式

1.git config core.excludesfile .localgitignore

2.创建 .localgitignore 文件中添加需要过滤的内容

3.在默认的 .gitignore 文件中过滤 .localgitignore

[Fedora开发环境搭建]搭建LNMP开发环境

Fedora17上能找到的PHP最低版本为5.4.x。因公司项目开发较早,仅能在上5.3.x上面正常运行,所以php采用编译方式安装,nginx、mysql使用源来安装。

1.安装nginx、mysql并设置自动启

sudo yum install nginx mysql mysql-server
 
sudo systemctl enable nginx.service
sudo systemctl start nginx.service
 
sudo systemctl enable mysqld.service
sudo systemctl start mysqld.service

2.安装基础库

yum install \
autoconf \
xmllib2-devel \
curl-devel \
libjpeg-devel \
libpng-devel \
freetype-devel \
mysql-devel \
gcc \
gcc-c++ \
zlib \
zlib-devel \
make \
autoconf \
automake \
libxml2-devel

 

3.下载源代码包

cd /usr/local/src
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
wget http://nchc.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
wget http://nchc.dl.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz
wget http://nchc.dl.sourceforge.net/project/mcrypt/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz
wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.30/pcre-8.30.tar.gz
wget http://pecl.php.net/get/APC-3.1.9.tgz
wget http://cn.php.net/distributions/php-5.3.17.tar.gz

 

4.编译

tar zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --prefix=/usr/local
make
make install
 
cd ../
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8/
./configure
make
make install
/sbin/ldconfig
cd libltdl/
./configure --enable-ltdl-install
make
make install
cd ../../
 
tar zxvf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9/
./configure
make
make install
cd ../

#建立软链接
ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config
#如果是64位系统加上这一句
ln -s /usr/lib64/mysql /usr/lib
 
tar zxvf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8/
/sbin/ldconfig
./configure
make
make install
cd ../
 
tar zxvf pcre-8.30.tar.gz
cd pcre-8.30
./configure
make && make install
cd ../
 
编译php
tar zvxf php-5.3.17.tar.gz
cd php-5.3.17
配置参数
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/conf.d \
--with-mysql=/usr \
--with-iconv-dir=/usr/local \
--with-freetype-dir \
--with-jpeg-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-discard-path \
--enable-safe-mode \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--with-curlwrappers \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets  \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-pdo-mysql=/usr \
--with-mysql-sock=/var/lib/mysql/mysql.sock

#编译
make ZEND_EXTRA_LIBS='-liconv'
make install
#复制配置文件
cp php.ini-production /usr/local/php/etc/php.ini

#配置php-fpm
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm #因为php5.3开始自带fpm,使用自带的管理脚本
chmod +x /etc/init.d/php-fpm
chkconfig php-fpm on #设置开机自启动
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
#修改 php-fpm.conf
sudo vim /usr/local/php/etc/php-fpm.conf
修改  ;pid = run/php-fpm.pid 为  pid = run/php-fpm.pid (去掉前面的分号)
 
添加apc扩展
cd /usr/local/src
tar -zxvf APC-3.1.9.tgz
cd APC-3.1.9
/usr/local/php/bin/phpize
./configure --enable-apc --enable-apc-mmap --with-php-config=/usr/local/php/bin/php-config
make
make install

添加apc扩展
sudo mkdir /usr/local/php/etc/conf.d
sudo vim /usr/local/php/etc/conf.d/apc.ini
添加以内容
extension = "apc.so"
apc.enabled = 1
apc.cache_by_default = on
apc.shm_segments = 1
apc.shm_size = 32M
apc.ttl = 3600
apc.user_ttl = 3600
apc.num_files_hint = 0
apc.write_lock = On
 

 

 

参考链接:http://solf.me/compile-nginx-php-mysql-on-centos-lnmp/

 

[Fedora开发环境搭建]添加网易镜像源并更新到最新

以当前刚刚安装完成的 Fedora17 为例:

1.安装 wget

sudo yum install swget

 

2.添加网易镜像源

cd /etc/yum.repos.d
sudo wget http://mirrors.163.com/.help/fedora-163.repo
sudo wget http://mirrors.163.com/.help/fedora-updates-163.repo
sudo yum makecache

 

3.更新至最新

sudo yum update

 

*目前更新大约会下载 400M 左右的更新补丁,需要一段时间,请耐心等待。

*如果敲入 sudo 执行命令时提示 "user is not in the sudoers file.  This incident will be reported." 说明安装的时候没有勾选 "Add to Administrators group"。使用以下方法即可解决。

su - #会提示输入密码,在此处输入安装时填写的root用户密码
visudo #一个vi编辑界面 查找"root    ALL=(ALL)       ALL"在下面添加一行 "user    ALL=(ALL)       ALL" user是你的用户名。
:wq #保存并退出
exit #退出root帐户

 

附:
网易开源地址 http://mirrors.163.com/ 
Fedora源说明 http://mirrors.163.com/.help/fedora.html