Article / 文章中心

关于 Nginx,你还在背诵那些培训机构教给你的内容么?

发布时间:2022-02-11 点击数:598

关于 Nginx 你还在背诵着培训班中教给你的内容么?面试的时分很多项目都说运用过 Nginx,但是当面试官问你 Nginx 的原理的时分,你还在手足无措么?假如有,那么这篇文章我送给咱们,让你面试答复 Nginx 的的时分不再慌张,不需求再去背诵那些内容了,各位看官预备好了么?


01、什么是Nginx

咱们来看一下这个百度百科给出的解说:


Nginx (engine x) 是一个高性能的 HTTP 和反向署理 Web 服务器,一起也提供了 IMAP/POP3/SMTP 服务。


Nginx 是一款轻量级的 Web 服务器/反向署理服务器及电子邮件(IMAP/POP3)署理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发才能强,事实上 Nginx 的并发才能确实在同类型的网页服务器中体现较好,中国大陆运用 Nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。


以上的内容是百度百科给出的解说,这个但是现已算的上是很全了,总结下来就几点内容:


  • HTTP 和反向署理 Web 服务器
  • IMAP/POP3/SMTP 服务


02、Nginx 的长处和效果


  • Nginx 运用依据事情驱动架构,使得其能够支撑数以百万等级的TCP连接
  • 高度的模块化和自由软件许可证是的第三方模块层出不穷
  • Nginx 是一个跨平台服务器,能够运转在Linux、Windows、FreeBSD、Solaris、AIX、Mac OS 等操作体系上
  • 这些优异的设计带来的极大的稳定性



03、Nginx的署理


说到署理,首先咱们要清晰一个概念,所谓署理便是一个代表、一个渠道;


此时就设计到两个人物,一个是被署理人物,一个是方针人物,被署理人物经过这个署理拜访方针人物完成一些任务的过程称为署理操作过程;如同日子中的专卖店~客人到 Adidas 专卖店买了一双鞋,这个专卖店便是署理,被署理人物便是 Adidas 厂家,方针人物便是用户。


而署理又分为了2种,一种是正向署理,一种是反向署理


1)正向署理


举一个经典的例子,咱们拜访国外的网站的时分,是没有办法进行拜访的,这时分是不是就得需求一个署理服务器,咱们把恳求发给署理服务器,署理服务器去拜访国外的网站,然后将拜访到的数据传递给咱们!


上述这样的署理形式称为正向署理,正向署理最大的特点是客户端非常清晰要拜访的服务器地址;服务器只清楚恳求来自哪个署理服务器,而不清楚来自哪个具体的客户端;正向署理形式屏蔽或许躲藏了真实客户端信息。


正向署理的用处


  • 拜访本来无法拜访的资源,如 Google
  • 能够做缓存,加快拜访资源
  • 对客户端拜访授权,上网进行认证
  • 署理能够记录用户拜访记录(上网行为管理),对外躲藏用户信息


2)反向署理


咱们说完了正向署理之后,咱们再来看一下反向署理,最经典的运用,分布式

经过布置多台服务器来解决拜访人数约束的问题;某宝网站中大部分功能也是直接运用Nginx进行反向署理完成的,而且经过封装 Nginx 和其他的组件之后起了个高大上的姓名:Tengine。


这其实便是反向署理的一个经典运用。


反向署理的用处


  • 确保内网的安全,通常将反向署理作为公网拜访地址,Web服务器是内网
  • 负载均衡,经过反向署理服务器来优化网站的负载


说完了署理,咱们就该来看面试中最常常问到的必须答复的内容。


04、你在作业中是怎样对 Nginx 进行装备的


装备文件详解:


  • nginx.conf----------------------Nginx 的根本装备文件
  • mime.types----------------------MIME 类型相关的扩展文件
  • fastcgi.conf----------------------与 fastcgi 相关的装备
  • proxy.conf----------------------与 proxy 相关的装备
  • sites.conf----------------------装备 Nginx 提供的网站,包括虚拟主机


今天咱们先说首要的这个 nginx.conf 装备文件,之后再去解说其他的装备文件。


nginx.conf 装备文件首要分红四个部分:


  • main,大局设置,影响其它部分一切设置
  • server,主机服务相关设置,首要用于指定虚拟主机域名、IP 和端口
  • location,URL 匹配特定方位后的设置,反向署理、内容篡改相关设置
  • upstream,上游服务器设置,负载均衡相关装备


他们之间的联系是:server 承继 main,location 承继server;upstream 既不会承继指令也不会被承继。


通用装备如下:

