Nginx 安装 配置 使用
基本的HTTP服务器特性
- 处理静态文件,索引文件以及自动索引;打开文件描述符缓存(缓存元数据和文件描述符,下一次可以直接从内存找到数据或者文件的位置);
- 使用缓存加速反向代理;简单负载均衡以及容错(后端服务的健康状况检查);
- 远程FastCGI,uwsgi,SCGI,和memcached服务的缓存加速支持;简单的负载均衡以及容错;
- 模块化的架构。过滤器包括gzip压缩、ranges支持、chunked响应、XSLT,SSI以及图像缩放。在SSI 过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理;
- 支持SSL,TLS SNI。
Tengine(淘宝的nginx或叫tnginx,整合非常多的第三方插件)
varnish:提供缓存,有限内存缓存(使用算法使性能更好)
squid:它和varnish就好比httpd和nginx
nginx:其缓存功能保存到磁盘中
已经附带了memcached,可以直接管理memcached
httpd:既支持磁盘缓存,有支持内存缓存
其他的HTTP服务器特性
- 基于名字和IP的虚拟主机;
- Keep-alive和pipelined连接支持;
- 灵活的配置;
- 重新加载配置以及在线升级时,不需要中断正在处理的请求;
(新的连接建立是使用新的配置,老的连接则在在下一次请求时候使用新配置,这种方式较nginx的热部署,平滑升级)- 自定义访问日志格式,带缓存的日志写操作(先将日志放于缓存,然后存在磁盘)以及快速日志轮转(日志滚动);
- 3xx-5xx错误代码重定向;
- 重写(rewrite)模块:使用正则表达式改变URI;
- 根据客户端地址执行不同的功能;(根据客户端的类型比如手机设备返回wrap页面)
- 基于客户端IP地址和HTTP基本认证机制的访问控制;
- 支持验证HTTP referer;(ngx_http_referer_module模块允许拦截“Referer”请求头中含有非法值的请求,阻止它们访问站点。 需要注意的是伪造一个有效的“Referer”请求头是相当容易的, 因此这个模块的预期目的不在于彻底地阻止这些非法请求,而是为了阻止由正常浏览器发出的大规模此类请求。 还有一点需要注意,即使正常浏览器发送的合法请求,也可能没有“Referer”请求头。比如你的网站A的图片被网站B盗链了,当访问B的时候会产生对A的大量的访问,导致A访问量过大,用此方式修改只允许站内连接)
- 支持PUT、DELETE、MKCOL、COPY以及MOVE方法;
- 支持FLV流和MP4流;
- 速度限制;
- 来自同一地址的同时连接数或请求数限制;
- 嵌入Perl语言。
架构和扩展性
- 一个主进程和多个工作进程,工作进程以非特权用户运行;
- 支持的事件机制:kqueue(FreeBSD 4.1+)、epoll(Linux 2.6+)、rt signals(realtime signals Linux 2.2.19+)、/dev/poll(Solaris 7 11/99+)、event ports(Solaris 10)、select以及poll;
- 众多支持的kqueue特性包括EV_CLEAR、EV_DISABLE(临时禁止事件)、NOTE_LOWAT、EV_EOF,可用数据的数量,错误代码;
- 支持sendfile(FreeBSD 3.1+, Linux 2.2+, Mac OS X 10.5+)、sendfile64(Linux 2.4.21+)和sendfilev(Solaris 8 7/01+);
- 文件AIO(FreeBSD 4.3+, Linux 2.6.22+);
- DIRECTIO (FreeBSD 4.4+, Linux 2.4+, Solaris 2.6+, Mac OS X);
- 支持Accept-filters(FreeBSD 4.1+, NetBSD 5.0+,可以只接受有限的连接 )和 TCP_DEFER_ACCEPT(Linux 2.4+);
- 10000个非活跃的HTTP keep-alive连接仅占用约2.5M内存;
- 尽可能避免数据拷贝操作(如sendfile)。
上图中master监控worker进程运行状况。master是由管理员启用的,加载配置文件来进行全局管理,worker是使用普通用户,由master发起,是master的子进程。nginx是高度模块化的,向上图中worker进程中有很多模块,用户发起的请求交给worker进程,而其本身交给自己的模块进行相应的处理,这些模块以流水线的形式进行工作的,比如第一个模块解析请求的头部, 第二个取得数据,第三个创建相应。
上面的描述:
重新加载配置以及在线升级时,不需要中断正在处理的请求
详细的过程是,当新的配置文件加载到nginx时,nginx建立新的worker进程(使用新的配置文件)来相应新的请求,而原来的worker进程在完成以前的请求之后被master kill掉,于是动态缓慢加载新的配置文件完成内容
- 主进程主要完成如下工作:
- 读取并验正配置信息;
- 创建、绑定及关闭套接字;
- 启动、终止及维护worker进程的个数;
- 无须中止服务而重新配置工作特性;
- 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;(类似重新加载配置文件加载,新版本的master兼容老版本的worker)
- 重新打开日志文件,实现日志滚动;
- 编译嵌入式perl脚本;
- worker进程主要完成的任务包括:
- 接收、传入并处理来自客户端的连接;
- 提供反向代理及过滤功能;
- nginx任何能完成的其它任务;
cache loader进程主要完成的任务包括:- 检查缓存存储中的缓存对象;
- 使用缓存元数据建立内存数据库;
- cache manager进程的主要任务:
- 缓存的失效及过期检验;
Nginx的配置有着几个不同的上下文:main(对任何配置都生效,全局的)、http(包括server,upstream实现反向代理,location定义访问相应),还有实现邮件服务反向代理的mail。配置语法的格式和定义方式遵循所谓的C风格,因此支持嵌套,还有着逻辑清晰并易于创建、阅读和维护等优势。- sendfile:
步骤一:系统调用read导致了从用户空间到内核空间的上下文切换。DMA模块从磁盘中读取文件内容,并将其存储在内核空间的缓冲区内,完成了第1次复制。
步骤二:数据从内核空间缓冲区复制到用户空间缓冲区,之后系统调用read返回,这导致了从内核空间向用户空间的上下文切换。此时,需要的数据已存放在指定的用户空间缓冲区内(参数tmp_buf),程序可以继续下面的操作。
步骤三:系统调用write导致从用户空间到内核空间的上下文切换。数据从用户空间缓冲区被再次复制到内核空间缓冲区,完成了第3次复制。不过,这次数据存放在内核空间中与使用的socket相关的特定缓冲区中,而不是步骤一中的缓冲区。
步骤四:系统调用返回,导致了第4次上下文切换。第4次复制在DMA模块将数据从内核空间缓冲区传递至协议引擎的时候发生,这与我们的代码的执行是独立且异步发生的。你可能会疑惑:“为何要说是独立、异步?难道不是在write系统调用返回前数据已经被传送了?write系统调用的返回,并不意味着传输成功——它甚至无法保证传输的开始。调用的返回,只是表明以太网驱动程序在其传输队列中有空位,并已经接受我们的数据用于传输。可能有众多的数据排在我们的数据之前。除非驱动程序或硬件采用优先级队列的方法,各组数据是依照FIFO的次序被传输的(图1中叉状的DMA copy表明这最后一次复制可以被延后)。
采用sendfile可以很好地避免在将数据有DMA传入用户空间,再由用户空间传入内核空间的socket缓冲:
步骤一:mmap系统调用导致文件的内容通过DMA模块被复制到内核缓冲区中,该缓冲区之后与用户进程共享,这样就内核缓冲区与用户缓冲区之间的复制就不会发生。
步骤二:write系统调用导致内核将数据从内核缓冲区复制到与socket相关联的内核缓冲区中。
步骤三:DMA模块将数据由socket的缓冲区传递给协议引擎时,第3次复制发生。
nginx安装:
>本文采用编译安装的方式
-
解决依赖关系
编译安装nginx需要事先需要安装开发包组”Development Tools”和 “Development Libraries”。同时,还需要专门安装pcre-devel包:yum -y install zlib zlib-devel openssl openssl-devel pcre-devel gd-devel
-
添加用户
groupadd -r nginx
useradd -r -g nginx nginx -
编译安装
./configure
--prefix=/usr
--sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_realip_module
--with-http_addition_module
--with-http_sub_module
--with-http_dav_module
--with-http_flv_module
--with-http_mp4_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_stub_status_module
--with-http_auth_request_module
--with-mail
--with-mail_ssl_module
--with-file-aio
--with-ipv6
--with-http_v2_module
--with-http_image_filter_module
--with-pcre
--with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
make
make install -
配置支持Centos7 systemctl服务管理
vim /lib/systemd/system/nginx.service
添加下面内容
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target可以通过systemctl status start stop来看nginx服务内容
-
配置nginx
vim /etc/nginx/nginx.conf
#在http节点下,添加upstream节点
upstream mysite {
server 172.20.13.229:8081;
server 172.20.13.230:8082;
}
#修改server节点下的location节点
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
proxy_pass http://mysite;
}
#主要内容在mysite中
完成:)