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 nginxuseradd -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'makemake install
配置支持Centos7 systemctl服务管理
vim /lib/systemd/system/nginx.service
添加下面内容
[Unit]Description=The NGINX HTTP and reverse proxy serverAfter=syslog.target network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/var/run/nginx.pidExecStartPre=/usr/sbin/nginx -tExecStart=/usr/sbin/nginxExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=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中
完成:)
转载于:https://www.cnblogs.com/owenma/p/5915340.html