#界说 Nginx 运转的用户和用户组,默许由 nobody 账号运转, windows 下面能够注释掉。 user  nobody;  #nginx进程数,主张设置为等于CPU总核心数。能够和worker_cpu_affinity配合 worker_processes  1;  #大局过错日志界说类型,[ debug | info | notice | warn | error | crit ] #error_log  logs/error.log; #error_log  logs/error.log  notice; #error_log  logs/error.log  info;  #进程文件,window下能够注释掉 #pid        logs/nginx.pid;  # 一个nginx进程翻开的最多文件描述符(句柄)数目,理论值应该是最多翻开文件数(体系的值ulimit -n)与nginx进程数相除, # 但是nginx分配恳求并不均匀,所以主张与ulimit -n的值保持一致。 worker_rlimit_nofile 65535;  #作业形式与连接数上限 events {  # 参阅事情模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];  # epoll模型是Linux 2.6以上版别内核中的高性能网络I/O模型,假如跑在FreeBSD上面,就用kqueue模型。  #use epoll;  #connections 20000;  # 每个进程答应的最多连接数  # 单个进程最大连接数(最大连接数=连接数*进程数)该值受体系进程最大翻开文件数约束,需求运用命令ulimit -n 检查当时设置  worker_connections 65535; }  #设定http服务器 http {  #文件扩展名与文件类型映射表  #include 是个主模块指令,能够将装备文件拆分并引证,能够减少主装备文件的复杂度  include       mime.types;  #默许文件类型  default_type  application/octet-stream;  #charset utf-8; #默许编码   #界说虚拟主机日志的格局  #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  logs/access.log  main;   #敞开高效文件传输形式,sendfile指令指定nginx是否调用sendfile函数来输出文件,关于一般运用设为 on,假如用来进行下载等运用磁盘IO重负载运用,可设置为off,以平衡磁盘与网络I/O处理速度,下降体系的负载。留意:假如图片显现不正常把这个改成off。  sendfile        on;  #autoindex on; #敞开目录列表拜访,合适下载服务器,默许封闭。   #防止网络堵塞  #tcp_nopush     on;   #长连接超时时刻,单位是秒,默许为0  keepalive_timeout  65;   # gzip紧缩功能设置  gzip on; #敞开gzip紧缩输出  gzip_min_length 1k; #最小紧缩文件巨细  gzip_buffers    4 16k; #紧缩缓冲区  gzip_http_version 1.0; #紧缩版别(默许1.1,前端假如是squid2.5请运用1.0)  gzip_comp_level 6; #紧缩等级  #紧缩类型,默许就现已包括text/html,所以下面就不必再写了,写上去也不会有问题,但是会有一个warn。  gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;  gzip_vary on; //和http头有联系,加个vary头,给署理服务器用的,有的浏览器支撑紧缩,有的不支撑,所以防止浪费不支撑的也紧缩,所以依据客户端的HTTP头来判断,是否需求紧缩  #limit_zone crawler $binary_remote_addr 10m; #敞开约束IP连接数的时分需求运用   # http_proxy服务大局设置  client_max_body_size   10m;  client_body_buffer_size   128k;  proxy_connect_timeout   75;  proxy_send_timeout   75;  proxy_read_timeout   75;  proxy_buffer_size   4k;  proxy_buffers   4 32k;  proxy_busy_buffers_size   64k;  proxy_temp_file_write_size  64k;  proxy_temp_path   /usr/local/nginx/proxy_temp 1 2;   # 设定负载均衡后台服务器列表  upstream  backend.com  {  #ip_hash; # 指定支撑的调度算法  # upstream 的负载均衡,weight 是权重,能够依据机器装备界说权重。weigth 参数表示权值,权值越高被分配到的几率越大。  server   192.168.10.100:8080 max_fails=2 fail_timeout=30s ;  server   192.168.10.101:8080 max_fails=2 fail_timeout=30s ;  }   #虚拟主机的装备  server {  #监听端口  listen       80;  #域名能够有多个,用空格离隔  server_name  localhost fontend.com;  # Server Side Include,通常称为服务器端嵌入  #ssi on;  #默许编码  #charset utf-8;  #界说本虚拟主机的拜访日志  #access_log  logs/host.access.log  main;   # 因为一切的地址都以 / 开头,所以这条规则将匹配到一切恳求  location / {  root   html;  index  index.html index.htm;  }   #error_page  404              /404.html;   # redirect server error pages to the static page /50x.html  #  error_page   500 502 503 504  /50x.html;  location = /50x.html {  root   html;  }   # 图片缓存时刻设置  location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {  expires 10d;  }   # JS和CSS缓存时刻设置  location ~ .*.(js|css)?$ {  expires 1h;  }   #署理装备  # proxy the PHP scripts to Apache listening on 127.0.0.1:80  #location /proxy/ {  #    proxy_pass   http://127.0.0.1;  #}   # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  #  #location ~ \.php$ {  #    root           html;  #    fastcgi_pass   127.0.0.1:9000;  #    fastcgi_index  index.php;  #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  #    include        fastcgi_params;  #}   # deny access to .htaccess files, if Apache's document root  # concurs with nginx's one  #  #location ~ /\.ht {  #    deny  all;  #}  }   # another virtual host using mix of IP-, name-, and port-based configuration  #  #server {  #    listen       8000;  #    listen       somename:8080;  #    server_name  somename  alias  another.alias;   #    location / {  #        root   html;  #        index  index.html index.htm;  #    }  #}   # HTTPS server  #  #server {  #    listen       443 ssl;  #    server_name  localhost;   #    ssl_certificate      cert.pem;  #    ssl_certificate_key  cert.key;   #    ssl_session_cache    shared:SSL:1m;  #    ssl_session_timeout  5m;   #    ssl_ciphers  HIGH:!aNULL:!MD5;  #    ssl_prefer_server_ciphers  on;   #    location / {  #        root   html;  #        index  index.html index.htm;  #    }  #}

