Nginx基础
前言
apache在设计的时候已经考虑了并发访问模型,select()机制可以响应1024个访问,但是当数量再大,千万级别的时候http就响应不过来了。这个时候,nginx的出现解决了这一个问题。nginx是一个安装简单、配置文件简单、占用内存少、稳定性高、处理并发能力非常强、灵活好用等有点聚集于一身的轻量级服务器。在Linux操作系统中,Nginx使用epoll事件模型,效率相当高,Nginx能够支持高达5万个并发连接数的响应,在高连接并发的情况下,Nginx是apache服务器不错的替代品。
一、IO模型相关概念
1、同步模型:
一个任务的完成需要依赖另一个任务的时候,被依赖的完成后才能完成这个任务。
A依赖于B,B完成了,才能完成A。http进程去调用内核在那等着,内核去磁盘上加载资源,资源加载完了,返回给http进程,http进程才能进行下一步。
2、异步模型:
调用者无需等待被调用者完成,只是通知被依赖的任务,我要完成什么事,你来帮我完成,要依赖于通知,依赖于回调函数。
3、消息通知
被调用者
同步:等待对方返回消息
异步:被调用者通过消息通知或回调,状态是调用者每隔一段时间要检查一次,处于盲等状态。通知是好了就来通知。
调用者
阻塞:block (盲等) 调用结果返回之前,调用者会被挂起
非阻塞:nonblock (非盲等)
4、IO模型
同步阻塞:同步挂起
同步非阻塞:同步没挂起,它是怎么等待数据呢?数据准备好了,开始第二阶段了怎么办,所有那个去干别的事的进程要反复轮巡,过一会跑过来看看,数据加载完了没有,非阻塞的也变成阻塞的了,性能极差。
IO复用:为了解决同步非阻塞的进程老来查询数据,就准备了一个显示器【seletc(),1024】,最多显示1024个,你别来轮巡内核了,直接看轮巡屏幕就好了。
异步:不会阻塞,也可能会阻塞,在等待消息上。
5、IO分类
网络IO:本质是socket读取
磁盘IO:流
6、每次IO经过的两个阶段
数据首先会从磁盘或网络先加载到内核内存(缓冲区),等待数据准备完成
数据从内核缓冲区复制到用户空间的进程的内存中去,数据从内核复制到进程中去。
7、区别
同步阻塞:第一二阶段全部挂起
异步非阻塞:第一阶段没挂起,盲等,第二阶段挂起
IO复用:第一阶段阻塞,到大屏幕上,而不是内核上,第二阶段也阻塞。
二、Nginx概念
1、Nginx特性:
(1)模块化设计,较好的扩展性;
(2)高可靠性,master/worker
(3)支持热部署:不停更新配置文件、更换日志文件更新服务程序版本;
(4)低内存消耗:10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存
(5)基本功能:静态资源的web服务器,可为http做反向代理。还有POP3limap4协议的反向代理服务器,邮件,FASTCGI等协议;lnmp。模块化(非DSO),编译时确定:著名的有zip,ssl,……;与web服务器相关的功能:虚拟主机,keepalive,访问日志,url,rewrite,路劲别名,基于ip及用户的访问控制,速率限制及并发数限制。
2、Nginx的程序架构
master\worker架构:一个master进程,可生成一个或多个work进程;
master:加载配置文件,管理worker进程,平滑升级……
worker:http服务,http代理,fastcgi代理
3、Nginx的模块类型
(1)核心模块:core module (2)标准模块:httpd模块(标准的httpd模块和可选的httpd模块) (3)3rd party modules
4、nginx的安装epel源(下面用编译的方法安装)
1、安装编译环境:
yum groupinstall "Development Tools" "Server Platform Development" -y
2、安装可能要启用的东西:openssl、pcre、zlib等等
yum -y install openssl-devel pcre-devel zlib-devel
3、创建nginx系统用户
useradd -r nginx
4、在nginx官网下载nginx,解压缩,次版本号是双数则是稳定版
wget http://nginx.org/download/nginx-1.8.1.tar.gz
5、根据需要configure
./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-debug --with-http_stub_status_module --with-http_gzip_static_module
6、启动:/usr/local/nginx/sbin/nginx
7、报错如下:
问题是,错误的原因是没有创建nginx这个用户,应该在服务器系统中添加nginx用户组和用户nginx,方法如下:
/usr/sbin/groupadd -f nginx /usr/sbin/useradd -g nginx nginx
ps aux 可以看到进程
8、然后可以启动了,命令太长了怎么办,修改一下
vim /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx/sbin:$PATH
exec bash /etc/profile.d/nginx.sh (立即生效)
nginx -t 是检测配置文件是否正确的
nginx -s reload 重载nginx
nginx -s stop 停止启动
nginx 启动
9、配置文件(主配置文件/etc/nginx下的nginx.conf)
主要配置文件是:nginx.conf
可以自定义 conf.f/*.conf
还有facsgi、scgi、uwscgi的相关配置
配置指令(必须以分号结尾);
支持使用变量:内置变量(由模块引入,可以直接使用),自定义变量(set variablename value),引入变量($variablename)
三、配置文件结构(三大块)
main block :全局配置,对http及mail模块均有效;
worker-processes 1;表示有几个worker进程 worker-connectios 1024;表示每个worker进程同时可以响应多少个进程
event 部分:事件驱动的相关配置
http部分:http协议相关配置,web相关的都放在这里面
http { …… 公共配置 server { ……虚拟主机自己的配置 } server{ …… server_name 主机名 root -->DocumentRoot alias-->http alias location /url/{ …… } } }
1、main配置段:全局配置
官网可以看具体使用方法:http://nginx.org/en/docs/ngxcoremodule.html
配置指令的类别:正常运行必备的配置;优化性能的配置;用于调试、定位问题的配置
(1)正常运行必备的配置
1、user USERNAME [GROUPNAME]; 指定用户运行work进程的用户和组; 例如:user nginx nginx; 2、pid /PAEH/TO/PID_FILE;指明运行时的pid文件在哪,指定nginx进程的pid文件路径: pid /var/run/nginx.pid; 3、worker_rlimit_nofile number:单个work进程可以打开的最大文件数,默认是1024个,如果有很多,可以调大一点
(2)性能优化相关配置:
1、worker_processes number |auto;自动设定,1.8以后才支持 用来指明work作进程的进程数 通常应该为cpu的核心数减1,可以是auto 16核服务器,14个隔离出来,2个运行,剩下14个每个绑一个work,不这样做,每个cpu核心都需要被work进程去调度的,不断的被进程切换着,nginx被切换出去以后,下次再切换过来就不一定是原来那个核了,cpu本地缓存就不能应用了,性能得不到提升,nginx性能很重要。 ps aux 有几个worker process lscpu 看cpu有几个 可以相同,也可以-1.
2、work_cpu_affinity cpumask ...; worker_cpu_affinity auto [cpumask],auto是自动绑定,也可能不支持 work_processes 2; work_cpu_affinity 0010 0100; 含义就是选的两个work_process,绑定在哪两个cpu上
(3)指明进程优先级,nice越小,优先级越高
1、worker_priority number;优先级 nice:[-20,19] ps axo command,pid,psr,ni 例子:worker_priority -5;检测,重载
(4)调试定位问题:
1、daemon on |off; 是否以守护进程方式启动Nginx,默认是 2、master——process on|off; 是否以master|work 模式启动,正常都应该启动 3、error_log 错误日志文件记录方式及日志级别 debug要使用,在编译时--with要加上 方式: file /PATH/TO/SOME_LOG_FILE; stderr:发送到错误输出,在当前终端 syslog:server=address[parameter=value]:发送到syslog服务器; memory:size,记录内存中,已关机就没了 日志级别: debug依赖于configure --with-debug选项
2、event配置段
1、worker_connections number;最大并发响应数 每个work进程所能够打开的最大连接数;默认是512个 最大连接数=work_process*work_connections 2、use method; 指明并发连接请求处理时使用的方法; 3、accept_mutex on 让work processes轮流的接受新的连接,一般都启用,启用时表示用于让多个work轮流地序列化地响应请求 4、lock_file file; nginx使用锁机制去管理互斥
3、http配置段(重点)
官方参考:http://nginx.org/en/docs/http/ngxhttpcore_module.html
五大块:定义套接字相关功能,定义路径相关配置,定义客户端请求的相关配置,对客户的请求进行限制的相关配置,文件操作优先的配置。
(1)定义套接字相关功能
1、server{……} 定义虚拟主机的 对于nginx,基于ip与主机名没什么区分 server { 很容易 listen port; server_name HOSTNAME;(主机名,可以使用正则表达式的模式) root /PATH/TO/DOCUMENTROOT; …… }
2、listen 监听在哪个端口,格式如下: listen address listen port listen unix 例如: listen 127.0.0.1:8000; listen 127.0.0.1; listen 8000; listen *:8000; listen localhost:8000;
default_server :设置默认虚拟主机 ssl:限制通过ssl连接提供服务 backlog:后缓队列的长度 rcvbuf:接收缓冲大小 sndbuf:发送缓冲区大小
3、server_name name ...; 指明当前server的主机名;后可跟一个或空白字符分隔的多个主机,支持使用*,任意长度的任意字符 例如:www.magedu.com 支持~起始的正则表达式模块字符串 server_name www.magedu.com; server_name *.magedu.com; server_name www.magedu.*; server_name -^.*\.magedu\.*$; mail.magedu.com 2,4 优先是2 www.magedu.com 1,2,3,4 优先是1 越精确,优先级越高
(2)定义路径相关配置:
1、root path:设置web资源路径映射,用于指明用户请求的url所对应的本地文件系统的文档目录路径;可用上下文有:http,server,location,if 例子:把location的root注释掉,自己在server下面加,http下也可以加,可以对多个server生效 root /web/html/;
测试如下:(果然比http简单多了)
vim nginx.conf,再加个server server { listen 80; server_name www.cwj.com www.a.com; root /web/html2; }
为了便于管理,我们也可以令创建一个文件,专门编辑这些主机文件,如下,在/etc/nginx 下创建一饿个conf.d的目录,然后编辑host2.conf:
vim conf.d/host2.conf vim nginx.conf include conf.d/*.conf;
注意事项:
(1)基于port的虚拟主机:listen指令要使用不同的端口 (2)基于hostname的虚拟主机:server_name指令指向不同的主机名 (3)基于ip的虚拟主机:listen ip:port;
2、tcp_nodelay on|off 对keepalived模式下的连接是否启用TCP_NODELAY选项 3、tcp_nopush on|off ;默认的选off 4、sendfile:在内核封装后直接发送给客户端,不反回httpd或者nginx,默认是off,要on起来 5、location 很有用,根据用户请求的url来匹配定义的location,匹配到时,请求将被相应的location块中的配置所处理; 例如: root /web/host1; 路径是:/web/host1/images/1.jpg 主机名是:www.cwj.com 网址应该是:http://www.cwj.com/images/1.jpg location 含有if之意,引入一个新的上下文,里面如果可以匹配到,则执行 location ~*\.txt { gzip on ; } server {可以多个,嵌套 …… location { } location { } …… } =:url精确匹配,用户使用的与这里完全不差 ~:正则表达式模式匹配,区分大小写 ~*:正则表达式模式匹配,不区分大小写 ^~:牟定行首的,url左半部分进行匹配 优先级:越精确,越优先:= ^~ ~|~* 不带符号的 6、alias 同http alias ,路径别名 alias path;定义路径别名,文档映射的一种机制,仅能用于location上下文 例如: alias /bbs/ /web/forum/ ,既是 /bbs/ = /web/forum/ http://www.magedu.com/bbs/a.jpg /web/forum/a.jpg location /bbs/ { alias /web/forum/; } /web/forum/a.jpg location /bbs/ { root /web/forum/; } /web/forum/bbs/a.jpg root指令:给定的路径对于location中的/url/最左侧的/ 7、index: 可用的位置:http,server,location,默认主页 8、error_page:自定义错误页面,基本能力 根据用户请求的http响应状态码实现错误重定向 例如: error_page 404 /404.html; error_page 500 502 503 504 /50x.html; 9、try_files 尝试文件 查找页面不在时
(3)定义客户端请求的相关配置
1、keepalive 设定保持连接的超时时长,0表示禁止启用长连接,默认是75s 2、keepalive_requests number 在一次长连接上所允许请求的资源的最大数量,默认是100 3、keepalive_disable name|browser ... 说明对哪种浏览器禁用 4、send_timeout time:向客户端发送响应报文的超时时长,默认是60s 5、client_body_buffer_size size; 用于接受客户请求报文body部分的缓冲区大小; 默认是16K;超出此大小时,其将被暂存到磁盘上 6、client_body_temp_path path [level1 |level2 ……]; 设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
(4)客户端请求进行限制的相关匹配
1、limit_rate (限制速率)默认为0,限制每秒钟响应给客户端的传输速率,字节/秒 location /download/ { limit_rate 20480; } 2、limit_except method 限制请求方法 限制对指定的请求方法之外的其他方法的使用客户端 limit_except GET POST { allow 192.168.1.109; deny all; } 表示除了GET和POST之外的其他方法,仅允许172.18.0.0/16中的主机使用 3、密钥访问: htpasswd -c -m /etc/nginx/.ngxpasswd tom htpasswd -m /etc/nginx/.ngxpasswd jerry location /admin/ { auth _basic "Admin Area"; auth_basic_user_file /etc/nginx/.ngxpasswd; } mkdir /web/html2/admin vim /web/html2/admin/index.html
nginx -t nginx -s reload
输入密码
原创文章,作者:N24_yezi,如若转载,请注明出处:http://www.178linux.com/64591