您的位置:首页 > 运维架构 > Nginx

nginx中文手册内容说明

2015-03-03 21:44 363 查看
1.什么是nginx?

Nginx是一个高性能的Web和反向代理服务器,它具有有很多非常优越的特性:

作为Web服务器:相比Apache,Nginx使用更少的资源,支持更多的并发连接,体现更高的效率,这点使Nginx尤其受到虚拟主机提供商的欢迎。能够支持高达50,000个并发连接数的响应,感谢Nginx为我们选择了epollandkqueue作为开发模型.

作为负载均衡服务器:Nginx既可以在内部直接支持Rails和PHP,也可以支持作为HTTP代理服务器对外进行服务。Nginx用C编写,不论是系统资源开销还是CPU使用效率都比Perlbal要好的多。

作为邮件代理服务器:Nginx同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm描述了成功并且美妙的使用经验。

Nginx安装非常的简单,配置文件非常简洁(还能够支持perl语法),Bugs非常少的服务器:Nginx启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。

2、如何源码编译安装nginx?


nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息。

正式开始前,编译环境gccg++开发库之类的需要提前装好,这里默认你已经装好。

ububtu平台编译环境可以使用以下指令

apt-getinstallbuild-essential
apt-getinstalllibtool

centos平台编译环境使用如下指令

安装make:

yum-yinstallgccautomakeautoconflibtoolmake

安装g++:

yuminstallgccgcc-c++

下面正式开始
---------------------------------------------------------------------------
一般我们都需要先装pcre,zlib,前者为了重写rewrite,后者为了gzip压缩。
1.选定源码目录
可以是任何目录,本文选定的是/usr/local/src

cd/usr/local/src

2.安装PCRE库ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/下载最新的PCRE源码包,使用下面命令下载编译和安装PCRE包:

cd/usr/local/src
wgetftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gztar-zxvfpcre-8.34.tar.gz
cdpcre-8.34
./configure
make
makeinstall

3.安装zlib库http://zlib.net/zlib-1.2.8.tar.gz下载最新的zlib源码包,使用下面命令下载编译和安装zlib包:

cd/usr/local/src

wgethttp://zlib.net/zlib-1.2.8.tar.gztar-zxvfzlib-1.2.8.tar.gz
cdzlib-1.2.8
./configure
make
makeinstall

4.安装ssl(某些vps默认没装ssl)

cd/usr/local/src
wgethttp://www.openssl.org/source/openssl-1.0.1c.tar.gztar-zxvfopenssl-1.0.1c.tar.gz

5.安装nginx

Nginx一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把Nginx安装到/usr/local/nginx目录下的详细步骤:

cd/usr/local/src
wgethttp://nginx.org/download/nginx-1.4.2.tar.gztar-zxvfnginx-1.4.2.tar.gz
cdnginx-1.4.2

./configure--sbin-path=/usr/local/nginx/nginx\
--conf-path=/usr/local/nginx/nginx.conf\
--pid-path=/usr/local/nginx/nginx.pid\
--with-http_ssl_module\
--with-pcre=/usr/local/src/pcre-8.34\
--with-zlib=/usr/local/src/zlib-1.2.8\
--with-openssl=/usr/local/src/openssl-1.0.1c

make
makeinstall

--with-pcre=/usr/src/pcre-8.34指的是pcre-8.34的源码路径。
--with-zlib=/usr/src/zlib-1.2.7指的是zlib-1.2.7的源码路径。

安装成功后/usr/local/nginx目录下如下

fastcgi.confkoi-winnginx.conf.default
fastcgi.conf.defaultlogsscgi_params
fastcgi_paramsmime.typesscgi_params.default
fastcgi_params.defaultmime.types.defaultuwsgi_params
htmlnginxuwsgi_params.default
koi-utfnginx.confwin-utf

6.启动
确保系统的80端口没被其他程序占用,运行/usr/local/nginx/nginx命令来启动Nginx,

netstat-ano|grep80

如果查不到结果后执行,有结果则忽略此步骤(ubuntu下必须用sudo启动,不然只能在前台运行)

sudo/usr/local/nginx/nginx

打开浏览器访问此机器的IP,如果浏览器出现Welcometonginx!则表示Nginx已经安装并运行成功。





-----------------------------------------------------
到这里nginx就安装完成了,如果只是处理静态html就不用继续安装了

如果你需要处理php脚本的话,还需要安装php-fpm。

下面安装排错

附:可能遇到的错误和一些帮助信息

1.1编译pcre错误

libtool:compile:unrecognizedoption`-DHAVE_CONFIG_H'
libtool:compile:Try`libtool--help'formoreinformation.
make[1]:***[pcrecpp.lo]Error1
make[1]:Leavingdirectory`/usr/local/src/pcre-8.34'
make:***[all]Error2





解决办法:安装g++,别忘了重新configure

apt-getinstallg++
apt-getinstallbuild-essential
makeclean
./configure
make

1.2make出错

make:***Noruletomaketarget`build',neededby`default'.Stop.
./configure:error:SSLmodulesrequiretheOpenSSLlibrary.
Youcaneitherdonotenablethemodules,orinstalltheOpenSSLlibrary
intothesystem,orbuildtheOpenSSLlibrarystaticallyfromthesource
withnginxbyusing--with-openssl=option.

按照第4步的安装方法或
ubuntu下

apt-getinstallopenssl
apt-getinstalllibssl-dev

centos下

yum-yinstallopensslopenssl-devel

2.nginx编译选项

make是用来编译的,它从Makefile中读取指令,然后编译。

makeinstall是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的configure命令支持以下参数:

--prefix=path
定义一个目录,存放服务器上的文件,也就是nginx的安装目录。默认使用[code]/usr/local/nginx。

--sbin-path=path
设置nginx的可执行文件的路径,默认为prefix/sbin/nginx.

--conf-path=path
设置在nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf.

--pid-path=path设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名,在nginx.conf配置文件中使用PID指令。默认情况下,文件名为
prefix/logs/nginx.pid.

