看完这篇文章,Nginx 拿下!
0 什么是 Nginx
-
Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,在同类型的网页服务器中表现较好,Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达 50000 个并发连接数
-
使用 Nginx 的好处:
- 高并发:支持高并发连接,通常不会成为高并发的瓶颈。在高并发的情况下,能保持低资源低消耗高性能
- 高可用:可以热部署,Nginx 作为所有流量的入口,必须要非常稳定的对外提供服务。在不影响当前流量的情况下,可以进行新的部署和调整
- 轻量级:内存、CPU 资源占用少
- 配置简单:配置文件简洁,启动特别容易,并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动
- 支持负载均衡、反向代理、gzip 压缩
1 正向代理与反向代理
- 正向代理:
- 在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
- 比如:国内访问不了 YouTube,通过配置代理服务器,就可以访问了
- 反向代理:
- 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址
2 使用场景
-
动态静态资源分离:为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力,可以作为一个静态资源服务器的功能
-
正向 + 反向代理结合:Nginx 主要作用于反向代理服务器,通过负载均衡分散压力(单个服务器解决不了,增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是负载均衡)
-
负载均衡图示:
3 Nginx 配置文件 nginx.conf
3.1 所在位置
- 我是通过 Docker 安装的 Nginx,位于:
/etc/nginx/nginx.conf
3.2 三大部分
- 全局块:从配置文件开始到 events 块之间的内容,主要会设置一些影响 Nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;
- events 块:events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等
events{ worker_connections 1024; }
- http 块:是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这。
- 值得注意的是:http 全局块也可以包含 http 块和 server 块
- http 块中的全局块:http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
- http 块中的 server 块:每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块
http{ include /etc/nginx/mime.types; default_type application/octet-stream; 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; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
server{ listen 80; listen [::]80; server_name localhost; # 开启gzip gzip on; # 低于1kb的资源不压缩 gzip_min_length 1k; # 压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。 gzip_comp_level 5; # 需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片. gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css; # 配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持) gzip_disable "MSIE [1-6]\."; # 是否添加“Vary: Accept-Encoding”响应头 gzip_vary on; }
3.3 location 正则语法
location [= | ~ | ~* | ^~] uri {
}
- 说明:
=
用于不含正则表达式的 uri 前,要求请求字符串与 uri、严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求~
用于表示 uri 包含正则表达式,并且区分大小写~\
用于表示 uri 包含正则表达式,并且不区分大小写^~
用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,不再使用 location 块中的正则 uri 和请求字符串做匹配
- 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~\ 标识