上面的装备文件不需求你每一行都看过来,你需求留意的地方如下:

#作业形式与连接数上限 events {  # 参阅事情模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];  # epoll模型是Linux 2.6以上版别内核中的高性能网络I/O模型,假如跑在FreeBSD上面,就用kqueue模型。  #use epoll;  #connections 20000;  # 每个进程答应的最多连接数  # 单个进程最大连接数(最大连接数=连接数*进程数)该值受体系进程最大翻开文件数约束,需求运用命令ulimit -n 检查当时设置  worker_connections 65535; }  http {  include       mime.types;   #文件扩展名与文件类型映射表  default_type  application/octet-stream; #默许文件类型,默许为text/plain  #access_log off; #取消服务日志  log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自界说格局  access_log log/access.log myFormat;  #combined为日志格局的默许值  sendfile on;   #答应sendfile方式传输文件,默许为off,能够在http块,server块,location块。  sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默许为0,即不设上限。  keepalive_timeout 65;  #连接超时时刻,默许为75s,能够在http,server,location块。   upstream mysvr {  server 127.0.0.1:7878;  server 192.168.10.121:3333 backup;  #热备  }  error_page 404 https://www.baidu.com; #过错页   server {  keepalive_requests 120; #单连接恳求上限次数。  listen       4545;   #监听端口  server_name  127.0.0.1;   #监听地址  location  ~*^.+$ {       #恳求的url过滤,正则匹配,~为区别巨细写,~*为不区别巨细写。  #root path;  #根目录  #index vv.txt;  #设置默许页  proxy_pass  http://mysvr;  #恳求转向mysvr 界说的服务器列表  deny 127.0.0.1;  #回绝的ip  allow 172.18.5.54; #答应的ip  }  }  }

有时分面试官会问你,你们是怎样修改装备文件完成负载均衡的?


经过在 upstream 参数中添加的运用服务器 IP 后添加指定参数即可完成,如:

upstream tomcatserver1 {  server 192.168.72.49:8080 weight=3;  server 192.168.72.49:8081;  }   server {  listen       80;  server_name  8080.max.com;  #charset koi8-r;  #access_log  logs/host.access.log  main;  location / {  proxy_pass   http://tomcatserver1;  index  index.html index.htm;  }  }

经过以上装备,便能够完成,在拜访 8080.max.com 这个网站时,由于装备了 proxy_pass 地址,一切恳求都会先经过 Nginx 反向署理服务器,在服务器将恳求转发给目的主机时,读取 upstream 为 tomcatsever1 的地址,读取分发策略,装备 tomcat1 权重为 3,所以 Nginx 会将大部分恳求发送给 49 服务器上的 tomcat1,也便是 8080 端口;较少部分给 tomcat2 来完成有条件的负载均衡,当然这个条件便是服务器 1、2 的硬件指数处理恳求才能。


面试官又问,你们是怎样装备完成反向署理的呢?

 server {  listen       80;  server_name  tomcat1.com;  #charset koi8-r;  #access_log  logs/host.access.log  main;  location  / {  proxy_pass   http://127.0.0.1:8280;  index  index.html index.htm;  }  } server {  listen       80;  server_name  tomcat2.com;  #charset koi8-r;  #access_log  logs/host.access.log  main;  location / {  proxy_pass   http://127.0.0.1:8281;  index  index.html index.htm;  }  }
  1. 翻开 /conf/nainx.conf 文件,删去 server{ …… },或许注销掉
  2. 重新添加 server{  }
  3. listen: 监听的端口号
  4. server_name: 拜访域名
  5. location :这里装备为 /   直接匹配端口下的默许 ROOT 下的项目,
  6. proxy_pass  :为项目的实践拜访地址


然后重启 Nginx 服务器就能够啦!


有时分面试官就会问你,你在运用 Nginx 的时分做过哪些装备,在装备文件中改动过那里,都有什么样子的效果,把列出来的这一行代码解说给面试官听,那么至少你在面试官面前,现已把 Nginx 的比较重要的点解说了一下了,这样也能添加咱们入职的一些胜算。