--error-log-path=path
设置主错误,警告,和诊断文件的名称。安装完成后,可以随时改变的文件名,在nginx.conf配置文件中使用的error_log指令。默认情况下,文件名为prefix/logs/error.log.

--http-log-path=path
设置主请求的HTTP服务器的日志文件的名称。安装完成后,可以随时改变的文件名,在nginx.conf配置文件中使用的access_log指令。默认情况下,文件名为prefix/logs/access.log.

--user=name
设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中使用的user指令。默认的用户名是nobody。

[code]--group=name设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中使用的user指令。默认的为非特权用户。

[code]--with-select_module
--without-select_module启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。


--with-poll_module
--without-poll_module
启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。

--without-http_gzip_module
—不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。

--without-http_rewrite_module
不编译重写模块。编译并运行此模块需要PCRE库支持。

--without-http_proxy_module
—不编译http_proxy模块。

--with-http_ssl_module
—使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的。

--with-pcre=path
—设置PCRE库的源码路径。PCRE库的源码(版本4.4-8.30)需要从PCRE网站下载并解压。其余的工作是Nginx的./configure和make来完成。正则表达式使用在location指令和ngx_http_rewrite_module模块中。

[code]--with-pcre-jit—编译PCRE包含“just-in-timecompilation”(1.1.12中,pcre_jit指令)。

--with-zlib=path
—设置的zlib库的源码路径。要下载从zlib(版本1.1.3-1.2.5)的并解压。其余的工作是Nginx的./configure和make完成。ngx_http_gzip_module模块需要使用zlib。

[code]--with-cc-opt=parameters—设置额外的参数将被添加到CFLAGS变量。例如,当你在FreeBSD上使用PCRE库时需要使用:[code]--with-cc-opt="-I/usr/local/include。.如需要需要增加
select()支持的文件数量
:
--with-cc-opt="-DFD_SETSIZE=2048".


--with-ld-opt=parameters
—设置附加的参数,将用于在链接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:[code]--with-ld-opt="-L/usr/local/lib".

典型实例(下面为了展示需要写在多行,执行时内容需要在同一行)

./configure
--sbin-path=/usr/local/nginx/nginx
--conf-path=/usr/local/nginx/nginx.conf
--pid-path=/usr/local/nginx/nginx.pid
--with-http_ssl_module
--with-pcre=../pcre-4.4
--with-zlib=../zlib-1.1.3

3.nginx简单配置详解(从welcometonginx开始上手)

#运行用户
usernobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes1;

#全局错误日志及PID文件
#error_loglogs/error.log;
#error_loglogs/error.lognotice;
#error_loglogs/error.loginfo;

#pidlogs/nginx.pid;

#工作模式及连接数上限
events{
#epoll是多路复用IO(I/OMultiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
useepoll;

#单个后台workerprocess进程的最大并发链接数
worker_connections1024;

#并发总数是worker_processes和worker_connections的乘积
#即max_clients=worker_processes*worker_connections
#在设置了反向代理的情况下,max_clients=worker_processes*worker_connections/4为什么
#为什么上面反向代理要除以4,应该说是一个经验值
#根据以上条件,正常情况下的NginxServer可以应付的最大连接数为:4*8000=32000
#worker_connections值的设置跟物理内存大小有关
#因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
#而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
#我们来看看360M内存的VPS可以打开的文件句柄数是多少:
#$cat/proc/sys/fs/file-max
#输出34336
#32000<34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
#所以,worker_connections的值需根据worker_processes进程数目和系统可以打开的最大文件总数进行适当地进行设置
#使得并发总数小于操作系统可以打开的最大文件数目
#其实质也就是根据主机的物理CPU和内存进行配置
#当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
#ulimit-SHn65535

}

http{
#设定mime类型,类型由mime.type文件定义
includemime.types;
default_typeapplication/octet-stream;
#设定日志格式
log_formatmain'$remote_addr-$remote_user[$time_local]"$request"'
'$status$body_bytes_sent"$http_referer"'
'"$http_user_agent""$http_x_forwarded_for"';

access_loglogs/access.logmain;

#sendfile指令指定nginx是否调用sendfile函数(zerocopy方式)来输出文件,
#对于普通应用,必须设为on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfileon;
#tcp_nopushon;

#连接超时时间
#keepalive_timeout0;
keepalive_timeout65;
tcp_nodelayon;

#开启gzip压缩
gzipon;
gzip_disable"MSIE[1-6].";

#设定请求缓冲
client_header_buffer_size128k;
large_client_header_buffers4128k;

#设定虚拟主机配置
server{
#侦听80端口
listen80;
#定义使用www.nginx.cn访问
server_namewww.nginx.cn;

#定义服务器的默认网站根目录位置
roothtml;

#设定本虚拟主机的访问日志
access_loglogs/nginx.access.logmain;

#默认请求
location/{

#定义首页索引文件的名称
indexindex.phpindex.htmlindex.htm;

}

#定义错误提示页面
error_page500502503504/50x.html;
location=/50x.html{
}

#静态文件,nginx自己处理
location~^/(images|javascript|js|css|flash|media|static)/{

#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires30d;
}

#PHP脚本请求全部转发到FastCGI处理.使用FastCGI默认配置.
location~.php${
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;
includefastcgi_params;
}

#禁止访问.htxxx文件
location~/.ht{
denyall;
}

}
}

4.nginx平滑升级


Nginx命令行选项

启动、停止、重启nginx命令

如何重新加载nginx配置文件

nginx程序不重启平滑升级可执行文件

nginx命令行参数

不像许多其他软件系统,Nginx仅有几个命令行参数,完全通过配置文件来配置

-c</path/to/config>为Nginx指定一个配置文件,来代替缺省的。

-t不运行,而仅仅测试配置文件。nginx将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

-v显示nginx的版本。

-V显示nginx的版本,编译器版本和配置参数。

nginx控制信号

可以使用信号系统来控制主进程。默认,nginx将其主进程的pid写入到/usr/local/nginx/nginx.pid文件中。通过传递参数给./configure或使用pid指令,来改变该文件的位置。

主进程可以处理以下的信号:

