Nginx全称为engine x,由于调用了libevent这个高性能的网络库,使得nginx的性能相对于其他web服务更加强悍。它还支持事件驱动机制、异步I/O、支持内存映射等这些比较高效的功能。
Nginx的特性:
扩展性:nginx是模块化设计,有比较好的扩展性,但是nginx中的模块不支持动态装卸载,只能在扩展的时候直接静态编译进nginx中,随着nginx的启动而启动。
高可靠性,这种高可靠性是由于nginx的工作机制所实现的,nginx在工作时首先提供一个主控进程,这个主控进程并负责读取并验证配置文件、创建关闭或绑定套接字、启动终止维护实际工作子进程的个数、在线加载新配置文件、完成版本的平滑升级等,接收、响应用户请求,实际工作是由主进程生成的子进程完成的,这些子进程负责缓存加载、响应用户请求、缓存管理(cache managre)等。
Nginx还具有低内存消耗,这种特性是由于nginx是一个线程响应N个请求实现的,据说10000个keep-alive状态的连接仅消耗2.5MB内存。
支持热部署,如果配置文件更新或版本升级,在这期间不用重启或关闭NGINX,新配置或版本完成配置后会自动生效。
NGINX的基本功能:
1、 nginx是一个可以提供静态资源的web服务器,可以缓存打开的文件描述符(提升打开文件性能的一种方式);
2、 支持http、smtp、pop3协议的反向代理服务器(缓存加速+反代);
3、 可作为负载均衡调度器;
4、 支持fastcgi协议,能够与fpm模式的http服务器共同提供lnmp;
5、 模块化(非DSO机制)、支持过滤器、SSI及图像大小调整;
6、 支持SSL
扩展功能:
1、基于名称和IP的虚拟主机;
2、支持keepalive;
3、支持平滑升级;
4、定制访问日志、支持使用日志缓冲区提供日志存储性能;
5、支持url rewrite;
6、支持路径别名;
7、支持基于IP及用户的访问控制;
8、支持速率限制,支持并发数限制。
NGINX的基本架构特性:看图自己理解
NGINX安装方法:
编译安装NGINX
安装前确认已安装Development Tools、Server Platform Development、pcre-devel(url重写需要用到)
groupadd –r nginx
useradd –g nginx –r 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指明pid文件路径
--lock-path=/var/lock/nginx.lock锁文件存放位置
--with-http_ssl_module启用ssl模块
--with-http_stub_status_module启用状态页面模块
--with-http_gzip_static_module启用压缩模块
--with-http_flv_module启用流媒体flv模块
--with-http_mp4_module支持流媒体mp4模块
--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}
nginx配置:
修改配置使之重新生效:nginx -s [reload | stop | quit | reopen]
nginx服务运行的基本配置:(main配置)
1、user USERNAME[GROUPNAME];指定运行worker进程的用户和组;
2、pid /path/to/PID_FILE;指定nginx守护进程的pid文件;可以指定写成安装时的路径pid /var/run/nginx/nginx.pid;
3、worker_rlimit_nofile#;指定所有worker进程所能够打开的最大文件句柄数;
性能优化相关配置:
1、worker_processes #;指明打开worker进程的个数;通常应该略少于CPU物理核心数;(最常使用,一般会比物理核心数)
2、worker_cpu_affinityCPUMASK;通过worker与cpu绑定实现提升缓存的命中率,其中,用cpumask代表cpu的核心;(常用)
cpumask:
0000 0001第一个核心
0000 0010第二个核心
0000 0100第三个核心
0000 1000第四个核心
表示方法:worker_cpu_affinity 00000001 00000010 00000100;(含义:把worker进程版定在第一二三个核心上)
3、timer_resolution计时器解析度;降低此值,可减少gettimeofday()系统调用的次数;
4、worker_prioritynumber;指明worker进程的优先级(使用nice值,常用);
Nice值的优先级对应关系为-20对用100,19对应139,数值越小,优先级越高。
事件相关的配置:(event配置)
1、accept_mutex{off|on}; 主进程调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求;
2、lock_file FILE; accept_mutex用到的锁文件路径;
3、use[epoll|rtsig|select|poll];指明使用的事件模型;建议让Nginx自行选择;
4、worker_connections#;设定单个worker进程所能够处理的最大并发连接数量;(常用)
用户于调试、定位问题:(若要使用debug级别,需要在编译nginx时使用--with-debug选项)
1、 daemon {on|off};是否以守护进程方式运行nginx;调试时应该设置为Off,也就是运行时在前台运行,所有日志等信息全部显示在前台,有助于调试;
2、 master_process {on|off};是否以master/worker模型来运行nginx; 调试时可以设置为off;
nginx作为web服务器时的配置
当作为类似于httpd服务提供静态页面访问服务只需要配置nginx.conf,其中与http相关的指令仅能够放置于http、server、location、upstream、if上下文中;
这里面server相当于httpd中的virtualhost,location相当于httpd中的documentroot
举例:创建一个主机名为www.tony.com,监听端口8080,网页文件位置在/vhost/web1/的虚拟主机,主页文件为index.html内容为we1
这样就定义好一个虚拟主机了,其中监听的端口也可换成listen IP:PORT的形式;
server_nameNAME [...];后可跟多个主机名,名称还可以使用正则表达式(~)或通配符,当定义多个虚拟主机时,先做精确匹配检查,然后做左侧通配符匹配检查,然后做右侧通配符匹配检查,然后做正则表达式匹配检查,最后做默认主机名检查,见下:
server {
server_namewww.tony.com;
}
server {
server_name*.tony.com;
}
server {
server_namemail.*
}
server {
server_name~^.*\.tony\.com$
location这里和httpd中的documentroot差不多,但是有一点不同的是,一个server中可以有几个不同的location,各个location定义的路径不同。当有客户端访问时,也会基于层层匹配机制做检查。例如:
server {
listen 80;
server_namewww.tony.com;
location/ {
root"/vhosts/web1";
}
location/images/ {
root"/vhosts/images";
}
location ~*\.php$ {
fcgipass
}
}
上述三个location定义后,如访问http://www.tony.com/bbs/index.php,则会找最后一个先匹配,这里~*为正则表达式模块匹配检查,不区分字符大小写的意思,还有其他的几个,分别为:
=:精确匹配检查;
~: 正则表达式模式匹配检查,区分字符大小写;
~*: 正则表达式模块匹配检查,不区分字符大小写;
^~:URI的前半部分匹配,不支持正则表达式。
这里匹配的优先级为:精确匹配(=)、^~、~、~*、不带任何符号的location。
alias path路径映射,用于location配置段,定义路径别名,举例说明root和alias的区别:
root表示指明路径为对应的location "/" URL;alias表示路径映射;
location/images/ {
root "/vhosts/web1";
}
http://www.tony.com/images/a.jpg<-- /vhosts/web1/images/a.jpg
alias表明location指令后定义的URL是相对于alias所指明的路径而言;
location/images/ {
alias "/www/pictures";
}
http://www.tony.com/images/a.jpg<-- /www/picuter/a.jpg
默认主页面:
IndexFILE;
Index.html或index.php
就是第三行中的这样
Error_page错误页面:根据http响应状态码来指明特用的错误页面;
其中500,502,503,504代表错误码,/50x.html代表错误页,因为编译安装的时候,将错误页面直接放进了/usr/local/nginx/html/下,所以访问错误时,会自动调用该错误页面。
错误页面表示方法:error_page *** /ERRORPAGE_FILE或者error_page code=***/ERRORPAGE_FILE
举例:为8080端口的虚拟主机设置错误页面,此表示当输入8080端口后的无效页面时,nginx会自动调用/vhost/we1/目录下的404页面
举例:当值访问页面错误码为200,则在访问时打开调试窗口看到的错误码就是200了
基于IP的访问控制,可以放在server、location中达到基于IP的访问控制的功能
allowIP/Network;
denyIP/Network;
基于主机名的访问控制,举例说明:
先将auth_basic(认证时显示的内容)和auth_basic_user_file(认证所需的用户名密码文件)添加好
建立/.passwd文件
使用htpasswd建立用户名和密码并重载服务即可
这样在基于8080端口的虚拟主机就可以使用用户名密码访问了。
在nginx中实现https服务:在同一台主机上生成证书及签发证书
建立CA
建立字签证书
切换到nginx目录中建立ssl目录,在其中创建秘钥
建立证书签署请求
签署证书
这样,在nginx实现https就完成了。
启用或关闭状态页:但仅能用于location上下文:
举例:建立允许172.16.0.0这个网络的主机可以访问的status页面
location/status {
stub_status on;
allow 172.16.0.0/16;
deny all;
}
这样就可以了。
网络相关配置
1、keepalive_timeout #;长连接的超时时长,默认75s;
2、keepalive_requests #;在一个长连接上所能够允许请求的最大资源数;
3、keepalive_disable[msie6|safari|none];为指定类型的User Agent禁用长连接;
4、tcp_nodelay on|off;是否对长连接使用TCP_NODELAY选项;
5、client_header_timeout #;读取http请求报文首部的超时时长;
6、client_body_timeout #;读取http请求报文body部分的超时时长;
7、send_timeout #;发送响应报文的超时时长;