Nginx (engine x) 是一个高性能的 HTTP和 反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为 俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。javascript
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特色是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝
等。php
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
cd /usr/local/src/ wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
cd /usr/local/src/ wget http://nginx.org/download/nginx-1.6.2.tar.gz
参考(https://www.runoob.com/linux/...)css
高度模块化的设计是 Nginx 的架构基础。Nginx 服务器被分解为多个模块,每一个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则
核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。html
标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。前端
可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。java
邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。node
第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。
参考(https://www.sohu.com/a/230364...)linux
官方测试Nginx可以支撑5万并发链接,实际生产环境中能够支撑2~4万并发链接数。nginx
缘由,主要是Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freeBSD)网路I/O模型,而Apache使用的是传统的Select模型,其比较稳定的Prefork模式为多进程模式,须要常常派生子进程,因此消耗的CPU等服务器资源,要比Nginx高不少。
Nginx+PHP(FastCGI)服务器,在3万并发链接下,开启10个Nginx进程消耗150MB内存,15MB*10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB*64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。c++
若是服务器的内存比较小,彻底能够只开启25个PHP-CGI进程,这样PHP-CGI消耗的总内存数才500MB。
购买F5BIG-IP、NetScaler等硬件负载均衡交换机,须要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,能够免费试用,而且可用于商业用途。
BSD开源协议是一个给使用者很大自由的协议,协议指出能够自由使用、修改源代码、也能够将修改后的代码做为开源或专用软件再发布。
网络和程序同样通俗易懂,即便,非专用系统管理员也能看懂。
可以根据域名、URL的不一样,将http请求分到不一样的后端服务器群组。
若是NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。
支持GZIP压缩,能够添加浏览器本地缓存的Header头。
用于反向代理,宕机的几率微乎其微。
Nginx支持热部署,它的自动特别容易,而且,几乎能够7天*24小时不间断的运行,即便,运行数个月也不须要从新启动,还可以在不间断服务的状况下,对软件版本进行升级。
#Nginx的worker进程运行用户以及用户组 #user nobody nobody; #Nginx开启的进程数 worker_processes 1; #worker_processes auto; #如下参数指定了哪一个cpu分配给哪一个进程,通常来讲不用特殊指定。若是必定要设的话,用0和1指定分配方式. #这样设就是给1-4个进程分配单独的核来运行,出现第5个进程是就是随机分配了。eg: #worker_processes 4 #4核CPU #worker_cpu_affinity 0001 0010 0100 1000; nets #定义全局错误日志定义类型,[debug|info|notice|warn|crit] #error_log logs/error.log info; #指定进程ID存储文件位置 #pid logs/nginx.pid; #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,可是nginx分配请求并非那么均匀,因此最好与ulimit -n的值保持一致。 #vim /etc/security/limits.conf # * soft nproc 65535 # * hard nproc 65535 # * soft nofile 65535 # * hard nofile 65535 worker_rlimit_nofile 65535;
events { #use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,若是跑在FreeBSD上面,就用kqueue模型。 use epoll; #每一个进程能够处理的最大链接数,理论上每台nginx服务器的最大链接数为worker_processes*worker_connections。理论值:worker_rlimit_nofile/worker_processes #注意:最大客户数也由系统的可用socket链接数限制(~ 64K),因此设置不切实际的高没什么好处 worker_connections 65535; #worker工做方式:串行(必定程度下降负载,但服务器吞吐量大时,关闭使用并行方式) #multi_accept on; }
#文件扩展名与文件类型映射表 include mime.types; #默认文件类型 default_type application/octet-stream; #日志相关定义 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #定义日志的格式。后面定义要输出的内容。 #1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址; #2.$remote_user :用来记录客户端用户名称; #3.$time_local :用来记录访问时间与时区; #4.$request :用来记录请求的url与http协议; #5.$status :用来记录请求状态; #6.$body_bytes_sent :记录发送给客户端文件主体内容大小; #7.$http_referer :用来记录从那个页面连接访问过来的; #8.$http_user_agent :记录客户端浏览器的相关信息 #链接日志的路径,指定的日志格式放在最后。 #access_log logs/access.log main; #只记录更为严重的错误日志,减小IO压力 error_log logs/error.log crit; #关闭日志 #access_log off; #默认编码 #charset utf-8; #服务器名字的hash表大小 server_names_hash_bucket_size 128; #客户端请求单个文件的最大字节数 client_max_body_size 8m; #指定来自客户端请求头的hearerbuffer大小 client_header_buffer_size 32k; #指定客户端请求中较大的消息头的缓存最大数量和大小。 large_client_header_buffers 4 64k; #开启高效传输模式。 sendfile on; #防止网络阻塞 tcp_nopush on; tcp_nodelay on; #客户端链接超时时间,单位是秒 keepalive_timeout 60; #客户端请求头读取超时时间 client_header_timeout 10; #设置客户端请求主体读取超时时间 client_body_timeout 10; #响应客户端超时时间 send_timeout 10; #FastCGI相关参数是为了改善网站的性能:减小资源占用,提升访问速度。 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #gzip模块设置 #开启gzip压缩输出 gzip on; #最小压缩文件大小 gzip_min_length 1k; #压缩缓冲区 gzip_buffers 4 16k; #压缩版本(默认1.1,前端若是是squid2.5请使用1.0) gzip_http_version 1.0; #压缩等级 1-9 等级越高,压缩效果越好,节约宽带,但CPU消耗大 gzip_comp_level 2; #压缩类型,默认就已经包含text/html,因此下面就不用再写了,写上去也不会有问题,可是会有一个warn。 gzip_types text/plain application/x-javascript text/css application/xml; #前端缓存服务器缓存通过压缩的页面 gzip_vary on;
#虚拟主机定义 server { #监听端口 listen 80; #访问域名 server_name localhost; #编码格式,若网页格式与此不一样,将被自动转码 #charset koi8-r; #虚拟主机访问日志定义 #access_log logs/host.access.log main; #对URL进行匹配 location / { #访问路径,可相对也可绝对路径 root html; #首页文件。如下按顺序匹配 index index.html index.htm; }
#负载均衡服务器池 upstream my_server_pool { #调度算法 #1.轮循(默认)(weight轮循权值) #2.ip_hash:根据每一个请求访问IP的hash结果分配。(会话保持) #3.fair:根据后端服务器响应时间最短请求。(upstream_fair模块) #4.url_hash:根据访问的url的hash结果分配。(需hash软件包) #参数: #down:表示不参与负载均衡 #backup:备份服务器 #max_fails:容许最大请求错误次数 #fail_timeout:请求失败后暂停服务时间。 server 192.168.1.109:80 weight=1 max_fails=2 fail_timeout=30; server 192.168.1.108:80 weight=2 max_fails=2 fail_timeout=30; } #负载均衡调用 server { ... location / { proxy_pass http://my_server_pool; } }
#根据不一样的浏览器URL重写 if($http_user_agent ~ Firefox){ rewrite ^(.*)$ /firefox/$1 break; } if($http_user_agent ~ MSIE){ rewrite ^(.*)$ /msie/$1 break; } #实现域名跳转 location / { rewrite ^/(.*)$ https://web8.example.com$1 permanent; }
#限制IP访问 location / { deny 192.168.0.2; allow 192.168.0.0/24; allow 192.168.1.1; deny all; }
1. http keepalive
在http早期 ,每一个http请求都要求打开一个tpc socket链接,而且使用一次以后就断开这个tcp链接。使用keep-alive能够改善这种状态,即在一次TCP链接中能够持续发送多份数据而不会 断开链接。经过使用keep-alive机制,能够减小tcp链接创建次数,也意味着能够减小TIME_WAIT状态链接,以此提升性能和提升httpd 服务器的吞吐率(更少的tcp链接意味着更少的系统内核调用,socket的accept()和close()调用)。可是,keep-alive并非 免费的午饭,长时间的tcp链接容易致使系统资源无效占用。配置不当的keep-alive,有时比重复利用链接带来的损失还更大。因此,正确地设置 keep-alive timeout时间很是重要。
2. keepalvie timeout
Httpd守护进程,通常都提供了keep-alive timeout时间设置参数。好比nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个 keepalive_timout时间值意味着:一个http产生的tcp链接在传送完最后一个响应后,还须要hold住 keepalive_timeout秒后,才开始关闭这个链接。当httpd守护进程发送完一个响应后,理应立刻主动关闭相应的tcp链接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,即是 keepalive_timeout时间。若是守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http链接。
参考(https://www.cnblogs.com/ExMan...)
1. Nginx在上传文件时出现413 Request Entity Too Large
由于Nginx默认支持上传1MB的文件,因此超过1MB则会报错。 #nginx上传文件大小限制配置语法 Syntax: client\_max\_body\_size size; Default: client\_max\_body\_size 1m; Context: http, server, location 容许该server能支持上传200m的文件,也能够其配置放入http层,全部server都生效。 server { ... client\_max\_body\_size 200m; ... }
2. Nginx指定路径时,root与alias区别在哪?
root与alias路径匹配主要区别在于nginx如何解释location后面的uri,这会使二者分别以不一样的方式将请求映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径
1.root路径配置实例: 用户访问www.xuliangwei.com/image/test.gif,实际上Nginx会上/code/image/目录下找去找test.gif文件 server { listen 80; server\_name www.xuliangwei.com; location /image/ { root /code; } }
3. 400 bad request
通常缘由:请求的Header过大。 解决方法:配置nginx.conf相关设置
`client_header_buffer_size 16k;` `large_client_header_buffers 4 64k;`
4. 403 forbiden
通常是访问文件权限不够5.413 Request Entity Too Large
通常缘由:通常出如今上传文件。 解决方法:配置nginx.conf相关设置,配置php.ini以下(必须和nginx.conf配置一致)
client_max_body_size 10m; post_max_size=10M upload_max_filesize=2M 499 Client Closed Request
通常缘由:客户端在为等到服务器相应返回前就关闭了客户端描述符。通常出如今客户端设置超时后,主动关闭socket.
解决方法:根据实际Nginx后端服务器的处理时间修改客户端超时时间。
> 6.500 Internal Server Rrror
通常缘由:脚本错误,(php语法错误、lua语法错误)
访问量过大,系统资源限制,不能打开过多文件
磁盘空间不足。(access log开启可能致使磁盘满溢 关闭)
> 7.502 Bad Gateway、503 Serveice Unavailable
通常缘由:后端服务没法处理,业务中断。
解决方法:从后端日志获取错误缘由,解决后端服务器问题。
> 8.504 Gateway Timeout
通常缘由:后端服务器在超时时间内,未响应Nginx代理请求
解决方法:根据后端服务器实际处理状况,调正后端请求超时时间。
proxy_read_timeout 90;
proxy_send_timeout 90;
参考(https://www.cnblogs.com/johnn...)
参考(https://blog.csdn.net/lzghxjt...)