Nginx学习

配置示例


#user  nobody;
worker_processes  1; # 工作进程数量

error_log  /etc/nginx/logs/nginx-error.log;
error_log  /etc/nginx/logs/nginx-error.log  notice;
error_log  /etc/nginx/logs/nginx-error.log  info;

#pid        logs/nginx.pid;

events {
  worker_connections  1024; # 一个进程最多可以处理并发请求上限,number值不能大于操作系统支持打开的最大文件句柄数量
  accept_mutex on | off; # 解决“惊群”问题,开启的时候将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢
  multi_accept on | off; # 默认为关闭(off)状态,即每个worker process一次只能接收一个新到达的网络连接
  use method; # 选择处理网络消息的事件驱动模型:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport
}

http {
  include       mime.types;
  index    index.html index.htm index.php;
  default_type  application/octet-stream;

  server_names_hash_bucket_size 512;
  server_tokens off; # 隐藏版本信息

  client_max_body_size  400M;

  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /etc/nginx/logs/nginx-access.log  main;

  sendfile        on;

  keepalive_timeout  300; # 服务器端对连接的保持时间。默认值为75s。
  keepalive_requests number; # Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向Nginx服务器发送请求的次数
  proxy_max_temp_file_size 500M;

  gzip on;
  gzip_vary on;
  gzip_min_length 10240;
  gzip_comp_level 4;
  gzip_proxied expired no-cache no-store private auth;
  gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/javascript application/json;
  gzip_disable "MSIE [1-6]\.";

  server {
            server_name  www.ronux.com;
        listen       80;
        access_log   logs/access.log  main;
        root         /usr/share/nginx/html/www/;
        index        /index.html;

        location ~* ^/community/.+\.(html)$ {
            # 针对爬虫的配置,不要去掉
            if ( $http_user_agent ~* "(googlebot|bingbot|yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator)") {
                rewrite ^/(.*)$ /render/https://$host$request_uri break;
                proxy_pass http://ronux-rendertron:3000;
            }
            index  index.html;
            try_files $uri $uri/ /index.html?s=$uri&$args;
        }

        location / {
            index  index.html;
            # 配置页面不缓存html和htm结尾的文件
            if ($request_filename ~ .*\.(htm|html)$) {
              add_header Cache-Control no-store;
            }
            error_page  404  /404.html;
         }
    }

  include /etc/nginx/conf.d/*.nginx.conf;
}

location 匹配规则

location [ = | ~ | ~* | ^~ ] uri { ... }
uri分为:标准uri和正则uri

匹配规则:

  1. 标准uri与请求字符串相匹配的,如果多个取匹配度最多的1个,这里并没有结束
  2. 接着用location块中的正则uri与请求字符串匹配,第一次匹配成功即结束搜索
  3. 如果正则uri匹配失败,回到1里选中的匹配度最高的标准uri结束搜索

匹配可选项:
● “=”,用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。
● “~”,用于表示uri包含正则表达式,并且区分大小写。
● “~*”,用于表示uri包含正则表达式,并且不区分大小写。
● “^~”,用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
如果uri包含正则表达式,就必须要使用“~”或者“~*”标识。

location root & alias区别:
root:服务器端设置根目录,用于寻找请求资源

匹配/usr/share/nginx/html/data/下index.html

location /data/ {

root /usr/share/nginx/html;

}

alias:使用alias指令改变location接收到的URI的请求路径

/data/index.html请求匹配/usr/share/nginx/html/other/index.html

location ~ ^/data/(.+.(htm|htm))$ {

alias /usr/share/nginx/html/other/$1;

}

常用变量
// 以 https://www.ronux.com/communi... 请求为例

$request // 请求行信息 'GET /community/homePage/?from=mainEntrance HTTP/1.1'
$uri // 这里做了默认文件补全 '/community/homePage/index.html'
$request_filename // '/Users/xxx/homepage/dist/community/homePage/index.html'
$request_method // 'GET'

网络服务器常见几种请求处理机制

多进程:
服务器每当接收到一个客户端时,就由服务器主进程生成一个子进程出来和该客户端建立连接进行交互,直到连接断开,该子进程就结束了。
代表:apache
多线程:
服务器每当接收到一个客户端时,会由服务器主进程派生一个线程出来和该客户端进行交互。操作系统创建线程的开销远小于创建进程。
代表:tomcat,IIS
异步IO:
主要指异步非阻塞。即发送方向接收方发送请求后,不用等待响应,可以继续其他工作;接收方处理请求时进行的IO操作如果不能马上得到结果,也不等待,而是马上返回去做其他事情。当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。
代表:nginx,node

Nginx的事件处理机制
Nginx服务器的工作进程调用IO后,就去进行其他工作了;当IO调用返回后,会通知工作进程。这里有一个问题,IO调用是如何把自己的状态通知给工作进程的呢?
一般解决这个问题的方案有两种。
一是,让工作进程在进行其他工作的过程中间隔一段时间就去检查一下IO的运行状态,如果完成,就去响应客户端,如果未完成,就继续正在进行的工作;
二是, IO调用在完成后能主动通知工作进程。对于前者,虽然工作进程在IO调用过程中没有等待,但不断的检查仍然在时间和资源上导致了不小的开销,最理想的解决方案是第二种。
具体来说,select/poll/epoll/kqueue等这样的系统调用就是用来支持第二种解决方案的。这些系统调用,也常被称为事件驱动模型,它们提供了一种机制,让进程可以同时处理多个并发请求,不用关心IO调用的具体状态。IO调用完全由事件驱动模型来管理,事件准备好之后就通知工作进程事件已经就绪。

select / poll: 进程主动轮询
epoll: 内核轮询,并通知进程。Linux 2.5.44中引入的,在Linux 2.6及以上的版本都可以使用它。epoll库在Linux平台上是高效的。它支持一个进程打开大数目的事件描述符,上限是系统可以打开文件的最大数目;同时,epoll库的IO效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行操作。
rtsig: Real-time signal。信号队列长度限制,溢出后降级使用poll。直到rtsig信号队列全部清空。rtsig模型在Linux 2.2.19及以上的版本中可以使用。

Nginx进程架构
主进程
工作进程
进程之间如何通信?
主进程 => 工作进程:单向管道
工作进程 <==> 工作进程:管道
run-loops事件处理循环模型

地址重写与地址转发

地址重写:
其实就是重定向
实际上是为了实现地址标准化。那么,什么是地址标准化呢?我们来举一个例子。比如在访问Google首页的时候,我们在地址栏中可以输入www.google.com,也可以输入google.cn,它们都能够准确地指向Google首页,从客户端来看,Google首页同时对应了两个地址,实际上,Google服务器是在不同的地址中选择了确定的一个,即www.google.com,进而返回服务器响应的。这个过程就是地址标准化的过程。google.cn这个地址在服务器中被改变为www.google.com的过程就是地址重定向的过程。

地址转发:
“转发”的概念最初和网页的访问并没有太大关系,它是指在网络数据传输过程中数据分组到达路由器或者桥接器后该设备通过检查分组地址并将数据转到相邻局域网上的过程。后来该概念被用在网页访问中,出现了“地址转发”的说法。“地址转发”,是指将一个域名指到另一个已有站点的过程。

正向代理与反向代理
正向代理服务器与反向代理服务器的概念很简单,归纳起来就是:
正向代理服务器用来让局域网客户机接入外网以访问外网资源
反向代理服务器用来让外网的客户端接入局域网中的站点以访问站点中的资源

你可能感兴趣的:(前端运维)