Nginx
1.定义
- 1.
Nginx
是一个高性能
的反向代理
和Web
服务器软件- 2.其源代码基于双条款
BSD
许可证发布
2.功能
- 1.功能
- 1.
访问路由
:通过访问路径、URL
关键字、客户端IP
、灰度分流等多种手段实现访问路由分配- 2.
反向代理
:高效、稳定地将请求反向代理给后端的目标应用服务器,并把响应数据返回给客户端- 3.
负载均衡
:Nginx
在反向代理的基础上集合自身的上游upstream
模块支持多种负载均衡算法- 4.
内容缓存
:Nginx
的内容缓存技术可以实现预置静态文件的高速缓存,还可以对应用响应的动态结果实现缓存- 5.
静态资源服务
:通过本地文件系统提供服务- 2.特点
- 1.高并发、高性能
- 2.
模块化架构
使其扩展性非常好- 3.采用
异步非阻塞
的事件驱动模型- 4.热部署、平滑升级
3.版本
- 1.
Nginx
开源版本:http://nginx.org
- 2.
Nginx plus
商业版本:https://www.nginx.com
- 3.
Openresty
:http://openresty.org
- 1.
OpenResty
是一个基于NGINX
和LuaJIT
的动态web
平台- 4.
Tengine
:http://tengine.taobao.org
- 1.
Tengine
是由淘宝网发起的Web
服务器项目,其在Nginx
的基础上针对大访问量网站的需求添加了很多高级功能和特性
4.安装部署
- 1.参考
Linux软件安装
文章的Linux系统下安装Nginx
5.配置文件
- 1.
/etc/nginx/conf.d/
用于存放子配置项,/etc/nginx/nginx.conf
主配置文件会默认把这个文件夹中所有子配置项都引入- 2.
/usr/share/nginx/html/
用于存放静态文件,可自定义配置- 3.
/run/nginx.pid
用于存放nginx
的进程id
1.核心配置
# main段配置信息 user nginx; # 运行用户,默认即是nginx,可以不进行设置 worker_processes auto; # Nginx 的worker进程数,一般设置为和CPU核数一样 error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录 pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置 # events段配置信息 events { use epoll; # 使用epoll的I/O模型(如果不知道Nginx该使用哪种轮询方法,会自动选择一个最适合操作系统的) worker_connections 1024; # 每个worker进程允许创建多少个连接 } # http段配置信息 # 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置 http { # 设置日志模式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # Nginx访问日志存放位置 sendfile on; # 开启高效传输模式 tcp_nopush on; # 减少网络报文段的数量 tcp_nodelay on; keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒 types_hash_max_size 2048; include /etc/nginx/mime.types; # 文件扩展名与类型映射表 default_type application/octet-stream; # 默认文件类型 include /etc/nginx/conf.d/*.conf; # 加载子配置项 # server段配置信息 server { listen 80; # 配置监听的端口 server_name localhost; # 配置的域名 # location段配置信息 location / { root /usr/share/nginx/html; # 网站根目录 index index.html index.htm; # 默认首页文件 deny 172.168.22.11; # 禁止访问的ip地址,可以为all allow 172.168.33.44;# 允许访问的ip地址,可以为all } error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面 error_page 400 404 error.html; # 同上 } }
1.main:全局配置,对全局生效
- 1.
user
:指定运行Nginx
的woker
子进程的属主和属组,其中组可以不指定user USERNAME [GROUP] user nginx lion; # 用户是nginx;组是lion
- 2.
worker_processes
:指定Nginx
启动的worker
子进程数量worker_processes 4; # 指定具体子进程数量 worker_processes auto; # 与当前cpu物理核心数一致,太少会导致cpu无法发挥到极致,太多会导致上下文切换影响效率
- 3.
pid
:指定运行Nginx master
主进程的pid
文件存放路径- 4.
daemon
:设置Nginx
的运行方式daemon off; # 默认是on,后台运行模式 指定Nginx的运行方式,前台还是后台,前台用于调试,后台用于生产
2.events:配置Nginx服务器事件
- 1.
use
:指定事件驱动模型use method; # Nginx 使用何种事件驱动模型 不推荐配置它,让nginx自己选择 method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
- 2.
worker_connections
:worker
子进程能够处理的最大并发连接数worker_connections 1024 # 每个worker子进程的最大连接数为1024
- 3.
accept_mutex
:是否打开负载均衡互斥锁accept_mutex on # 默认是off关闭的,推荐打开
3.http:配置代理,缓存,日志和第三方模块等功能
- 1.
include
:引入额外的配置文件include mine.types; # mine.types用于指定请求头文件类型 # 服务端告诉浏览器文件的类型,例如octet-stream类型文件浏览器会弹出下载框 default_type application/octet-stream; # 如果上述文件没有匹配上则默认使用application/octet-stream;
- 2.
sendfile
:数据零拷贝sendfile on; # 数据零拷贝,开启高效传输模式,减少一次从磁盘向Nginx应用程序内存拷贝的过程
- 3.
keepalive_timeout
:保持连接超时时间- 4.
upstream
:提供负载均衡及故障转移等功能,配置在http
下语法: upstream name { server1 address1 [parameters1]; server2 address2 [parameters2]; ...... } 1.upstream 配置在 http 下,与 server 配置同级别 2.upstream 用来定义一组 http 服务器,这些服务器可以监听不同的端口以及 TCP 和 UNIX 套接字 3.upstream 中的 server 用来配置具体的后端服务器,参数可以是不同的 IP 地址/域名、端口号 4.server的参数类型: 1.负载均衡 1.轮询:默认值 2.weight:设置请求分发到后端服务器的权重,即每台后端服务器能够响应的请求数量的比例,默认值是1 3.hash:按照指定的key将请求分布到后端服务器上,key可以是变量,文本或其组合 4.ip_hash:根据ip地址将请求分流到后端服务器上,同一个ip地址的请求会被代理到同一台后端服务器上,如果需要移除其中一台后端服务器,建议使用down对服务器设置停止分流,这样可以保留当前ip地址的hash 5.url_hash:根据用户访问的url定向转发请求,需要安装第三方插件,可以定向流量转发,对url进行hash,相同的url会转发到同一台服务器上,其无法保持会话,适用于固定资源不在同一台资源服务器 6.least_conn:将请求分流到后端服务器时,请求量最小的服务器会优先获得分流;如果配置的服务器很多,会使用增加权重的round-robin负载方式 7.fair:根据后端服务器响应时间转发请求,需要安装第三方插件,该方式会造成流量倾斜导致服务宕机 8.sticky:根据Cookie将请求分布到后端服务器上,同一个Cookie的请求只会进入同一台服务器;如果请求被分布到某台服务器上,但是在请求时这台服务器已经无法提供服务那么会重新选择一台服务器进行捆绑,并且下次会直接进入重新捆绑的服务器 2.故障转移 1.down: 标记服务不可用,即该服务不参加负载均衡 2.backup:备份服务器,一般不会负载到该服务上,只有当upstream中所有的后端服务器都被设置为不可用时(例:全都超过了最大失败次数),upstream会对backup的服务器进行分流 3.max_fails:请求最大失败次数,在指定的时间内请求失败的最大次数,默认是1,如果设置为0,代表禁止该设置 4.fail_timemout:在指定时间内请求失败的次数,超过这个次数则认为服务不可用;例fail_timeout=10s,即如果10s内请求失败次数超过max_fails的值,则在接下来的10s内此server不再接收任何请求,10s后重新恢复为可用,并重新计算失败次数 5.注意: 1.负载均衡 1.轮询和weight比较常用,通过weight可以针对不同负载的机器配置不同比例的请求,但是它们无法保持会话 2.ip_hash针对现在的互联网环境无法适应,手机客户端在不同的基站范围内其ip会动态变化,因此无法保持会话 3.url_hash也无法保持会话,因为登录和访问的url地址不同,因此分配的服务器也不同 4.least_conn会优先将请求分流到请求量小的服务器上,但是一般针对不同的负载配置不同比例的请求,如果负载小的服务器被分配到较多的请求可能会造成服务宕机或响应过慢 2.故障转移 1.down无法动态设置服务器状态,每次设置后都需要重新reload才能生效 2.backup针对后端服务器问题无法有效解决,因为后端服务器问题需要修改代码解决,通过备份服务器的方法没办法根本解决问题来源 6.解决方式 1.轮询/权重+单独权限认证服务(SpringSession、redis、token)
- 5.
proxy_next_upstream
:请求转发,一般用于故障转移# 1.定义转发条件,当请求返回nginx时如果http状态满足proxy_next_upstream设置的条件,就会触发nginx将请求转发到下一台后端服务器并累加出现此状态的服务器的失败次数,当超过max_fails和fail_timeout的值就会设置此服务器为不可用,如果设置为off,则表示关闭此功能 # state:error | timeout | invalid_ header | http_ 500 | http_ 502 | http_ 503 | http_ 504 | http_ 403 | http_ 404 | http_ 429 | non_ idempotent | off ...; proxy_next_upstream/fastcgi_next_upstream/uwsgi_next_upstream/uwsgi_next_upstream/scgi_next_upstream/memcached_next_upstream/grpc_next_upstream [state]; # 2.定义尝试请求的次数,达到次数上限后就停止转发,并将请求内容返回客户端 proxy_next_upstream_tries number; # 3.限制尝试请求的超时时间,如果第一次请求失败,下一次请求就会被此参数控制,若设置为0,则表示无超时时间,但尝试的请求仍会受到proxy_read_timeout、proxy_ send_ timeout、 proxy_ connect_ timeout的影响 proxy_next_upstream_timeout time; # 4.注意:通过这些配置可以在后端服务器的某些节点出现请求异常时快速做出故障切换的操作从而屏蔽异常的请求;但存在一种隐患,即如果 proxy_next_upstream_tries设置的值比较大且 proxy_next_upstream设置了很多状态,当发生大面积异常时,重试不断累加可能会导致请求反复向多个服务器发送,这样会给后端服务器带来更大的压力
4.server:配置虚拟主机的相关参数
- 1.
server
:虚拟主机# 1.一个server代表一个虚拟主机 # 2.一个http可以包含多个server # 3.根据不同的端口可以区分不同的虚空主机 # 4.虚拟主机按先后顺序匹配,如果匹配上就不会再向下匹配
- 2.
listen
:指定当前虚拟主机监听的端口号listen 80; # 不能与其他虚拟主机监听的端口号重复
- 3.
server_name
:指定当前虚拟主机的主机名/域名
server_name localhost; # /etc/hosts文件中指定了localhost对应的ip地址,因此可以识别该域名 server_name www.nginx.com; server_name name1 name2 name3 # 同一个server的server_name可以指定多个域名,从前往后匹配,如果匹配上则进入该server 1.多个server的域名匹配规则: 1.精确匹配: server_name www.nginx.com ; 2.左侧通配: server_name *.nginx.com ; 3.右侧统配: server_name www.nginx.* ; 4.正则匹配: server_name ~^www\.nginx\.*$ ; 2.多个server的域名匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配 3.配置本地DNS解析 vim /etc/hosts 127.0.0.1 www.nginx-test.com 127.0.0.1 mail.nginx-test.com 127.0.0.1 www.nginx-test.org 127.0.0.1 doc.nginx-test.com 127.0.0.1 www.nginx-test.cn 127.0.0.1 fe.nginx-test.club 4.注意: 1.这里使用的是本地虚拟域名进行测试,因此需要配置本地DNS解析 2.如果使用阿里云上购买的域名,则需要在阿里云上设置好域名解析 3.泛解析:多个域名可以解析为同一个ip地址 4.多租户:服务器上设置泛解析,将不同的域名解析到同一台服务器上,然后通过nginx的反向代理请求发送到处理器上并获取对应的处理信息返回给用户 5.短网址:https://dlj.li/k411w(短网址) -> https://www.zhipin.com/sem/10.html?sid=Iemingzhan(对应真实地址) 6.短网址原理:通过真实网址生成一个对应的唯一端网址(UUID),然后将其k-v存放在数据库中,当请求访问nginx,nginx通过反向代理获取到真实地址然后redirect
- 4.
location
:匹配不同的uri
请求,对其做不同的处理和响应location [ = | ~ | ~* | ^~ ] /uri { ... } location @/name/ { ... } # url: http://域名/uri,其中uri为location后匹配的地址,如果匹配则进入该location # 泛解析:多个域名可以对应一个ip地址,因此访问ip地址时http协议会携带域名 # nginx通过两层匹配找到对应的处理 # 第一层(server匹配):通过ip+端口号匹配到对应的机器及对应的进程,然后通过域名匹配到对应的server # 第二层(location匹配):通过请求url匹配location的uri找到对应的location 1.匹配命令解释: 1. 空 前缀匹配,location 后没有命令参数直接加标准uri,与请求uri从头开始匹配 2. = 精准前缀匹配,用于标准uri前,要求请求uri与其精确匹配,成功则立即处理并停止搜索其他匹配 3. ^~ 前缀匹配,用于标准uri前,一旦匹配到立即停止搜索,不会再匹配其他正则uri,一般用来匹配目录 4. ~ 正则匹配,用于正则uri前,表示uri包含正则表达式,区分大小写 5. ~* 正则匹配,用于正则uri前,表示uri包含正则表达式,不区分大小写 6. @ 用于定义一个命名的location,用于内部重定向 # 注意:前缀匹配是将uri与请求uri从头开始比较,如果uri都能匹配上则成功 # 例:/docu和/doc中只有/docu可以和http://xxx/document匹配成功 # 前缀匹配下返回最长匹配的location,与location所在位置顺序无关 # 正则匹配按照location所在配置文件的位置顺序,返回先匹配成功的 2.匹配优先级: = > ^~ > ~ > ~* > 不带任何字符 1.location = # 精准匹配 2.location ^~ # 带参前缀匹配 3.location ~ # 正则匹配(区分大小写) 4.location ~* # 正则匹配(不区分大小写) 5.location /a # 普通前缀匹配,优先级低于带参数前缀匹配 6.location / # 任何没有匹配成功的,都会匹配到这里处理 # location匹配不完全按照其在配置文件出现的顺序 # 1.优先精准匹配=,精准匹配成功则停止其他类型匹配 # 2.没有精准匹配成功时进行前缀匹配,先查找带有^~的前缀匹配,如果匹配成功则停止其他类型匹配,否则查找不带^~的前缀匹配,如果匹配成功则会暂存并继续查找正则匹配 # 3.=和^~均未匹配成功时,查找正则匹配~和~*,当同时有多个正则匹配成功时按其在配置文件中出现的先后顺序优先匹配,匹配成功则停止其他类型匹配 # 4.所有正则匹配均未成功时,返回步骤2中暂存的不带^~前缀匹配结果 3.location的uri末尾的反斜线 location /test { ... } location /test/ { ... } 1.不带/:当访问www.nginx-test.com/test时,Nginx先找是否有test目录,如果有则找test目录下的index.html;如果没有test目录nginx则会找是否有test文件 2.带/ :当访问www.nginx-test.com/test时,Nginx先找是否有test目录,如果有则找test目录下的index.html,如果没有test目录nginx不会去找是否存在test文件 proxy_pass的url末尾的反斜线 location /test/ { proxy_pass http://127.0.0.1:8080; } location /test/ { proxy_pass http://127.0.0.1:8080/; } 1.不带/: 当访问www.nginx-test.com/test/hello时,会转发到http://127.0.0.1:8080/test/hello 2.带/ : 当访问www.nginx-test.com/test/hello时,会转发到http://127.0.0.1:8080/hello,即nginx转发会对localion路径下的匹配进行截取,按照 代理地址+访问url目录部分去除location匹配目录 的规则,重新进行拼接后转发 注意:url = http//ip:port/uri 即url必须以http或https开头,且可以携带变量,uri是url的一部分 4.请求uri中问号后的参数处理 1.请求uri中问号后的参数无法在location中匹配 2.这些参数存储在$query_string变量中,可以用if判断 3.例:对于参数中带有单引号 ’ 进行匹配然后重定向到错误页面 /usr/list?rid=19&mid=1124‘ if ( $query_string ~* “.*[;’<>].*” ){ return 404; } 5.命令location:带有@的location用来定义一个命名的location,该location不参与请求匹配,一般用在内部定向 location / { try_files $uri $uri/ @custom } location @custom { # ...do something } 6.实际使用 1.直接匹配网站根 location = / { proxy_pass http://tomcat:8080/index } 2.处理静态文件请求 location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } 3.通用规则 location / { proxy_pass http://tomcat:8080/ }
- 5.
root
:指定静态资源目录位置,可以写在http
,server
,location
等配置中root path location /image { root /opt/nginx/static; # 也可以指定相对路径 } 1.当用户访问www.test.com/image/1.png时,实际在服务器找的路径是 /opt/nginx/static/image/1.png 2.当不加uri直接访问服务器,并且nginx配置中含有location /{}配置时,nginx的location会优先匹配到此代码块并指向此代码块中的root,而server中的root不会生效;当去掉location /{}配置并且nginx找不到匹配到的location代码块时候,则会才执行server中的root 3.注意:root会将定义路径与URI叠加,alias则只取定义路径
- 6.
alias
:指定静态资源目录位置,只能写在location
中location /image { alias /opt/nginx/static/image/; } 1.当用户访问www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png 2.注意:使用alias末尾一定要添加 / ,否则会找不到文件,而root则可有可无,并且alias只能位于location 中
- 7.
index
:指定网站初始页location / { root /data/www; index index.$geo.html index.0.html /index.html; } 1.该指令后面可以跟多个文件,需要用空格隔开,Nginx会根据文件的枚举顺序来检查,直到查找的文件存在 2.文件可以是相对路径也可以是绝对路径,绝对路径需要放在最后 3.文件可以使用变量$来命名 4.该指令拥有默认值index index.html ,即如果没有给出index,默认初始页为index.html
- 8.
error_page
:指定服务器端发生错误时的跳转页面,可以写在http
,server
,location
等配置中error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } error_page 502 503 =200 /50x.html; location = /50x.html { root /usr/share/nginx/html; } error_page 500 = /500.html; location ~ \.html$ { fastcgi_pass 127.0.0.1:8000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } error_page 500 502 503 504 @jump_to_error; location @jump_to_error { proxy_pass http://127.0.0.1; } 1.当页面发生500/502/503/504错误时会跳转到/50x.html页面,具体跳转到root指定根目录下的50x.html 2.可以自定义返回的状态码,当页面发生/502/503时返回状态码200,并跳转到/usr/share/nginx/html目录下的50x.html 3.可以返回指定动态页面的状态码,当error_page跟的不是一个静态的内容会返回该动态页面的状态码 4.可以设置一个named location然后做对应的处理 5.error_page在一次请求中只能响应一次,对应的nginx有另外一个配置可以控制这个选项:recursive_error_pages,默认为false,作用是控制error_page能否在一次请求中触发多次 6.注意error_page配置时加=和不加=的区别:加了 = 表示响应为指定的 http status code ,默认为 200(静态页面),不加 = 为原错误的状态码
- 9.
return
:停止处理请求,直接返回响应码或重定向到其他url
,可以写在server
、location
以及if
配置中server{ listen 80; server_name www.baidu.com; return 403; rewrite /(.*) /abc/$1; # 该行配置不会被执行 } if ($request_uri ~ "\.htpasswd|\.bak") { return 404; rewrite /(.*) /aaa.txt; # 该行配置不会被执行 } # 如果下面还有其他配置会被执行 ..... } server{ listen 80; server_name www.aming.com; return 200 "hello"; } location ^~ /aming { default_type application/json ; return 200 '{"name":"aming","id":"100"}'; } server{ listen 80; server_name www.aming.com; return http://www.aminglinux.com/123.html; rewrite /(.*) /abc/$1; # 该行配置不会被执行。 } 1.执行return指令后location中后续指令将不会被执行 2.如果要想返回字符串,必须要加上状态码,否则会报错,还可以支持json数据 3.return后面重定向的url必须是以http://或https://开头
- 10.
rewrite
:实现对url
的重写以及对匹配(正则表达式)的uri
的重定向,可以写在server
、location
、if
中1.rewrite主要的功能就是实现url的重写,nginx的rewrite规则采用pcre perl兼容正则表达式的语法规则匹配,如果需要nginx的rewrite功能则在编译nginx之前需要编译安装pcre库,通过rewrite规则可以实现规范的url根据变量来做url转向及选择配置 2.语法:rewrite 正则表达式 要替换的内容 [flag]; 3.flag可选值的含义: 1.last:对重写后的url发起新请求,再次进入server 段重新匹配location 2.break:直接使用重写后的url ,不再匹配其它location中语句 3.redirect:返回302临时重定向 4.permanent:返回301永久重定向 5.注意: 1.last和break用来实现url重写,浏览器地址栏的URL地址不变,但在服务器访问的程序及路径发生了变化 2.redirect和permanent用来实现url跳转,浏览器地址会显示跳转后的url地址 3.last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记 4.last标记在本条rewrite规则执行完毕后,会对其所在的server{…}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则 4.例:rewrite ^/(.*) http://www.cjzzc.com/$1 permanent; 1.rewrite为固定关键字,表示开启一条rewrite匹配规则 2.regex部分是^/(.*),这是一个正则表达式,表示匹配所有 3.匹配成功后跳转到http://www.cjzzc.com/$1 4.这里的$1是取前面regex部分括号里的内容 5.结尾的permanent是永久301重定向标记,即跳转到后面的http://www.cjzzc.com/$1地址上
* 1.当访问 fe.lion.club/search 时,会自动帮我们重定向到 https://www.baidu.com。
* 2.当访问 fe.lion.club/images/1.jpg 时,第一步重写 URL 为 fe.lion.club/pics/1.jpg ,找到 pics 的 location ,继续重写 URL 为 fe.lion.club/photos/1.jpg ,找到 /photos 的 location 后,去 html/photos 目录下寻找 1.jpg 静态资源
- 7.if 指令
语法:if (condition) {...} 上下文:server、location 示例: if($http_user_agent ~ Chrome){ rewrite /(.*)/browser/$1 break; } condition 判断条件: $variable 仅为变量时,值为空或以0开头字符串都会被当做 false 处理; = 或 != 相等或不等; ~ 正则匹配; ! ~ 非正则匹配; ~* 正则匹配,不区分大小写; -f 或 ! -f 检测文件存在或不存在; -d 或 ! -d 检测目录存在或不存在; -e 或 ! -e 检测文件、目录、符号链接等存在或不存在; -x 或 ! -x 检测文件可以执行或不可执行;
![]()
- 当访问 localhost:8080/images/ 时,会进入 if 判断里面执行 rewrite 命令
- 8.autoindex:用户请求以 / 结尾时,列出目录结构,可以用于快速搭建静态资源下载网站
- autoindex.conf 配置信息
2.层级结构
6.原理
- 1.通过
Nginx
可执行文件启动Nginx
程序
- 1.然后开启
Master
主进程,校验并读取Nginx.conf
配置文件- 2.然后开启多个
Worker
子进程,解析用户请求并读取文件(启动Nginx
后存在两种类型的线程,一种是Master
一种是Worker
,其中Master
只有一个,Worker
可以有多个)
- 2.
Worker
采用抢占式
去执行Master
中收到的请求,一个Master
管理和多个Worker
抢占的设计有以下优点
![]()
- 1.可以使用
nginx -s reload
进行热部署,即正在执行worker
不会去争抢新的请求,会先执行完当前的任务,而其余空闲的worker
会抢占任务- 2.每个
worker
都是一个独立的进程,不需要加锁,节省了加锁带来的开销,且如果一个worker
出现问题,不会影响其他worker
的争抢,不会造成服务中断- 3.设置多少个
worker
合适
- 1.
nginx
同redis
类似都采用io
多路复用机制,每个worker
都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞
的方式来处理请求- 2.每个
worker
的进程可以把一个cpu
的性能发挥到极致,所以worker
进程数和服务器的cpu
数相等最为适宜,设少了会浪费cpu
,设多了会造成cpu
频繁切换上下文带来性能的损耗- 4.
nginx
最大并发数
- 1.
worker_connections
:表示每个worker
进程所能建立连接的最大值;worker prcesses
:表示nginx
开启的worker
进程数;所以一个nginx
能建立的最大连接数应该是worker connctions * worker prcesses
- 2.如果是支持
http1.1
的浏览器访问,则每次访问占两个连接
,普通的静态访问最大的并发数是:worker_connections * worker processes/2
,- 3.如果是作为
反向代理
,最大并发数量是worker connections * worker_processes/4
,因为作为反向代理服务器,每个并发会建立与客户端
的连接和与后端服务
的连接,即一个请求会占用四个连接
- 4.假如
nginx
有一个master
和4
个worker
,每个worker
支持最大的连接数是1024
,nginx
支持的最大的并发数是多少(即worker
支持最大的并发数)
- 1.
nginx
最大支持的并发数:4*1024
,然后除以2
或除以4
- 2.其中
4
是worker
线程数,1024
是每个worker
线程最大连接数worker_connection
,一个请求可能会占用worker
的2
个连接(浏览器访问)或4
个连接(反向代理)
1.域名解析
1.windows操作系统 1.修改C:\Windows\System32\drivers\etc下的hosts文件 2.注意: 1.该文件需要赋予管理权限,将域名解析为指定ip 2.浏览器地址栏输入域名时首先会去本地的hosts文件中找到相应的解析,如果存在则跳转到对于IP,如果不存在则去网络中的DNS服务器上进行域名解析找到对应的IP 3.例:将huoyu.com域名解析为对应的IP地址,无需重启电脑,直接ping该域名即可访问对应的IP地址 4.域名不能解析到端口,只能解析到ip 5.一般生产环境中不会用域名+端口访问网站,通常使用nginx来监听80端口,然后配置域名监听并在配置中映射到对应站点+端口 2.Linux操作系统 1.修改/etc/hosts文件
2.反向代理
- 1.
非代理模式
- 1.客户端直接访问服务器端
- 2.
正向代理模式
- 1.客户端访问服务器需要先通过代理服务器,然后通过代理服务器将请求发送到服务器
- 2.正向代理是面向客户端的
- 3.
反向代理模式
- 1.客户端访问代理服务器,然后由代理服务器根据相应策略发送给对应服务器
- 2.反向代理是面向服务器端的
- 4.搭建步骤
- 1.修改
windows
的hosts
文件,设置域名
地址映射的IP
- 2.修改
nginx
的配置文件,设置监听端口和域名并通过proxy_pass
将请求转发到目的网址
- 5.注意:不管是正向代理还是反向代理都需要通过网关(代理服务器/路由器)将请求转发出去或者接入进来,因此网关的带宽影响数据的传输速度
- 6.
QPS(Queries Per Second)
: 一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,即每秒的响应请求数,也即是最大吞吐能力- 7.
proxy_pass
:不支持https
协议,并且一些网址可以直接代理访问(状态码200
,地址栏不变),一些只能重定向(状态码302
,地址栏改变)
3.负载均衡
- 1.将客户端请求按照一定的策略分发到不同的服务器上,减轻服务器的负载,提高服务器的效率
- 2.搭建步骤
1.启动多台
tomcat
服务器或者多台linux
虚拟机(可参考Linux
软件安装的Linux
安装Tomcat
和Linux
克隆)2.修改
nginx
的配置文件(/etc/nginx/nginx.conf
和/etc/nginx/conf.d/default.conf
)
- 3.负载均衡策略有如下几种
1.轮询
- 1.默认采用的策略
- 2.每个请求按时间顺序逐一分配到不同的服务器,如果服务器宕机能自动删除
2.权重
- 1.关键字
weight
- 2.
weight
代表权重,默认为1
,权重越高被分配的请求越多- 3.注意:每次请求分配的服务器随机,但是总比率等于权重比率
3.ip_hash
- 1.关键字
ip_hash
- 2.每个请求按访问
IP
地址的hash
结果分配,即一个IP
请求对应一个固定的服务器- 3.注意:
ip_hash
可以解决不同服务器session
不同的问题(实际开发中一般不采用)
4.fair
- 1.关键字
fair
- 2.按服务器的响应时间来分配请求,响应时间短的服务器优先分配请求
- 3.注意
- 1.
fair
采用的不是内建的负载均衡
算法,而是可以根据页面大小,加载时间长短智能的进行负载均衡- 2.由于不是默认策略所以安装时需要重新编译,因此通过
yum
安装的nginx
无法添加此模块,建议使用源码安装,可参考Linux软件安装
文章的Linux系统下安装Nginx
- 3.注意:
yum
安装的nginx
是不带nginx-upstream-fair
模块的,所以在负载均衡的策略中使用fair
会报错
4.动静分离
- 1.将
动态资源(tomcat服务器等)
和静态资源(html静态页面等)
分别放到不同的服务器上,不同类型的请求访问不同的服务器,从而加快资源解析的速度,降低单个服务器的压力- 2.具体步骤
- 1.
linux
系统中准备静态资源进行访问
- 2.修改
nginx.conf
配置文件,通过location
指定不同的后缀名实现不同的请求转发
- 3.
nginx
服务器默认存在缓存,通过expires
可以设置浏览器缓存过期时间,减少客户端与服务器之间的请求和流量,同时一般静态文件都直接存放到nginx
服务器中,进一步减少服务器的压力- 4.修改
/etc/nginx/mime.type
文件,txt
文件默认解析方式是text/plain
,更改为application/octet-stream
再次点击文件会进行下载(注意缓存会导致点击仍然是查看)
- 1.具体Expiress定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量,这种方法非常适合不经常变动的资源(经常更新的文件,不建议使用Expires来缓存)
- 2.在location中添加,设置3d,表示在3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200
5.高可用集群
- 1.单机
nginx
情况下,如果nginx
宕机,则请求无法实现转发或负载均衡等效果- 2.使用两台以上nginx,其中一台作为主master服务器,一台作为备份backnp服务器,当主服务器宕机,可以使用备份继续完成功能
- 2.主备操作需要使用keepalived,主机和,备机都需要安装keepalived,类似路由,通过脚本检测当前nginx是否存活,如果存活则访问,如果宕机则切换到备机进行访问
- 3.注意:主备两台nginx服务器的ip地址不同,所以需要对外提供一个虚拟ip,该ip实际不存在,但是可以通过该ip进行访问
- 使用步骤
- 1.准备两台nginx服务器,且分别在两台服务器上安装keepalived
- 2.修改keepalived的配置文件keepalived.conf,修改前
- 3.添加检测脚本
- 4.启动两台服务器上的nginx和keepalived并测试
- 5.访问对外虚拟ip地址
- 修改后
7.基本操作
1.启动
systemctl start nginx
2.停止
systemctl stop nginx
3.重启
systemctl restart nginx
4.重新加载配置
systemctl reload nginx
5.设置开启启动
systemctl enable nginx
6.关闭开机启动设置
systemctl disable nginx
7.查看版本
nginx -V
7.原理
3.常用服务器对比
1.IIS
2.Tomcat
3.Apache
4.Loghttpd
5.Google Servers
6.Weblogic
7.Webshpere(IBM)
4.特点
1.速度快,并发高
- 因为Nginx采用了多进程和I/O多路复用(epoll)的底层实现
2.配置简单,扩展性强
3.高可靠性
- Nginx采用多线程模式,其中有一个master主进程和多个worker进程
- worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务
- master主进程可以在某一个worker进程出错时,快速拉起新的worker进程提供服务
4.热部署
- Nginx可以在不停止的情况下,对Nginx进行文件升级,更新配置和更换日志文件
5.成本低,BSD许可证
- BSD是一个开源的许可证
- 流行的六种开源许可证:GPL,BSD,MIT,Mozilla,Apache,LGPL
- OpenRestry[Nginx和Lua]
- Tengine[淘宝]
5.常用功能
- 1.静态资源部署
- 2.Rewrite地址重写
- 3.反向代理
- 4.负载均衡
- 5.轮询,加权轮询,ip_hash,url_hash,fair
- 6.web缓存
- 7.环境部署
- 8.高可用的环境
- 9.用户认证模块