TERM,INT快速关闭
QUIT从容关闭
HUP重载配置
用新的配置开始新的工作进程
从容关闭旧的工作进程
USR1重新打开日志文件
USR2平滑升级可执行程序。
WINCH从容关闭工作进程
尽管你不必自己操作工作进程,但是,它们也支持一些信号:

TERM,INT快速关闭
QUIT从容关闭
USR1重新打开日志文件

nginx启动、停止、重启命令

nginx启动

sudo/usr/local/nginx/nginx(nginx二进制文件绝对路径,可以根据自己安装路径实际决定)

nginx从容停止命令,等所有请求结束后关闭服务

ps-ef|grepnginx

kill-QUITnginx主进程号

nginx快速停止命令,立刻关闭nginx进程

ps-ef|grepnginx

kill-TERMnginx主进程号

如果以上命令不管用,可以强制停止

kill-9nginx主进程号

如果嫌麻烦可以不用查看进程号,直接使用命令进行操作
其中/usr/local/nginx/nginx.pid为nginx.conf中pid命令设置的参数,用来存放nginx主进程号的文件
kill-信号类型(HUP|TERM|QUIT)`cat/usr/local/nginx/nginx.pid`
例如

kill-QUIT`cat/usr/local/nginx/nginx.pid`

nginx重启命令

nginx重启可以分成几种类型

1.简单型,先关闭进程,修改你的配置后,重启进程。
kill-QUIT`cat/usr/local/nginx/nginx.pid`
sudo/usr/local/nginx/nginx
2.重新加载配置文件,不重启进程,不会停止处理请求
3.平滑更新nginx二进制,不会停止处理请求

使用信号加载新的配置

Nginx支持几个信号,能在它运行时控制其操作。其中最普通的是15,用来中止运行的进程:

#<strong>psaux|egrep'(PID|nginx)'</strong>
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
root22130.00.067842036?Ss03:010:00nginx:masterprocess/usr/sbin/nginx-c/etc/nginx/nginx.conf
#<strong>kill-152213</strong>

而最有趣的是能平滑改变nginx配置的选项(请注意,在重载前,要先测试一下配置文件):

#<strong>nginx-t-c/etc/nginx/nginx.conf</strong>
2006/09/1613:07:10[info]15686#0:theconfigurationfile/etc/nginx/nginx.confsyntaxisok
2006/09/1613:07:10[info]15686#0:theconfigurationfile/etc/nginx/nginx.confwastestedsuccessfully
#<strong>psaux|egrep'(PID|nginx)'</strong>
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
root22130.00.067842036?Ss03:010:00nginx:masterprocess/usr/sbin/nginx-c/etc/nginx/nginx.conf
<strong>#kill-HUP2213</strong>

当nginx接收到HUP信号,它会尝试先解析配置文件(如果指定配置文件,就使用指定的,否则使用默认的),成功的话,就应用新的配置文件(例如:重新打开日志文件或监听的套接字)。之后,nginx运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字但是继续为当前连接的客户提供服务。所有客户端的服务完成后,旧的工作进程被关闭。如果新的配置文件应用失败,nginx将继续使用旧的配置进行工作。

平滑升级到新的二进制代码

你可以在不中断服务的情况下-新的请求也不会丢失,使用新的nginx可执行程序替换旧的(当升级新版本或添加/删除服务器模块时)。

