面试知识点总结之Nginx
Nginx简介
Nginx是一个轻量级/高性能的反向代理web服务器,他实现非常高效的反向代理,负载均衡,可以处理2-3万并发连接数,官方检测支持5W并发,内存消耗小;而且Nginx内置健康检查空能;如果有一个服务器宕机会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。
Nginx性能为什么这么高?
事件处理机制:异步非阻塞事件处理机制;运用了epoll模型,提供了一个队列,排队解决
正向代理和反向代理?
正向代理:请求直接到达服务器
反向代理:请求统一被Nginx接收,nginx反向代理服务器收到之后,按照一定规则分发给了后端的业务处理服务器进行处理了。
优点:占内存小,可实现高并发连接,处理响应快,可实现http服务器,虚拟主机,方向代理,负载均衡,Nginx配置简单,可以不暴露正式的服务器ip地址
缺点:动态处理差,nginx处理静态文件好,耗费内存少,但是动态处理页面则很鸡肋,现在一般前端用nginx作为反向代理坑住压力
Nginx怎么处理请求的?
Nginx接收到一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址
Nginx实现负载均衡的5种策略
1. 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统
2. 权重(weight)weight的值越大分配到的访问概率越高,主要用于后端服务器性能不均衡的情况,其次是为在主从的情况下设置不同的权值,达到合理有效的利用主机资源
3. ip_hash(ip绑定) 每个请求按访问ip的哈希结果分配,使来自同一ip的访客固定一台后端服务器,并且可以有效姐姐二动态网页存在的session共享问题
4. fair(第三方插件) 负载均衡算法,fair算法根据页面大小,加载时间长短智能负载均衡响应时间段优先分配
5. url_hash(第三方插件) 按访问url的hash结果来分配请求,每个url定向到同一服务器
Nginx常用配置:
1、几个常见配置项:
- 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
- 2.$remote_user :用来记录客户端用户名称;
- 3.$time_local : 用来记录访问时间与时区;
- 4.$request : 用来记录请求的url与http协议;
- 5.$status : 用来记录请求状态;成功是200;
- 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
- 7.$http_referer :用来记录从那个页面链接访问过来的;
- 8.$http_user_agent :记录客户端浏览器的相关信息;
2、惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
3、每个指令必须有分号结束。
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
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
}
}
}
Nginx配置文件模版:
# 全局参数 user nginx; # Nginx进程运行用户 worker_processes auto; # Nginx工作进程数,通常设置为CPU核数 error_log /var/log/nginx/error.log warn; # 错误日志路径和日志级别 pid /run/nginx.pid; # 进程PID保存路径 # 定义事件模块 events { worker_connections 1024; # 每个工作进程最大并发连接数 use epoll; # 使用epoll网络模型,提高性能 multi_accept on; # 开启支持多个连接同时建立 } # 定义HTTP服务器模块 http { # 缓存文件目录 client_body_temp_path /var/cache/nginx/client_temp; proxy_temp_path /var/cache/nginx/proxy_temp; fastcgi_temp_path /var/cache/nginx/fastcgi_temp; # 定义日志格式,main是默认的日志格式 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; # 定义MIME类型 include /etc/nginx/mime.types; default_type application/octet-stream; # 代理参数 proxy_connect_timeout 6s; # 连接超时时间 proxy_send_timeout 10s; # 发送超时时间 proxy_read_timeout 10s; # 接收超时时间 proxy_buffer_size 16k; # 缓冲区大小 proxy_buffers 4 32k; # 缓冲区个数和大小 proxy_busy_buffers_size 64k; # 忙碌缓冲区大小 proxy_temp_file_write_size 64k; # 代理临时文件写入大小 # 启用压缩,可以提高网站访问速度 gzip on; gzip_min_length 1k; # 最小压缩文件大小 gzip_types text/plain text/css application/json application/javascript application/xml; # 定义HTTP服务器 server { listen 80; # 监听端口 server_name example.com; # 域名 # 重定向到HTTPS,强制使用HTTPS访问 if ($scheme != "https") { return 301 https://$server_name$request_uri; } # HTTPS服务器配置 ssl_certificate /etc/nginx/ssl/server.crt; # SSL证书路径 ssl_certificate_key /etc/nginx/ssl/server.key; # SSL私钥路径 # SSL会话缓存参数 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; # 配置代理路径 location / { proxy_pass http://localhost:8080; # 转发请求的目标地址 proxy_set_header Host $host; # 设置请求头中的Host字段 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置HTTP头中的X-Forwarded-For字段,表示客户端真实IP,多个IP用逗号隔开 proxy_set_header X-Real-IP $remote_addr; # 设置请求头中的X-Real-IP字段,表示客户端真实IP } # 配置静态文件访问路径 location /static/ { alias /path/to/static/files/; # 静态文件的目录 expires 7d; # 静态文件缓存时间 add_header Pragma public; # 添加HTTP响应头 add_header Cache-Control "public, must-revalidate, proxy-revalidate"; } # 配置错误页面 error_page 404 /404.html; # 404错误页 location = /404.html { internal; # 不接受外部访问 root /usr/share/nginx/html; # 404错误页文件所在目录 } # 配置重定向 location /old/ { rewrite ^/old/([^/]+) /new/$1 permanent; # 将/old/xxx路径重定向为/new/xxx,返回301状态码 } } # 其他服务配置 # server { # ... # } # 配置TCP负载均衡 upstream backends { server backend1.example.com:8080 weight=5; # 后端服务器地址和权重 server backend2.example.com:8080; server backend3.example.com:8080 backup; # 备用服务器 keepalive 16; # 连接池大小 } server { listen 80; server_name example.com; location / { proxy_pass http://backends; # 负载均衡转发请求的目标地址 proxy_set_header Host $host; # 设置请求头中的Host字段 proxy_set_header X-Real-IP $remote_addr; # 设置请求头中的X-Real-IP字段,表示客户端真实IP } } }