nginx基础
Nginx(发音engine x)专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消耗,以及对HTTP并发连接的高处理能力(单台物理服务器可支持30000~50000个并发请求)。正因为如此,大量提供社交网站、新闻资讯、电子商务以及虚拟主机等服务的企业纷纷选择Ngnix来提供WEB服务。如新浪,金山,网易,腾讯,百度文库,51cto,人人网等。
网站 apache IIS lighttpd html
负载均衡 lvs haproxy
反向代理 squid varnish
apache select
nginx epoll事件模型
Nginx官方站点:http://nginx.org
wget http://nginx.org/download/nginx-1.6.2.tar.gz
淘宝Tengine:http://tengine.taobao.org/
http://toolbar.netcraft.com/site_report?url=undefined#last_reboot
1)安装支持软件:
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成。
1
2
3
4
|
[root@nginx ~] # service iptables stop [root@nginx ~] # setenforce 0 [root@nginx ~] # service httpd stop [root@nginx ~] # yum -y install pcre-devel(支持rewrite规则的模块) zlib-devel |
2)创建运行用户、组:
Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。如:创建一个名为nginx的用户,不建立宿主目录,也禁止登录到shell环境。
1
|
[root@nginx ~] # useradd -M -s /sbin/nologin nginx |
3)编译安装nginx:
释放nginx源码包 tar xf nginx-1.6.2
编译前配置:
1
2
|
[root@nginx ~] # cd /usr/src/nginx-1.6.2/ [root@nginx nginx-1.6.2] # ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module |
注:配置前可以参考:./configure --help给出说明
--prefix 设定Nginx的安装目录
--user和—group 指定Nginx运行用户和组
--with-http_stub_status_module 启用http_stub_status_module模块以支持状态统计
--with-http_ssl_module 启用SSL模块
--with-http_flv_module 启用FLV模块,提供寻求内存使用基于时间的偏移量文件
编译 安装:
1
|
[root@nginx nginx-1.6.2] # make && make install |
为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行nginx命令就可以调用Nginx的主程序。
1
2
3
|
[root@nginx nginx-1.6.2] # ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/ [root@nginx nginx-1.6.2] # ll /usr/local/bin/nginx lrwxrwxrwx 1 root root 27 12-29 07:24 /usr/local/bin/nginx -> /usr/local/nginx/sbin/nginx |
Nginx的运行控制:
与Apache的主程序httpd类似,Nginx的主程序也提供了"-t"选项用来对配置文件进行检查,以便找出不当或错误的配置。配置文件nginx.conf默认位于安装目录/usr/local/nginx/conf/目录中。若要检查位于其他位置的配置文件,可使用"-c"选项来指定路径。
主程序Nginx支持标准的进程信号,通过kill或者killall命令传送
HUP 重载配置 等同于-1
QUIT 退出进程 等同于-3
KILL 杀死进程
USR1 重新写入日志
USR2 平滑重启
1
2
3
|
[root@nginx ~] # killall -s HUP nginx [root@nginx ~] # killall -s QUIT nginx [root@nginx ~] # netstat -anpt |grep :80 |
nginx 服务脚本
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f nginx defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add nginx'
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
# Author: licess
# website: https://lnmp.org
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=nginx
NGINX_BIN=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/conf/$NAME.conf
PIDFILE=/usr/local/nginx/logs/$NAME.pid
if [ -s /bin/ss ]; then
StatBin=/bin/ss
else
StatBin=/bin/netstat
fi
case "$1" in
start)
echo -n "Starting $NAME... "
if $StatBin -tnpl | grep -q nginx;then
echo "$NAME (pid `pidof $NAME`) already running."
exit 1
fi
$NGINX_BIN -c $CONFIGFILE
if [ "$?" != 0 ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
stop)
echo -n "Stoping $NAME... "
if ! $StatBin -tnpl | grep -q nginx; then
echo "$NAME is not running."
exit 1
fi
$NGINX_BIN -s stop
if [ "$?" != 0 ] ; then
echo " failed. Use force-quit"
exit 1
else
echo " done"
fi
;;
status)
if $StatBin -tnpl | grep -q nginx; then
PID=`pidof nginx`
echo "$NAME (pid $PID) is running..."
else
echo "$NAME is stopped."
exit 0
fi
;;
force-quit|kill)
echo -n "Terminating $NAME... "
if ! $StatBin -tnpl | grep -q nginx; then
echo "$NAME is is stopped."
exit 1
fi
kill `pidof $NAME`
if [ "$?" != 0 ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
restart)
$0 stop
sleep 1
$0 start
;;
reload)
echo -n "Reload service $NAME... "
if $StatBin -tnpl | grep -q nginx; then
$NGINX_BIN -s reload
echo " done"
else
echo "$NAME is not running, can't reload."
exit 1
fi
;;
configtest)
echo -n "Test $NAME configure files... "
$NGINX_BIN -t
;;
*)
echo "Usage: $0 {start|stop|restart|reload|status|configtest|force-quit|kill}"
exit 1
;;
nginx服务器配置过程中的root路径配置
http模块配置
4、状态统计及虚拟主机应用:
Nginx内置了HTTP_STUB_STATUS状态统计模块,用来反馈当前的WEB访问情况。配置
编译参数时可添加--with-http_stub_stastus_module来启用此模块。要使用Nginx的状态统计功能,除了启用内建模块以外,还需要修改nginx.conf文件,指定访问位置并打开stub_status配置。在http{}配置的server{}子配置内添加如下配置项
server{
location /nginx_status{
stub_status on;
access_log on;
}
}
Active connections: 1
server accepts handled requests
1 1 3
Reading: 0 Writing: 1 Waiting: 0
Active connections 表示当前活跃的连接数,
第二行的三个数字表示Nginx当前总共 处理了1个连接,成功创建1次握手,总共处理了3个请求。
最后一行的Reading表示Nginx读取到客户端Header信息数,
Writing表示Nginx返回给客户端的Header信息数
“Waiting”表示Nginx已经处理完,正在等候下一次请求指令时的驻留连接数。
Nginx 支持为目录添加密码认证
将每天的日志重新切割存放
./ ->configuration A
.
/documents/document
.html -> configuration B
.
/images/1
.gif -> configuration C
.
/document/1
.jpg -> configuration D
Nginx rewrite
Rewrite 主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE(Perl Compatible Regular Expressions)
perl兼容正则表达式的语法进行规则的功能,在编译Nginx之前,需要编译安装PCRE库
URL是Uniform Resource Location的缩写,译为“统一资源定位符”。如:http://www.linkwan.com/111/welcome.htm
URI由一个通过通用资源标志符(Universal Resource identifier,简称“URI”)进行定位。
if指令
规则语法
rewrite语法规则
变量名
变量名可以使用"="或"!="运算符
"~" 符号表示区分大小写字母的匹配
"~*" 符号表示不区分大小写字母的匹配
"!~" 和"!~*"与"~" "!~"相反
"-f"和"!-f" 用来判断文件是否存在
"-d"和"!-d" 用来判断目录是否存在
"-e"和"!-e" 用来判断文件或目录是否存在
"-x"和"!-x" 用来判断文件是否可以执行
也支持$!到$9位置化参数
return指令
示例,如果访问的URL以"*.sh" "*.bash"结尾,则返回状态码403