首先,使用新的可执行程序替换旧的(最好做好备份),然后,发送USR2(kill-USR2pid)信号给主进程。主进程将重命名它的.pid文件为.oldbin(比如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新的可执行程序,依次启动新的主进程和新的工作进程:

PIDPPIDUSER%CPUVSZWCHANCOMMAND
331261root0.01164pausenginx:masterprocess/usr/local/nginx/sbin/nginx
3313433126nobody0.01368kqreadnginx:workerprocess(nginx)
3313533126nobody0.01380kqreadnginx:workerprocess(nginx)
3313633126nobody0.01368kqreadnginx:workerprocess(nginx)
3626433126root0.01148pausenginx:masterprocess/usr/local/nginx/sbin/nginx
3626536264nobody0.01364kqreadnginx:workerprocess(nginx)
3626636264nobody0.01364kqreadnginx:workerprocess(nginx)
3626736264nobody0.01364kqreadnginx:workerprocess(nginx)

在这时,两个nginx实例会同时运行,一起处理输入的请求。要逐步停止旧的实例,你必须发送WINCH信号给旧的主进程,然后,它的工作进程就将开始从容关闭:

PIDPPIDUSER%CPUVSZWCHANCOMMAND
331261root0.01164pausenginx:masterprocess/usr/local/nginx/sbin/nginx
3313533126nobody0.01380kqreadnginx:workerprocessisshuttingdown(nginx)
3626433126root0.01148pausenginx:masterprocess/usr/local/nginx/sbin/nginx
3626536264nobody0.01364kqreadnginx:workerprocess(nginx)
3626636264nobody0.01364kqreadnginx:workerprocess(nginx)
3626736264nobody0.01364kqreadnginx:workerprocess(nginx)

一段时间后,旧的工作进程处理了所有已连接的请求后退出,就仅由新的工作进程来处理输入的请求了:

PIDPPIDUSER%CPUVSZWCHANCOMMAND
331261root0.01164pausenginx:masterprocess/usr/local/nginx/sbin/nginx
3626433126root0.01148pausenginx:masterprocess/usr/local/nginx/sbin/nginx
3626536264nobody0.01364kqreadnginx:workerprocess(nginx)
3626636264nobody0.01364kqreadnginx:workerprocess(nginx)
3626736264nobody0.01364kqreadnginx:workerprocess(nginx)

这时,因为旧的服务器还尚未关闭它监听的套接字,所以,通过下面的几步,你仍可以恢复旧的服务器:

发送HUP信号给旧的主进程-它将在不重载配置文件的情况下启动它的工作进程

发送QUIT信号给新的主进程,要求其从容关闭其工作进程

发送TERM信号给新的主进程,迫使其退出

如果因为某些原因新的工作进程不能退出,向其发送KILL信号

新的主进程退出后,旧的主进程会由移除.oldbin前缀,恢复为它的.pid文件,这样,一切就都恢复到升级之前了。

如果尝试升级成功,而你也希望保留新的服务器时,发送QUIT信号给旧的主进程使其退出而只留下新的服务器运行:

PIDPPIDUSER%CPUVSZWCHANCOMMAND
362641root0.01148pausenginx:masterprocess/usr/local/nginx/sbin/nginx
3626536264nobody0.01364kqreadnginx:workerprocess(nginx)
3626636264nobody0.01364kqreadnginx:workerprocess(nginx)
3626736264nobody0.01364kqreadnginx:workerprocess(nginx)

5.nginx重要指令之location

location匹配命令

~#波浪线表示执行一个正则匹配,区分大小写
~*#表示执行一个正则匹配,不区分大小写
^~#^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
=#进行普通字符精确匹配
@#"@"定义一个命名的location,使用在内部定向时,例如error_page,try_files

location匹配的优先级(与location在配置文件中的顺序无关)
=精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

location优先级官方文档

Directiveswiththe=prefixthatmatchthequeryexactly.Iffound,searchingstops.

Allremainingdirectiveswithconventionalstrings,longestmatchfirst.Ifthismatchusedthe^~prefix,searchingstops.

Regularexpressions,inorderofdefinitionintheconfigurationfile.

If#3yieldedamatch,thatresultisused.Elsethematchfrom#2isused.

=前缀的指令严格匹配这个查询。如果找到,停止搜索。

所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。

正则表达式,在配置文件中定义的顺序。

如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用。

例如

location=/{
#只匹配"/".
[configurationA]
}
location/{
#匹配任何请求,因为所有请求都是以"/"开始
#但是更长字符匹配或者正则表达式匹配会优先匹配
[configurationB]
}
location^~/images/{
#匹配任何以/images/开始的请求,并停止匹配其它location
[configurationC]
}
location~*\.(gif|jpg|jpeg)${
#匹配以gif,jpg,orjpeg结尾的请求.
#但是所有/images/目录的请求将由[ConfigurationC]处理.
[configurationD]
}

请求URI例子:

/->符合configurationA

/documents/document.html->符合configurationB

/images/1.gif->符合configurationC

/documents/1.jpg->符合configurationD

@location例子
error_page404=@fetch;

location@fetch(
proxy_passhttp://fetch;)

6.nginx重要指令之upstream

7.nginxrewrite功能

nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。

该模块需要PCRE支持,应在编译nginx时指定PCRE源码目录,nginx安装方法。

nginxrewrite指令执行顺序:

1.执行server块的rewrite指令(这里的块指的是server关键字后{}包围的区域,其它xx块类似)
2.执行location匹配
3.执行选定的location中的rewrite指令
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件

如果循环超过10次,则返回500InternalServerError错误

break指令

语法:break;
默认值:无
作用域:server,location,if

停止执行当前虚拟主机的后续rewrite指令集
break指令实例:

if($slow){
limit_rate10k;
break;
}

if指令

语法:if(condition){...}
默认值:无
作用域:server,location
对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行。
if条件(conditon)可以是如下任何内容:

一个变量名;false如果这个变量是空字符串或者以0开始的字符串;

使用=,!=比较的一个变量和字符串

是用~,~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用"或'包围

使用-f,!-f检查一个文件是否存在

使用-d,!-d检查一个目录是否存在

使用-e,!-e检查一个文件、目录、符号链接是否存在

使用-x,!-x检查一个文件是否可执行

if指令实例

if($http_user_agent~MSIE){
rewrite^(.*)$/msie/$1break;
}

if($http_cookie~*"id=([^;]+)(?:;|$)"){
set$id$1;
}

if($request_method=POST){
return405;
}

if($slow){
limit_rate10k;
}

if($invalid_referer){
return403;
}

return指令

语法:returncode;

returncodeURL;

returnURL;
默认值:无
作用域:server,location,if

停止处理并返回指定状态码(code)给客户端。
非标准状态码444表示关闭连接且不给客户端发响应头。
从0.8.42版本起,return支持响应URL重定向(对于301,302,303,307),或者文本响应(对于其他状态码).
对于文本或者URL重定向可以包含变量

rewrite指令

语法:rewriteregexreplacement[flag];
默认值:无
作用域:server,location,if
如果一个URI匹配指定的正则表达式regex,URI就按照replacement重写。
rewrite按配置文件中出现的顺序执行。flags标志可以停止继续处理。
如果replacement以"http://"或"https://"开始,将不再继续处理,这个重定向将返回给客户端。
flag可以是如下参数
last停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找。
break停止处理后续rewrite指令集,并不在重新查找,但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行。
redirect如果replacement不是以http://或https://开始,返回302临时重定向
permant返回301永久重定向
最终完整的重定向URL包括请求scheme(http://,https://等),请求的server_name_in_redirect和port_in_redirec三部分,说白了也就是http协议域名端口三部分组成。

rewrite实例

server{
...
rewrite^(/download/.*)/media/(.*)\..*$$1/mp3/$2.mp3last;
rewrite^(/download/.*)/audio/(.*)\..*$$1/mp3/$2.ralast;
return403;
...
}

如果这些rewrite放到“
/download/
”location如下所示,那么应使用break而不是last,使用last将循环10次匹配,然后返回500错误:

location/download/{
rewrite^(/download/.*)/media/(.*)\..*$$1/mp3/$2.mp3break;
rewrite^(/download/.*)/audio/(.*)\..*$$1/mp3/$2.rabreak;
return403;
}

对于重写后的URL(replacement)包含原请求的请求参数,原URL的?后的内容。如果不想带原请求的参数,可以在replacement后加一个问号。如下,我们加了一个自定义的参数user=$1,然后在结尾处放了一个问号?,把原请的参数去掉。

rewrite^/users/(.*)$/show?user=$1?last;

如果正则表达regex式中包含“
}
”或“
;
”,那么整个表达式需要用双引号或单引号包围.

rewrite_log指令

语法:rewrite_logon|off;
默认值:rewrite_logoff;
作用域:http,server,location,if
开启或关闭以notice级别打印rewrite处理日志到errorlog文件。

nginx打开rewritelog例子

rewrite_logon;
error_loglogs/xxx.error.lognotice;

1.打开rewriteon
2.把errorlog的级别调整到notice

set指令

语法:setvariablevalue;
默认值:none
作用域:server,location,if
定义一个变量并赋值,值可以是文本,变量或者文本变量混合体。

uninitialized_variable_warn指令

语法:uninitialized_variable_warnon|off;
默认值:uninitialized_variable_warnon
作用域:http,server,location,if

控制是否输出为初始化的变量到日志

8.nginx的虚拟主机功能(nginx多站点,绑定多个域名)

两个虚拟主机(纯静态-html支持)-TwoVirtualHosts,ServingStaticFiles

http{
server{
listen80;
server_namewww.domain1.com;
access_loglogs/domain1.access.logmain;
location/{
indexindex.html;
root/var/www/domain1.com/htdocs;
}
}
server{
listen80;
server_namewww.domain2.com;
access_loglogs/domain2.access.logmain;
location/{
indexindex.html;
root/var/www/domain2.com/htdocs;
}
}
}


虚拟主机标准配置(简化)-ADefaultCatchallVirtualHost

http{
server{
listen80default;
server_name_*;
access_loglogs/default.access.logmain;
location/{
indexindex.html;
root/var/www/default/htdocs;
}
}
}


在父文件夹中建立子文件夹以指向子域名-WildcardSubdomainsinaParentFolder

这是一个添加子域名(或是当DNS已指向服务器时添加一个新域名)的简单方法。需要注意的是,我已经将FCGI配置进该文件了。如果你只想使服务器为静态文件服务,可以直接将FCGI配置信息注释掉,然后将默认主页文件变成index.html。

这个简单的方法比起为每一个域名建立一个vhost.conf配置文件来讲,只需要在现有的配置文件中增加如下内容:

Thisisjustareallyeasywaytokeepaddingnewsubdomains,ortoaddnewdomainsautomaticallywhenDNSrecordsarepointedattheserver.NotethatIhaveincludedFCGIhereaswell.Ifyouwanttojustservestaticfiles,stripouttheFCGIconfigandchangethedefaultdocumenttoindex.html.Ratherthancreatinganewvhost.conffileforeverydomain,justcreateoneofthese:

server{
#Replacethisportwiththerightoneforyourrequirements
#根据你的需求改变此端口
listen80;#couldalsobe1.2.3.4:80也可以是1.2.3.4:80的形式
#Multiplehostnamesseperatedbyspaces.Replacetheseaswell.
#多个主机名可以用空格隔开,当然这个信息也是需要按照你的需求而改变的。
server_namestar.yourdomain.com*.yourdomain.comwww.*.yourdomain.com;
#Alternately:_*
#或者可以使用:_*(具体内容参见本维基其他页面)
root/PATH/TO/WEBROOT/$host;
error_page404http://yourdomain.com/errors/404.html;access_loglogs/star.yourdomain.com.access.log;
location/{
root/PATH/TO/WEBROOT/$host/;
indexindex.php;
}
#servestaticfilesdirectly
#直接支持静态文件(爱月说:???从配置上看来不是直接支持啊~有问题有问题~)
location~*^.+.(jpg|jpeg|gif|css|png|js|ico|html)${
access_logoff;
expires30d;
}
location~.php${
#Byallmeansuseadifferentserverforthefcgiprocessesifyouneedto
#如果需要,你可以为不同的FCGI进程设置不同的服务信息
fastcgi_pass127.0.0.1:YOURFCGIPORTHERE;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME/PATH/TO/WEBROOT/$host/$fastcgi_script_name;
fastcgi_paramQUERY_STRING$query_string;
fastcgi_paramREQUEST_METHOD$request_method;
fastcgi_paramCONTENT_TYPE$content_type;
fastcgi_paramCONTENT_LENGTH$content_length;
fastcgi_intercept_errorson;
}
location~/\.ht{
denyall;
}
}

9.nginx反向代理功能

nginx作为web服务器一个重要的功能就是反向代理。

当然你也可以使用nginx配置正向代理,本是介绍如何配置nginx的反向代理。

nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理。

配置前的准备工作,后端跑apache服务的ip和端口,也就是说可以通过http://ip:port能访问到你的网站。

然后就可以新建一个vhost.conf,加入如下内容,记得修改ip和域名为你的ip和域名。

修改nginx.conf,添加
includequancha.conf
到http{}段,reloadnginx就可以了。

nginx反向代理模板

##Basicreverseproxyserver##
##Apachebackendforwww.quancha.cn##
upstreamapachephp{
serverip:8080;#Apache
}

##Startwww.quancha.cn##
server{
listen80;
server_namewww.quancha.cn;

access_loglogs/quancha.access.logmain;
error_loglogs/quancha.error.log;
roothtml;
indexindex.htmlindex.htmindex.php;

##sendrequestbacktoapache##
location/{
proxy_passhttp://apachephp;
#ProxySettings
proxy_redirectoff;
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
proxy_next_upstreamerrortimeoutinvalid_headerhttp_500http_502http_503http_504;
proxy_max_temp_file_size0;
proxy_connect_timeout90;
proxy_send_timeout90;
proxy_read_timeout90;
proxy_buffer_size4k;
proxy_buffers432k;
proxy_busy_buffers_size64k;

proxy_temp_file_write_size64k;
}
}
##Endwww.quancha.cn##


10.nginx负载均衡功能

使用负载均衡的话,可以修改配置http节点如下:#设定http服务器,利用它的反向代理功能提供负载均衡支持

http{

#设定mime类型,类型由mime.type文件定义
include/etc/nginx/mime.types;
default_typeapplication/octet-stream;

#设定日志格式
access_log/var/log/nginx/access.log;

#省略上文有的一些配置节点
#。。。。。。。。。。

#设定负载均衡的服务器列表
upstreammysvr{
#weigth参数表示权值,权值越高被分配到的几率越大
server192.168.8.1x:3128weight=5;
#本机上的Squid开启3128端口,不是必须要squid
server192.168.8.2x:80weight=1;
server192.168.8.3x:80weight=6;
}

upstreammysvr2{
#weigth参数表示权值,权值越高被分配到的几率越大
server192.168.8.x:80weight=1;
server192.168.8.x:80weight=6;
}

#第一个虚拟服务器
server{
#侦听192.168.8.x的80端口
listen80;
server_name192.168.8.x;

#对aspx后缀的进行负载均衡请求
location~.*\.aspx${
#定义服务器的默认网站根目录位置
root/root;
#定义首页索引文件的名称
indexindex.phpindex.htmlindex.htm;

#请求转向mysvr定义的服务器列表
proxy_passhttp://mysvr;

#以下是一些反向代理的配置可删除.

proxy_redirectoff;

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;

#允许客户端请求的最大单文件字节数
client_max_body_size10m;

#缓冲区代理缓冲用户端请求的最大字节数,
client_body_buffer_size128k;

#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout90;

#连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout90;

#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size4k;

#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_buffers432k;

#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size64k;

#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size64k;

}
}
}

11.nginxweb缓存功能

为什么要做webcache,我想大家最主要的是解决流量的压力。随着网站流量的提升,如果只是单台机器既处理静态文件,又处理动态脚本,显然效率很难上升,不能处理日益上涨的流量压力。与此同时某些网站的页面内容并不是经常变化,因此我们可以分两层架构来组织网站。前端web缓存+后端web服务器,可以参看这里配置nginx反向代理配置

前端web缓存有多重方式实现,原理就是队请求结果页面静态化并设置一个超时期限,缓存页面过期后,新请求到达时重新到后端web服务器获取内容更新;没有nginx前比较流行的方法是squid,但squid不能充分利用处理器的多核特性,越来越多的网站选用nginx来做前端的web缓存。

要想使用nginx的缓存功能要保证nginx添加了proxy模块。我们可以使用-V选项(大写的V,小写的v是看版本号的)来查看nginx的编译参数。我使用的是默认的参数编译的,如下所示:

root@SNDA-172-17-12-117:/usr/local/nginx#./nginx-V
nginxversion:nginx/1.2.3
builtbygcc4.4.3(Ubuntu4.4.3-4ubuntu5.1)
TLSSNIsupportenabled
configurearguments:--sbin-path=/usr/local/nginx/nginx--conf-path=/usr/local/nginx/nginx.conf--pid-path=/usr/local/nginx/nginx.pid--with-http_ssl_module--with-pcre=/usr/local/src/pcre-8.21--with-zlib=/usr/local/src/zlib-1.2.7

nginx的所有模块必须在编译的时候添加,不能再运行的时候动态加载,默认的编译选项下包含的模块,如果你不是显示的用参数关闭它。

nginx默认安装的模块如下

模块名称描述版本如何禁用
CoreControlports,locations,errorpages,aliases,andotheressentials.--without-http
AccessAllow/denybasedonIPaddress.--without-http_access_module
AuthBasicBasicHTTPauthentication.--without-http_auth_basic_module
AutoIndexGeneratesautomaticdirectorylistings.--without-http_autoindex_module
BrowserInterpret"User-Agent"string.0.4.3--without-http_browser_module
CharsetRecodewebpages.--without-http_charset_module
EmptyGIFServea1x1imagefrommemory.0.3.10--without-http_empty_gif_module
FastCGIFastCGISupport.--without-http_fastcgi_module
GeoSetconfigvariablesusingkey/valuepairsofIPaddresses.0.1.17--without-http_geo_module
GzipGzipresponses.--without-http_gzip_module
HeadersSetarbitraryHTTPresponseheaders.
IndexControlswhichfilesaretobeusedasindex.
LimitRequestsLimitfrequencyofconnectionsfromaclient.0.7.20--without-http_limit_req_module
LimitZoneLimitsimultaneousconnectionsfromaclient.Deprecatedin1.1.8,useLimitConnInstead.0.5.6--without-http_limit_zone_module
LimitConnLimitconcurrentconnectionsbasedonavariable.--without-http_limit_conn_module
LogCustomizeaccesslogs.
MapSetconfigvariablesusingarbitrarykey/valuepairs.0.3.16--without-http_map_module
MemcachedMemcachedsupport.--without-http_memcached_module
ProxyProxytoupstreamservers.--without-http_proxy_module
RefererFilterrequestsbasedon
Referer
header.
--without-http_referer_module
RewriteRequestrewritingusingregularexpressions.--without-http_rewrite_module
SCGISCGIprotocolsupport.0.8.42--without-http_scgi_module
SplitClientsSplitsclientsbasedonsomeconditions0.8.37--without-http_split_clients_module
SSIServer-sideincludes.--without-http_ssi_module
UpstreamForload-balancing.--without-http_upstream_ip_hash_module(ip_hashdirectiveonly)
UserIDIssueidentifyingcookies.--without-http_userid_module
uWSGIuWSGIprotocolsupport.0.8.40--without-http_uwsgi_module
X-AccelX-Sendfile-likemodule.
proxy模块中常用的指令时proxy_pass和proxy_cache.

nginx的web缓存功能的主要是由proxy_cache、fastcgi_cache指令集和相关指令集完成,proxy_cache指令负责反向代理缓存后端服务器的静态内容,fastcgi_cache主要用来处理FastCGI动态进程缓存(这里我不是很清楚这两个指令的区别,好像功能上都差不多,尤其后面这句话的意思,是我翻译过来的)。

确认proxy模块安装好后,下面对nginx的配置文件进行设置,重点部分如标红字体所示。

这是我的nginx.conf配置文件。

userwww-data;
worker_processes1;

#error_loglogs/error.log;
#error_loglogs/error.lognotice;
#error_loglogs/error.loginfo;

#pidlogs/nginx.pid;
events{
worker_connections1024;
}
http{
includemime.types;
default_typeapplication/octet-stream;

log_formatmain'$remote_addr-$remote_user[$time_local]"$request"'
'$status$body_bytes_sent"$http_referer"'
'"$http_user_agent""$http_x_forwarded_for""$host"';

#access_loglogs/access.logmain;

sendfileon;
#tcp_nopushon;

#keepalive_timeout0;
keepalive_timeout65;

#CompressionSettings
gzipon;
gzip_http_version1.0;
gzip_comp_level2;
gzip_proxiedany;
gzip_min_length1100;
gzip_buffers168k;
gzip_typestext/plaintext/cssapplication/x-javascripttext/xmlapplication/xmlapplication/xml+rsstext/javascript;
#SomeversionofIE6don'thandlecompressionwellonsomemime-types,
#sojustdisableforthem
gzip_disable"MSIE[1-6].(?!.*SV1)";
#Setavaryheadersodownstreamproxiesdon'tsendcachedgzipped
#contenttoIE6
gzip_varyon;
#endgzip

#cachebegin
proxy_bufferingon;
proxy_cache_validany10m;
proxy_cache_path/data/cachelevels=1:2keys_zone=my-cache:8mmax_size=1000minactive=600m;
proxy_temp_path/data/temp;
proxy_buffer_size4k;
proxy_buffers1008k;
#cacheend

##Basicreverseproxyserver##
##Apache(vm02)backendforwww.example.com##
upstreamapachephp{
serverwww.quancha.cn:8080;#Apache1
}

##Startwww.quancha.cn##
server{
listen80;
server_name*.quancha.cn;

access_loglogs/quancha.access.logmain;
error_loglogs/quancha.error.log;
roothtml;
indexindex.htmlindex.htmindex.php;

##sendrequestbacktoapache1##
location/{
proxy_passhttp://apachephp;proxy_cachemy-cache;
proxy_cache_valid200;

#ProxySettings
proxy_redirectoff;
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
proxy_next_upstreamerrortimeoutinvalid_headerhttp_500http_502http_503http_504;
proxy_max_temp_file_size0;
proxy_connect_timeout90;
proxy_send_timeout90;
proxy_read_timeout90;
proxy_buffer_size4k;
proxy_buffers432k;
proxy_busy_buffers_size64k;
proxy_temp_file_write_size64k;
##EndProxySettings
}
}
##Endwww.quancha.cn##

}

配置文件中以proxy_开头的指令我们大都可以字面意思得到理解。请务必注意一点proxy_cache_path和proxy_temp_path设置的目录需要在同一分区,因为它们之间是硬链接的关系。

最后启动nginx,来迎接着激动人心的时刻吧。我已经迫不及待了。如果文章哪里有问题或者你遇到了什么麻烦,可以留言让我知道。

12.nginxphp-fpm配置

nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。

nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx

本文以php-fpm为例介绍如何使nginx支持PHP

一、编译安装php-fpm

什么是PHP-FPM

PHP-FPM是一个PHPFastCGI管理器,是只用于PHP的,可以在http://php-fpm.org/download下载得到.
PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

新版PHP已经集成php-fpm了,不再是第三方的包了,推荐使用。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带–enable-fpm参数即可开启PHP-FPM,其它参数都是配置php的,具体选项含义可以查看这里。

安装前准备
centos下执行

yum-yinstallgccautomakeautoconflibtoolmake

yum-yinstallgccgcc-c++glibc

yum-yinstalllibmcrypt-develmhash-devellibxslt-devel\
libjpeglibjpeg-devellibpnglibpng-develfreetypefreetype-devellibxml2libxml2-devel\
zlibzlib-develglibcglibc-develglib2glib2-develbzip2bzip2-devel\
ncursesncurses-develcurlcurl-devele2fsprogse2fsprogs-devel\
krb5krb5-devellibidnlibidn-developensslopenssl-devel

新版php-fpm安装(推荐安装方式)

wgethttp://cn2.php.net/distributions/php-5.4.7.tar.gztarzvxfphp-5.4.7.tar.gz
cdphp-5.4.7
./configure--prefix=/usr/local/php--enable-fpm--with-mcrypt\
--enable-mbstring--disable-pdo--with-curl--disable-debug--disable-rpath\
--enable-inline-optimization--with-bz2--with-zlib--enable-sockets\
--enable-sysvsem--enable-sysvshm--enable-pcntl--enable-mbregex\
--with-mhash--enable-zip--with-pcre-regex--with-mysql--with-mysqli\
--with-gd--with-jpeg-dir

makeallinstall

旧版手动打补丁php-fpm安装(旧版程序已经没有了,大家新版的吧,这里做个展示)
wgethttp://cn2.php.net/get/php-5.2.17.tar.gzwgethttp://php-fpm.org/downloads/php-5.2.17-fpm-0.5.14.diff.gztarzvxfphp-5.2.17.tar.gz
gzip-cdphp-5.2.17-fpm-0.5.14.diff.gz|patch-dphp-5.2.17-p1
cdphp-5.2.17
./configure--prefix=/usr/local/php-with-config-file-path=/usr/local/php/etc\
-with-mysql=/usr/local/mysql\
-with-mysqli=/usr/local/mysql/bin/mysql_config-with-openssl-enable-fpm-enable-mbstring\
-with-freetype-dir-with-jpeg-dir-with-png-dir-with-zlib-dir-with-libxml-dir=/usr-enable-xml\
-with-mhash-with-mcrypt-enable-pcntl-enable-sockets-with-bz2-with-curl-with-curlwrappers\
-enable-mbregex-with-gd-enable-gd-native-ttf-enable-zip-enable-soap-with-iconv-enable-bcmath\
-enable-shmop-enable-sysvsem-enable-inline-optimization-with-ldap-with-ldap-sasl-enable-pdo\
-with-pdo-mysql
makeallinstall

以上两种方式都可以安装php-fpm,安装后内容放在/usr/local/php目录下





以上就完成了php-fpm的安装。

下面是对php-fpm运行用户进行设置

cd/usr/local/php
cpetc/php-fpm.conf.defaultetc/php-fpm.conf
vietc/php-fpm.conf

修改
user=www-data
group=www-data

如果www-data用户不存在,那么先添加www-data用户
groupaddwww-data
useradd-gwww-datawww-data

二、编译安装nginx

然后按照http://www.nginx.cn/install安装nginx

三、修改nginx配置文件以支持php-fpm

nginx安装完成后,修改nginx配置文件为,nginx.conf

其中server段增加如下配置,注意标红内容配置,否则会出现Noinputfilespecified.错误

#passthePHPscriptstoFastCGIserverlisteningon127.0.0.1:9000
#
location~\.php${
roothtml;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;
includefastcgi_params;
}

四、创建测试php文件

创建php文件

在/usr/local/nginx/html下创建index.php文件,输入如下内容

<?php
echophpinfo();
?>

五、启动服务

启动php-fpm和nginx

/usr/local/php/sbin/php-fpm
#手动打补丁的启动方式/usr/local/php/sbin/php-fpmstart

sudo/usr/local/nginx/nginx

php-fpm关闭重启见文章结尾

六、浏览器访问

访问http://你的服务器ip/index.php,皆可以见到php信息了。





安装php-fpm时可能遇到的错误:

1.phpconfigure时出错

configure:error:XMLconfigurationcouldnotbefound

apt-getinstalllibxml2libxml2-dev(ubuntu下)
yum-yinstalllibxml2libxml2-devel(centos下)

2.PleasereinstalltheBZip2distribution

wgethttp://www.bzip.org/1.0.5/bzip2-1.0.5.tar.gztar-zxvfbzip2-1.0.5.tar.gz
cdbzip2-1.0.5
make
makeinstall

3.php的配置文件中有一行--with-mysql=/usr
安装的时候提示:
configure:error:CannotfindMySQLheaderfilesunderyes.
NotethattheMySQLclientlibraryisnotbundledanymore.

这是由于安装mysql时没有安装mysql头文件,或者是路径指定不正确,php找不到mysql的头文件引起的错误提示。
解决方法。
(1.)查看你的系统有没有安装mysqlheader
find/-namemysql.h
如果有。请指定--with-mysql=/跟你的正常路径。
如果没有。请看下一步。
(2.)redhat安装
rpm-ivhMySQL-devel-4.1.12-1.i386.rpm
(3.)ubuntu安装
apt-getinstalllibmysqlclient15-dev
(4.)最后一步php的配置选项添加--with-mysql=/usr即可!

4.Noinputfilespecified.

location~\.php${
roothtml;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;
includefastcgi_params;
}

5.如果phpconfigure时缺库,可以先安装库(ubuntu下)

sudoapt-getinstallmakebisonflexgccpatchautoconfsubversionlocate
sudoapt-getinstalllibxml2-devlibbz2-devlibpcre3-devlibssl-devzlib1g-devlibmcrypt-devlibmhash-devlibmhash2libcurl4-openssl-devlibpq-devlibpq5libsyck0-dev

6.mcrypt.hnotfound.Pleasereinstalllibmcrypt

apt-getinstalllibmcrypt-dev

或者

cd/usr/local/src
wgethttp://softlayer.dl.sourceforge.net/sourceforge/mcrypt/libmcrypt-2.5.8.tar.gztar-zxvflibmcrypt-2.5.8.tar.gz
cd/usr/local/src/libmcrypt-2.5.8
./configure--prefix=/usr/local
make
makeinstall

7.php-fpm5.4.7如何关闭重启?

php5.4.7下的php-fpm不再支持php-fpm以前具有的/usr/local/php/sbin/php-fpm(start|stop|reload)等命令,需要使用信号控制:

master进程可以理解以下信号

INT,TERM立刻终止QUIT平滑终止USR1重新打开日志文件USR2平滑重载所有worker进程并重新载入配置和二进制模块

示例:

php-fpm关闭:

kill-INT`cat/usr/local/php/var/run/php-fpm.pid`

php-fpm重启:

kill-USR2`cat/usr/local/php/var/run/php-fpm.pid`

查看php-fpm进程数:

psaux|grep-cphp-fpm

8.命令行下执行php,提示找不到命令

-bash:/usr/bin/php:Nosuchfileordirectory

vi/etc/profile

在文件底部增加一行配置
exportPATH=/usr/local/php/bin:$PATH

保存退出

source/etc/profile

13.nginx屏蔽ip

采集和防止采集是一个经久不息的话题,一方面都想搞别人的东西,另一方面不想自己的东西被别人搞走。

本文介绍如何利用nginx屏蔽ip来实现防止采集,当然也可以通过iptable来实现。

1.查找要屏蔽的ip

awk'{print$1}'nginx.access.log|sort|uniq-c|sort-n

nginx.access.log为日志文件,

会到如下结果,前面是ip的访问次数,后面是ip,很明显我们需要把访问次数多的ip并且不是蜘蛛的ip屏蔽掉,本例当中我们屏蔽掉165.91.122.67

...
13610202.112.113.192
95772180.169.22.135
337418219.220.141.2
558378165.91.122.67

2.在nginx的安装目录下面,新建屏蔽ip文件,命名为blockip.conf,以后新增加屏蔽ip只需编辑这个文件即可。加入如下内容

deny165.91.122.67;

保存一下。

3.在nginx的配置文件nginx.conf中加入如下配置,可以放到http,server,location,limit_except语句块,需要注意相对路径,本例当中nginx.conf,blocksip.conf在同一个目录中。

includeblockip.conf;


4.重启一下nginx的服务:/usr/local/nginx/nginx-sreload就可以生效了。

高级用法:

屏蔽ip的配置文件既可以屏蔽单个ip,也可以屏蔽ip段,或者只允许某个ip或者某个ip段访问。

#屏蔽单个ip访问

denyIP;

#允许单个ip访问

allowIP;

#屏蔽所有ip访问

denyall;

#允许所有ip访问

allowall;

#屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令

deny123.0.0.0/8

#屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令

deny124.45.0.0/16

#屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令

deny123.45.6.0/24

如果你想实现这样的应用,除了几个IP外,其他全部拒绝,
那需要你在blockip.conf中这样写

allow1.1.1.1;
allow1.1.1.2;
denyall;

单独网站屏蔽IP的方法,把includeblocksip.conf;放到网址对应的在server{}语句块,
所有网站屏蔽IP的方法,把includeblocksip.conf;放到http{}语句块。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: