一、编译安装Nginx
# yum install pcre-devel openssl-devel zlib-devel gcc gcc-c++ -y ==>编译前所需要的包
# groupadd -r nginx ==>新建nginx系统组
# useradd -r -g nginx nginx ==>nginx系统帐号
# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi
--prefix=/usr/local/nginx ==>安装部署后的根目录,默认为/usr/local/nginx
--conf-path=/etc/nginx/nginx/nginx.conf ==>配置文件的放置路径,默认<prefix>/conf/nginx.conf
--user=nginx ==>指定worker进程运行时所属的用户
--group=nginx ==>指定worker进程运行是所属的组
--error-log-path=/var/log/nginx/errpr.log ==>error日志放置位置
--http-log-path=/var/log/nginx/access.log ==>access日志放置的位置
--pid-path=/var/run/nginx/nginx.pid ==>pid文件的存放路径;默认<prefix>/logs/nginx.pid
--lock-path=/var/lock/nginx.lock ==>lock文件的放置路径;默认<prefix>/logs/nginx.lock
--with-http_ssl_module ==>提供HTTPS服务;该模块的安装依赖于OpenSSL开源软件
--with-http_stub_status_module ==>能够获取Nginx自上次启动以来的工作状态
--with-http_gzip_static_module ==> 如果采用gzip 模块把一些文档进行gzip 格式压缩后再返回给客户端,那么对同一个文件每次都会重新压缩,这是比较消耗服务器CPU 资源的. gzip static 模块可以在做gzip 压缩前,先查看相同位置是否有已经做过gzip 压缩的.gz 文件,如果有,就直接返回。这样就可以预先在
服务器上做好文档的压缩,给CPU 减负
--wiht-http_flv_modle ==>可以在向客户端返回响应肘,对FLV 格式的视频文件在header 头做一些处理,使得客户端可以观看、拖动FLV 视频
--with-http_mp4_module ==>使客户端可以观看、拖动MP4 视频
--http-client-body-temp-path=/var/tmp/nginx/client ==>set path to store http client request body temporary files
--http-proxy-temp-path=/var/tmp/nginx/proxy ==>Nginx 作为HTTP 反向代理服务器时,上游服务器产生的HTTP 包体在需要临时存放到磁盘文件时,这样的临时文件将放到该路径下;默认<prefix>/proxy _temp
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi ==>Fastcgi 所使用临时文件的放置目;默认<prefix>/fastcgi_temp
# make && make install
给nginxSysV脚本,修改程序安装路径、pidfile、lockfile路径
NGINX_CONF_FILE="/etc/nginx/nginx.conf" ==>SysV脚本中配置文件位置修改
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 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/local/nginx/sbin/nginx"
prog=$(basename $nginx)
pidfile="/var/run/nginx/nginx.pid"
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[-f /etc/sysconfig/nginx ]&&./etc/sysconfig/nginx
lockfile=/var/lock/nginx.lock
make_dirs(){
# make required directories
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
}
start(){
[-x $nginx ]|| exit 5
[-f $NGINX_CONF_FILE ]|| exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0]&& touch $lockfile
return $retval
}
stop(){
echo -n $"Stopping $prog: "
killproc $prog -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
RETVAL=$?
echo
}
force_reload(){
restart
}
configtest(){
$nginx -t -c $NGINX_CONF_FILE
}
rh_status(){
rh_status_q(){
rh_status >/dev/null 2>&1
}
case"$1"in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
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
# chmod +x /etc/rc.d/init.d/nginx ==>在路径下添加的Sys脚本赋予执行权限
# ss -tnl ==>确认80端口无人占用
#
# service nginx start
# /usr/local/nginx/sbin/nginx -t ==>测试配置文件,需要创建某些文件夹
# cd /usr/local/nginx/html ==>主页目录
二、虚拟主机
虚拟主机相关的配置:
1、server{} ==>定义一个虚拟主机
2、listen ==>监听的端口,
listen address[:port][default_server] ssl
backlog=number:指明TCP协议backlog队列的大小。默认为-1,表示不设置。在TCCp建立三次握手过程中,进程还没有开始处理监听句柄,这时backlog队列将会放置这些新连接。可如果backlog队列已满,还有新的客户端试图通过三次握手建立TCP连接,这时客户端会建立连接失败。
rcvbuf=size:设定监听的句柄的SO_RCVBUF参数;接收缓冲大小
sndbuf=size:设定监听句柄的SO_SNDBUF参数
deferred:用户发起建立连接请求,并且完成了TCP三次握手,内核也不会为了这次的连接调度worker进程来处理,只有用户真发送请求数据时(内核已经在网卡中收到请求数据包)内核才会唤醒worker进程处理这个连接。这个参数使用于大并发的情况,它减 轻了worker进程的负担。当请求数据来临时,worker进程才会开始处理这个连接。只有确认上面所说的应用场景复合自己的业务需求时,才可以使用它。
bind:绑定当前端口/地址对,如127.0.0.1:8000。只有同时对一个端口监听多个地址时才会生效。
ssl:在当前监听的端口上建立的连接必须基于SSL协议
3、server_name name [...]; ==>在开始处理一个HTTP请求时,Nginx会取出head头中的Host,与每个server中的server_name进行匹配,以此决定哪个server块来处理这个请求。服务器名,后可跟多个主机;名称还可以使用通配符和正则表达式(~匹配);
(1)先做精确匹配;www.magedu.com
(2)左侧通配符匹配;*.magedu.com
(3)右侧通配符匹配;www.*
(4)正则表达式匹配,~^.*\.magedu\.com$
(5)如果Host与server_name都不匹配,优先选择listen选项后加入[default | default_server]的server块,找到匹配listen端口的第一个server块
(6)server_name"":表示匹配没有Host这个HTTP头部的请求
4、location [=|~|~*|^~]/url {...}或location @name ==>允许根据用户请求的URI来匹配定义的各location,匹配到时此请求将被相应的location块中的配置所处理
=:精确匹配检查
^~:URI的前半部分匹配,不检查正则表达式
~:正则表达式模式匹配,区分字符大小写
~*:正则表达式模式匹配,不区分字符大小写
匹配优先级:精确匹配=、^~、~、~*、由不带符号的URL进行左侧匹配
5、root ==>设置web资源路径映射;用于指明请求的URL所对应的文档的目录路径;也可以用于loction或server中
6、alias path ==>用于location配置段,定义路径别名
注意:root表示指明路径为对应location的"/"URL;alias表示路径映射,即location中的URL是相对alias所指明的路径而言
7、index file ==>默认主页 index index.html
8、error_page code [...] [=code]URI | @name
根据http状态码重定向错误页面
=[code]:以指定的响应码进行响应;省略code以新请求的资源状态码为响应码
error_page 404 /404.html
9、try_files
try_files path1[,path2...] URI
三、常用配置
1、基于IP的访问控制:ngx_http_access_module
Syntax: allow|deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
允许192.168.1.0/24网段除了192.168.1.1的主机,允许10.1.1.0/16和IPv6的2001:0db8::/32,并拒绝所有
规则范围从小到大,从上往下匹配
2、基于用户的basic认证:ngx_http_auth_basic_module
Syntax: auth_basic string | off;
Default: auth_basic off;
Context: http, server, location, limit_except
# htpasswd -c /usr/local/nginx/users/htpasswd status ==>在/usr/local/nginx/users用httpd的密码生成工具生成密码
3、基于gzip实现响应报文压缩:ngx_http_gzip_module
gzip on | off; ==>启用和关闭gzip压缩;默认关闭
gzip_buffers number size; ==>压缩是buffer的大小和个数;默认gzip_buffers 32 4k|16 8k
gzip_comp_level level; ==>压缩级别,默认为1
gzip_disable regex ...; ==>哪些不进行压缩
gzip_min_length length; ==>最小多大的包可以压缩;默认为20字节
gzip_http_version 1.0 | 1.1; ==>协议;默认1.1
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; ==>默认关闭
gzip_types mime-type ...; ==>对那种压缩;默认 gzip_types text/html;
gzip_vary on | off; ==>Accept-Encoding;默认关闭
4、定制响应首部:ngx_http_headers_module
http://blog.sina.com.cn/s/blog_4560b80b0100nldc.html
这个模块允许设置任意的HTTP头。这个模块主要是处理浏览器的本地缓存,通过这个输出HTTP Headers Response,让浏览器如何处理本地缓存
expires仅仅适用于200, 204, 301, 302,和304应答
add_header name value [always];
expires
5、定制访问日志:ngx_http_log_module
Syntax: access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
定制出于httpd的combined格式相同的日志内容
6、定义合法引用:ngx_http_referer_module
none:直接输入网址打开的,允许引用
blocked:有首部没有值;如”http://”或“https://”;允许引用
server_names:如上图中的红框中所能匹配到的主机,允许引用
7、URL重写:ngx_http_rewrite_module
rewrite regex replacement [flag];
flag参数含义:
(1)last:无需客户端重发请求,在服务端重新检查规则
(2)break:无需客户端重发请求,不检查规则直接响应给客户端,避免循环重写
(3)redirect:返回一个临时重定向代码302,让客户端重新发请求
(4)permanent:返回一个永久重定向代码301,让客户端重新发请求
if (condition) { ... }
=:等于
!=:不等于
~:匹配模式,区分大小写的匹配
~*:匹配模式,不区分大小写的匹配
!~:不匹配模式则为真,匹配则为假,区分大小写
!~*:不匹配模式则为真,匹配则为假,不区分大小写
-f | !-f:是否存在且是文件
-d | !-d:是否存在且是目录
-e | !-e:是否存在
-x | !-x:是否存在且可执行
如果正则表达式中包含"}" 或":" 则需要用单引号或双引号括起来
return code [text];
return code URL;
return URL;
返回响应代码或其它的响应正文,响应正文或重定向的URL可以包含变量
set $variable value; ==>设定一个自定义变量
8、ngx_http_stub_status_module
active conections:活动连接数。
acceept:已接收的
hander:已处理的
request:总共处理的请求数
reading:正在接收客户端请求 c->s
write:正在发送响应,s->c
wating:空闲的客户端连接
9、https:ngx_http_ssl_module
# cd /etc/pki/CA/private/
# (umask 077;openssl genrsa -out cakey.pem 4096)
# openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3656
# mv cacert.pem ../
# touch {index.txt;serial}
# echo "01" > serial
# mkdir /etc/nginx/certs/
# cd /etc/nginx/certs/
# (umaks 077;openssl genrsa -out nginx.ley 2048)
# openssl req -new -key nginx.key -out nginx.csr
# openssl ca -in nginx.csr -out nginx.pem
·