Skip to content

Latest commit

 

History

History
161 lines (111 loc) · 5.19 KB

File metadata and controls

161 lines (111 loc) · 5.19 KB

21.Nginx

解释一下什么是Nginx?有什么特性?

Nginx 是一个Web服务器和反向代理服务器,用于Http、Https、SMTP、POP3 和 IMAP协议

特性包括:反向代理/L7负载均衡器、切入式Perl解释器、动态二进制升级、可用于重新编写URL,具有非常好的PCRE支持

Nginx 和 Apache 的区别

1)轻量级,同样起web 服务,比apache 占用更少的内存及资源

2)抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

3)高度模块化的设计,编写模块相对简单

4)最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

Nginx 如何实现高并发

一个主进程,多个工作进程,每个工作进程可以处理多个请求,每进来一个request,会有一个worker进程去处理。但不是全程处理,处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker继续处理其他请求,而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。由于web server 的工作性质决定了每个request的大部分生命都在网络传输中,实际上花费在server机器上的时间片不多,这是几个进程就解决高并发的秘密所在,即webserver刚好属于网络io密集型应用,不算计算密集型

请解释Nginx如何处理HTTP请求

Nginx使用反应器模式,主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理,单个线程可以提供数万个并发连接

使用“反向代理服务器”的优点是什么

反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。

在Nginx中,如何使用未定义的服务器名称来阻止处理请求

server {
listen 80; 
server_name "";
return 4444;
}

这里服务器名被保留为一个空字符串,它将在没有“主机”头字段的情况下匹配请求,而一个特殊的Nginx的非标准代码444被返回,从而终止连接

Nginx 一些主要配置,分别用来做什么的

  • 用来配置虚拟主机
#基于域名的虚拟主机
server {
    listen 80;  #监听端口
    server_name a.com; #监听域名

    location / {
            root /var/www/a.com;   #根目录定位
            index index.html;
    }
}

#基于端口的虚拟主机配置 访问 192.xxx.xx.xxx:8080
server {
    listen 8080;    #监听8080端口
    server_name 192.xxx.xx.xxx;    #服务器IP地址

    location / {
            root /var/www/html8080;
            index index.html;
    }
}
  • 日志管理配置
#不同的server可以使用不同的log
#此处定义了日志格式,最好定位在顶层,方便其他server公用
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

$remote_addr                        用户ip
$remote_user [$time_local]          用户访问时间
$request                            请求类型 get,post...
$status                             请求状态 200 304...
$body_bytes_sent                    请求的内容有多少字节
$http_referer                       上一个页面来自哪里(从哪里跳转过来)
$http_user_agent                    用户代理(用了什么浏览器访问)



#这说明 该server, 它的访问日志的文件,使用的格式main格式.
access_log  logs/host.access.log  main;

另外可以写一个sh脚本,每天半夜切分log日志,避免log每天累积造成文件过大

#!/bin/bash
base_path='/usr/local/nginx/logs'
log_path=$(date -d yesterday +"%Y%m")
day=$(date -d yesterday +"%d")
mkdir -p $base_path/$log_path
mv $base_path/access.log $base_path/$log_path/access_$day.log
#echo $base_path/$log_path/access_$day.log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

#Crontab 编辑定时任务
01 00 * * * /xxx/path/b.sh  每天0时1分(建议在02-04点之间,系统负载小)
  • 配置定位
#location 的语法
location [=|~|~*|^~] patt {
    ...
}
#中括号可以不写任何参数,此时称为一般匹配
#也可以写参数
#因此,大类型可以分为3种
#首先看有没有精准匹配,如果有,则停止匹配过程,若没有向下匹配到最符合的location
location = patt {} #[精准匹配]
location patt{}  #[一般匹配]
location ~ patt{} #[正则匹配]
  • 配置反向代理和负载均衡
http {
    ...
    #负载均衡服务器池
    upstream xxx {
        server 127.xx.xx.xx1;
        server 127.xx.xx.xx2;
    }
    server {
        liseten 80;
        server_name localhost;
        location / {
            #用户真实IP
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://xxx     #upstream 对应自定义名称
            include proxy.conf;  
        }
    }
}