一、Nginx 优点
-
高性能web,可以支持反向代理
-
比Apache性能优越,支持更多的并发连接,但资源占用很少,轻量级的web服务器。可以支持高达50000个并发连接数的响应
-
Nginx 在Linux 2.6+ 使用epoll模型,提供卓越性能
-
做为负载均衡服务器,可以在内部直接支持PHP和Rails,也可以支持作为HTTP代理服务器对外进行服务
-
Nginx使用C编写,不能是系统资源开销还是CPU使用效率都比Perbal要好
-
支持邮件代理服务器,也是一款非常优秀的邮件代理服务器,Nginx早期其实是一个邮件代理服务器
-
Nginx安装简单,配置文件简洁,还支持perl语言,bug很少,稳定性很好,几乎可以支持7&24小时不间断运行,还可以在实现在不间断提供服务情况实现平滑升级
-
在线帮助文档很丰富
二、软件获得及帮助文档
官方网址:http://nginx.org/
下载稳定版本:http://nginx.org/download/nginx-1.8.0.tar.gz
帮助文档:http://nginx.org/en/docs/
编译参数说明:http://nginx.org/en/docs/configure.html
三、软件安装
1、 ./configure –help 编译参数中文说明,可能不是很准确,敬请指正。
-
–with-rtsig_module。在Linux 2.2.19 内核默认情况下,实时信号连接不超过1024.使用rtsig模块可以突破这个限制。需要修改内核参数/proc/sys/kernel/rtsig-max,才能达到效果。centos 6.6没有这个内核参数,应该是不支持这个参数了。网上说Linux 2.6.6-mm2开始不再支持这个参数。centos 6.7的内核:2.6.32-504。这个参数在Linux2.6内核基本上不用了
-
–with-select_module select模式的性能同poll模块的性能相当。Linux内核2.6+的可以选择epoll模块
-
–with-threads 配置线程池。
-
–with-file-aio 开启通过异步I/0(允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成)的方式读取文件
-
异步I/O:针对网络I/O 使用epoll模型,针对文件(设备)的I/O使用AI0
-
AIO的基本思想:允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成,稍后或在接收到I/O操作完成通知时,进程可以检索I/O操作结果。在异步非阻塞I/O中,我们可以同时发起多个传输操作,这需要每个传输操作都有唯一的上下文,这样我们才能在他们完成时区分到底是哪个传输操作完成了,这个工作可以通过aiocb结构体进行区分
-
–with-http_spdy_module spdy是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。Linux的发行版提供的软件源里一般情况是不带这个功能,需要下载源码编译安装
-
–with-http_ssl_module 支持ssl
-
–with-http_realip_module 此模块支持显示真实来源IP地址,主要用于NGINX做前端负载均衡服务器使用,或者反向代理
-
–with-http_addition_module 游戏服务器不必安装,门户网站可以安装,有利于被搜索引擎收录页面信息。用于SEO:搜索引擎优化
-
–with-http_xslt_module 这个模块是一个过滤器,它可以通过XSLT模板转换XML应答。0.7.8后面版本才可以使用。
-
–with-http_image_filter_module 是nginx提供的集成图片处理模块,nginx-0.7.54以后的版本才可以使用。主要的功能:实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息。适用于访问不是太大,硬盘空间有限的情况下,高并发访问量不适合开启该模块
-
–with-http_geoip_module Linux的发行版提供的软件源一般情况是不带这个功能,需要下载源码编译安装。获取客户端的IP地址,在IP地址数据库中查询该IP来自哪个国家/城市 不一定准,只能做参考,很多时候IP数据库里的数据不准确。
-
–with-http_sub_module 能够在nginx的应答响应报文中搜索并替换某些文本
-
–with-http_dav_module 为文件和目录指定权限,限制不同类型的用户对于页面有不同的操作权限
-
–with-http_auth_request_module 认证模块
-
–with-http_gzip_static_module:提供对静态文件预压缩。例如:提供一个index.html的文件,在nginx访问之前对文件进行压缩成index.html.gz 这样nginx访问的时候大大节约带宽和时间(不需要压缩),nginx访问的是index.html.gz这个文件。可以选择压缩比高的算法,虽说占CPU资源,但是不是在nginx访问的时候进行压缩,这样并没有太大的问题
-
–with-http_gzip_module:通过Linux发行版的软件仓库的方式安装是提供的。这个是对文件进行压缩,压缩比一般超过50%
-
–with-http_random_index_module 选择一个随机的主页
-
–with-http_secure_link_module 这个模块用于为所需的安全性“令牌”计算和检查请求URL。在0.7.18版本以上的Nginx中提供了该模块。默认安装不包括此模块。对于0.8.50之后的版,有添加了secure_link_md5指令和secure_link_expires变量,因此,secure_link_secret已经不赞成使用了
-
–with-http_degradation_module 允许在内存不足的情况下返回204或444码。204:无内容。444:无响应
-
–with-http_stub_status_module Nginx健康状态检测模块,做反向代理服务器的时候对后端服务器的存活状态进行检测
-
ngx_http_geo_module 可以创建一个变量,变量的值依赖于客户端的IP地址。默认是开启的。如果不使用–without-ngx_http_geo_module
-
–with-http_charset_module:向响应报文头部“Content-Type”字段添加指定的字符,可用于不同字符集之间的转换(不同的编码之间进行转换)不过有局限性。例如:从服务器到客户端,仅仅单字节的字符集能被进行转换或者单字节字符集能被转到utf8格式或者从utf8格式转到单字节字符集
-
–with-http_userid_module: 对登录的UID设置适当的cookies信息。相当于Apache的mod uid模块
-
–without-http_map_module: map指令依赖于此模块。创建变量依赖于其他的变量。允许分类或者同时映射多个值到多个不同值并储存到一个变量中,map指令用来创建变量,但是仅在变量被接受的时候执行视图映射操作,对于处理没有引用变量的请求时,这个模块并没有性能上的缺失。
-
–with-http_referer_module:基于RefererHTTP请求头对请求进行过滤.referer是 http的headers,告诉服务器此请求是从哪个页面过来的
-
–with-http_proxy_module:http代理模块,一般是反向代理
-
–with-http_empty_gif_module:异步统计使用1×1的空白图片传递统计参数,提高性能,空图片运行在内存中,比使用静态文件传递参数效率要高
-
–with-http_upstream_hash_module: nginx工作于负载均衡模型中由upstream将请求调度到上游服务器。hash模块执行hash运算的。
调度算法:
-
ip_hash(源地址hash,将来自同一IP的请求调度同一个Real Server。可以解决session问题)、
-
最小连接数,可以基于权重
-
轮询,可以基于权重
-
fair:第三方,按后端服务器的响应时间来分配请求,响应时间短的优先分配)
-
url_hash:第三方,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,nginx为缓存服务器时比较有效
-
–with-http_upstream_keepalive_module:keepalive 常连接模块
-
–with-http_perl_module:Perl模块支持Perl脚本,比fast-cgi模型性能稍好
-
解决依赖关系:yum -y install perl perl-devel perl-ExtUtils-Embed
-
–with-ld-opt="-Wl,-E"。加入perl模块,需要加上这项,否则会报错
-
–with-http_split_clients_module 该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等,禁用–without-http_split_clients_module
-
–without-http_browser_module 禁用ngx_http_browser_module支持(该模块用来创建依赖于请求报头的值。如果浏览器为modern ,则$modern_browser等于modern_browser_value指令分配的值;如 果浏览器为old,则$ancient_browser等于 ancient_browser_value指令分配的值;如果浏览器为 MSIE中的任意版本,则 $msie等于1)
2、安装之前解决依赖关系。yum -y install pcre openssl-devel pcre-devel zlib-devel gcc
3、需要手动创建nginx组和nginx用户
groupadd -r -g nginx
useradd
4、安装nginx
./configure –prefix=/usr/local/nginx –user=nginx –group=nginx –with-threads –with-http_ssl_module –with-http_spdy_module –with-http_realip_module –with-http_addition_module –with-http_dav_module –with-http_gunzip_module –with-http_auth_request_module –with-http_gzip_static_module –with-http_degradation_module –with-http_stub_status_module –http-log-path=/var/log/nginx.log –with-http_perl_module –with-ld-opt="-Wl,-E" –error-log-path=/var/log/nginx_errorlog.log
注释:–with-ld-opt="-Wl,-E" 加入perl模块后需要加入这项,防止安装完成后启动nginx时报错。这项的作用优化C编译器
make && make instal
5、下面做的一些操作完全是为了保持使用yum方式安装的习惯:配置文件的路径,程序启动使用简单的命令而非完整的路径等
-
cp /usr/local/nginx/sbin/nginx
/usr/sbin/nginx 这样可以在任意路径使用nginx命令,不需要使用完整的路径:/usr/locla/ngins/sbin/nginx。当nginx重新编译过后会产生新的nginx程序,这时候也要相应的将/usr/sbin/目录里的nginx也更新了。也可以通过修改环境变量PATH的方式: echo "PATH=/usr/local/nginx/sbin/:$PATH" >> /etc/profilesource /etc/profile #使其立即生效
-
复制配置文件 mkdir /etc/nginx/ && cp /usr/local/nginx/conf/{nginx.conf,mime.types} /etc/nginx/
-
创建nginx的启动脚本可以使用service方式启动,重启,查看状态以及重载配置文件等。vim /etc/init.d/nginx
#!/bin/sh
#
# nginx – this script starts and stops the nginx daemon
#
# chkconfig: – 85 15 85表示启动顺序号,第85个启动,15代表关闭顺序号,第15个关闭
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*–user=\([^ ]*\).*/\1/g' -`
#nginx -V 2>&1 | grep "configure arguments:" | cut -d '-' -f 5 | cut -d '=' -f 2 等同于上面的代码的功能
#[^*]* 表示把–user前面的内容去掉 \(表示转义 [^ ]* 表示零个,一个或多个非空白字符 \([^ ]*\) 表示被引用的对象,
#后面的\1 就是引用这里括起来的内容
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
}
#make_dirs 函数的作用是先获取nginx使用哪个用户进行运行,然后将下面这些路径的属主改为该用户。
#并且是递归的方式修改,也就是子文件夹及其里面所有文件的属主都为此用户。
# –http-client-body-temp-path=/var/tmp/nginx/client/ \
# –http-proxy-temp-path=/var/tmp/nginx/proxy/ \
# –http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
# –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
# –http-scgi-temp-path=/var/tmp/nginx/scgi \
start() {
[ -x $nginx ] || exit 5
#-x 表示/usr/local/nginx 是否有执行的权限,有就执行下一条命令并返回0.如果没有就返回5并退出整个脚本
[ -f $NGINX_CONF_FILE ] || exit 6
#-f 表示/etc/nginx/nginx.conf是否存在。存在执行下一条命令返回0.没有就返回6并退出整个脚本
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE #检查nginx的配置文件
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT #运行killproc 需要先运行. /etc/rc.d/init.d/functions.
#使用function脚本提供的PATH变量,umask,以及语言环境等。killproc也在此脚本中.
#-QUIT 停止信号
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP #运行killproc 需要先运行. /etc/rc.d/init.d/functions 使用function脚本提供的PATH变量,
RETVAL=$? #umask,以及语言环境等。killproc也在此脚本中。-HUP 重载配置文件
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0 #如果在运行状态,就返回0并且停止执行当前脚本,否则调用start函数
$1 #调用start() 函数
;;
stop)
rh_status_q || exit 0 #如果在运行状态,就调用stop函数,否则返回0并停止执行当前脚本
$1 #调用stop() 函数
;;
restart|configtest) #restart 或者configtest 这两个参数
$1 #调用restart() 函数 或者调用configtest函数
;;
reload)
rh_status_q || exit 7
$1 #调用reload() 函数
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
-
需要给此脚本添加执行的权限。chomd o+x /etc/init.d/nginx
-
设置开机自动启动 chkconfig -add nginx;chkconfig nginx on
-
可以启动nginx:service nginx start
-
ss -utnlp | grep 80 #nginx已经启动,并且监听在80套字节上
tcp LISTEN 0 128 *:80 *:* users:(("nginx",39796,6),("nginx",39797,6))
-
尝试本机访问nginx
[root@firewall nginx]# curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
至此nginx安装完成
nginx基础篇就写在这里,下一篇写nginx作为web服务器、web反向代理的具体实现。
原创文章,作者:jslijb,如若转载,请注明出处:http://www.178linux.com/12850
评论列表(2条)
代码缺少格式化,难看了点
@stanley:上次说我没有格式化,我这次特定做了格式化,可是还是说没有格式化,那您能告诉我格式化的标准码?否则我不知道如何达到您的要求。