Nginx介绍
Nginx("engine x")是一个高性能的http和反向代理服务,也是一个IMAP/POP3/SMTP代理服务器。由lgorsysoev为俄罗斯访问量第二的Rambler.ru站点开发。Nginx因为它的稳定性,丰富的功能及低内存消耗等特性而闻名,目前国内各大门户网站已经部署了Nginx,如新浪网易,腾讯等。
一、Nginx特性:
(1)模块化设计,较好的扩展性
(2)高可靠性
master主控进程-->worker子进程,缓存加载
(3)低内存消耗
(4)支持热部署:
不停机而更新配置文件、日志文件、升级程序
(5)支持事件驱动、AIO(异步IO)、mmap(内存映射)
二、基本功能:
(1)静态资源的web服务器,能缓存打开的文件描述符
(2)能做http、smtp、pop3协议的反向代理服务器
反向代理服务器:客户端请求发到反向代理服务器,数据再封装后再发给服务器,反向代理可经过多个,服务器回应的数据再通过代理服务器封装后发给客户端
(3)缓存、负载均衡
负载均衡:客户端请求到代理服务器,再由代理服务器分发到不同的服务器
(4)支持FastCGI(fpm,lnmp),uwsgi(python)等
(5)模块化(非DSO机制)、过滤器zip、SSI及图像的大小调整
(6)支持SSL
三、扩展功能:
基于名称和IP的虚拟主机
支持keepalive
支持平滑升级
定制访问日志、支持使用日志缓冲区提供日志存储性能
支持url rewrite
支持路径别名
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制
四、Nginx的基本架构
一个master进程,生成一个或多个worker进程
事件驱动:epoll(边缘触发,linux)、kqueue(BSD),/dev/poll(WINDOWS)
复用器:select
支持sendfile,sendfile64
支持AIO
支持mmap
nginx的工作模式:非阻塞、事件驱动、由一进程生成多个worker线程,每个worker响应多个请求
五、模块类型:
standard HTTP modules 标准HTTP模块
optional HTTP modules 可选模块
mail modules 邮件模块
3rd party modules 第三方模块
六、配置文件
main配置段://核心模块
event:event模型工作特性
http:http协议相关配置
配置指令以分号结尾,语法格式
directive value1 ...
支持使用变量
内置变量
模块提供内建变量
自定义变量
set var_name value
七、基本配置的类别
1、用于调试、定位问题
2、正常运行配置
3、优化性能配置
4、事件相关配置
详解Nginx的配置
(1)正常运行的必备配置:
1、user USERNAME [GROUPNAME]; 指定运行worker进程的用户和组; user nginx nginx; 2、pid /path/to/pid_file; 指定nginx守护进程的pid文件; pid /var/run/nginx/nginx.pid; 3、worker_rlimit_nofile #; 指定所有worker进程所能够打开的最大文件数;
(2)性能优化相关的配置:
1、worker_processes #; 进程数 worker进程的个数;通常应该略少于CPU物理核心数; 2、worker_cpu_affinity cpumask ...; 绑定CPU 把工作进程绑定到CPU的设置 3、timer_resolution interval; 计时器解析度 计时器解析度;降低此值,可减少gettimeofday()系统调用的次数; 4、worker_priority number; 进程nice值 指明worker进程的nice值; -20, 19 100, 139
(3)事件相关的配置:
1、accept_mutex off|on; 负载均衡锁打开时能让多个worker轮流地响应请求 2、lock_file file; accept_mutex用到的锁文件路径; 3、use [epoll|rtsig|select|poll]; 指明使用的事件模型;建议让Nginx自行选择; 4、worker_connections #; 单个worker处理最大连接数,整个最大连接数是与wroker进程数相乘 worker_connections * work_processes
(4)用户于调试、定位问题:
1、daemon {on|off};
是否以守护进程方式运行nginx;调试时应该设置为Off;
2、master_process {on|off};
是否以master/worker模型来运行nginx; 调试时可以设置为off;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
error_log 位置 级别;
若要使用debug级别,需要在编译nginx时使用了--with-debug选项;总结:常需要进行调整的参数
worker_processes, 略少于CPU数
worker_connections, 51200
worker_cpu_affinity, 绑定CPU cpumask
worker_priority -10
新改动配置生效的方式:
#nginx -s reload
八、Nginx作为web服务器时使用的配置:
http {}:由ngx_http_core_module模块所引入;
(1)配置框架:
http {
upstream {
...
}
server {
location URL {
root "/path/to/somedir";
...
} # 类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系;
location URL {
if ... {
...
}
}
} # 每个server类似于httpd中的一个<VirtualHost>;
server {
...
}
}
注意:与http相关的指令仅能够放置于http、server、location、upstream、if上下文,但有些指令仅应用于这5种上下文中的某些种;(2)配置指令:
1、server {}
定义一个虚拟主机;
server {
listen 8080;
server_name www.magedu.com;
root "/vhosts/web1";
}
2、listen
指定监听的地址和端口;
listen address[:port];
listen port;
3、server_name NAME [...];
后可跟多个主机;名称还可以使用正则表达式(~)或通配符;
(1) 先做精确匹配检查;
(2) 左侧通配符匹配检查:*.magedu.com
(3) 右侧通配符匹配检查:如mail.*
(4) 正则表达式匹配检查:如 ~^.*\.magedu\.com$
(5) default_server;
server {
server_name www.magedu.com;
}
server {
server_name *.magedu.com;
}
server {
server_name mail.*
}
4、root path;
设置资源路径映射;用于指明请求的URL所对应的资源所在的文件系统上的起始路径;
5、location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
根据请求URI配置location,可做访问控制,支持正则表达式和通配符
=:精确匹配检查;
~: 正则表达式模式匹配检查,区分字符大小写;
~*: 正则表达式模块匹配检查,不区分字符大小写;
^~:URI的前半部分匹配,不支持正则表达式;
匹配的优先级:精确匹配(=)、^~、~、~*、不带任何符号的location;
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
“/” 匹配A
“/index.html” 匹配B
“/documents/document.html” 匹配C
“/images/1.gif” 匹配D
“/documents/1.jpg” 匹配E
6、alias path;
用于location配置段,定义路径别名
location /images/ {
root "/vhosts/web1";
}
http://www.magedu.com/images/a.jpg <-- /vhosts/web1/images/a.jpg
location /images/ {
alias "/www/pictures";
}
http://www.magedu.com/images/a.jpg <-- /www/picuter/a.jpg
注意:root表示指明路径为对应的location "/" URL; alias表示路径映射,即location指令后定义的URL是相对于alias所指明的路径而言;
7、index file;
默认主页面;
index index.php index.html;
8、error_page code ... [=[response]] uri;
根据http响应状态码来指明特用的错误页面;
#vim /vhosts/web1/404_customed.html
#vim /etc/nginx/nginx.conf
location / {
error_page 404 /404_customed.html;
}
[=[response]]:以指定的响应码进行响应,而不是默认的原来的响应;默认表示以新资源的响应码为其响应码;
9、基于IP的访问控制
allow IP/Network;
deny IP/Network;
#vim /etc/nginx/nginx.conf
location / {
deny 172.16.100.6;
}
#/usr/local/nginx/sbin/nginx -t //测试语法
#/usr/local/nginx/sbin/nginx -s reload
10、基于用户的访问控制
basic, digest;
auth_basic "";
auth_basic_user_file "/PATH/TO/PASSWORD_FILE"
账号密码文件建议使用htpasswd来创建;
#vim /etc/nginx/nginx.conf
location / {
auth_basic "only for VIP";
auth_basic_user_file /etc/nginx/users/.htpasswd;
}
#mkdir -p /etc/nginx/users
#cd /etc/nginx/users
#htpasswd -c -m /etc/nginx/users/.htpasswd tom
添加密码
#/usr/local/nginx/sbin/nginx -t //测试语法
#/usr/local/nginx/sbin/nginx -s reload
11、https服务
生成私钥,生成证书签署请求,并获得证书;
CA服务端:
#cd /etc/pki/CA
#(umask 077;openssl genrsa -out private/cakey.pem 2048)
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 30000
CN,HA,ZZ,magedu,ops,ca.magedu.com,caadmin@admin.com
#touch servial index.txt
#echo 01 > servial
CA客户端
#cd /etc/nginx
#mkdir ssl
#cd ssl
#(umask 077;openssl genrsa -out nginx.key 1024)
#openssl req -new -key nginx.key -out nginx.csr
CN,HA,ZZ,magedu,ops,www.magedu.com,web@admin.com
CA服务端
#openssl ca -in nginx.csr -out nginx.crt -days 3650
CA客户端:
#vim /etc/nginx/nginx.conf
server {
listen 443 ssl;
server_name www.magedu.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /vhosts/web1;
index index.html index.htm;
}
}
#/usr/local/nginx/sbin/nginx -t //测试语法
#/usr/local/nginx/sbin/nginx -s reload
12、stub_status {on|off};
仅能用于location上下文;
location /status {
stub_status on;
allow 172.16.0.0/16;
deny all;
}
结果示例:
Active connections: 6 # 当前所有处于打开状态的连接数;
server accepts handled requests
241 241 431
(1) 已经接受过的连接数
(2) 已经处理过的连接数
(3) 已经处理过的请求数;在“保持连接”模式下,请求数量可能会多于连接数量;
Reading: 0 Writing: 1 Waiting: 5
Reading:正处于接收请求状态的连接数;
Writing: 请求已经接收完成,正处于处理请求或发送响应的过程中的连接数;
Waiting:保持连接模式,且处于活动状态的连接数;
13、rewrite regex replacement flag;
例如:
...
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;
....
http://www.magedu.com/images/a/b/c/1.jpg --> http://www.magedu.com/imgs/a/b/c/1.jpg
flag:
last:一旦此rewrite规则重写完成后,就不再被后面其它的rewrite规则进行处理;而是由User Agent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程
break:一旦此rewrite规则重写完成后,由User Agent对新的URL重新发起请求,且不再会被当前locatrion内的任何rewrite规则所检查;
redirect:以302响应码(临时重定向)返回新的URL;
permanent:以301响应码(永久重定向)返回新的URL;
14、if
语法:if (condition) {...}
应用环境:server, location
condition:
(1) 变量名;
变量值为空串,或者以“0”开始,则为false;其它的均为true;
(2) 以变量为操作数构成的比较表达式
可使用=, !=类似的比较操作符进行测试;
(3) 正则表达式的模式匹配操作
~: 区分大小写的模式匹配检查
~*: 不区分大小写的模式匹配检查
!~和!~*:对上面两种测试取反
(4) 测试路径为文件可能性:-f, !-f
(5) 测试指定路径为目录的可能性:-d, !-d
(6) 测试文件的存在性:-e, !-e
(7) 检查文件是否有执行权限:-x, !-x
例如:
if ($http_user_agent ~* MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
http_user_agent 客户端浏览器
MSIE 微软浏览器
15、防盗链
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referer none blocked www.magedu.com;
if ($invalid_referer) {
rewrite ^/ http://www.magedu.com/403.html;
}
}
valid_referer none blocked 定义合法引用
16、定制访问日志格式
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
access_log logs/access.log main;
注意:此处可用变量为nginx各模块内建变量;九、安装方法:
源码:编译安装
程序包:rpm
1、安装gcc开发环境
#yum -y instal "Development tools" "Server Platform Development"
2、安装 pcre-devel openssl-devel
#yum -y install pcre-devel openssl-devel
#设置用户
#groupadd -r nginx
#useradd -r -g nginx nginx
4)下载nginx-1.4.7稳定版
# wget http://nginx.org/download/nginx-1.4.7.tar.gz
编译安装
# tar xf nginx-1.4.7.tar.gz
# cd nginx-1.4.7
# ./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 --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
# make && make install
# mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi}
5)检测配置文件语法
# /usr/sbin/nginx -t
6) 提供启动脚本
# vim /etc/rc.d/init.d/nginx
内容如下
# 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/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‘ -`
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() {
status $prog
}
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
7)添加到系统服务并开机启动
# chkconfig --add nginx
# chkconfig nginx on
# chkconfig --list nigx
8) 设置nginx配置文件的语法高亮
# mkdir ./vim/syntax -pv
# cd .vim/syntax
# wget http://www.vim.org/scripts/download_script.php?src_id=19394
# cd .vim
# vim filetype.vim 内容如下
au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == ‘‘ | setfiletype nginx | endif
9)启动服务
# service nginx start
# pa aux | grep nginx
至此,编译及后续工作完成本文出自 “蜗牛” 博客,请务必保留此出处http://linuxkingdom.blog.51cto.com/6334977/1654707
原文:http://linuxkingdom.blog.51cto.com/6334977/1654707