IT评测·应用市场-qidao123.com

标题: Nginx 配置与实战 [打印本页]

作者: 羊蹓狼    时间: 2025-3-15 10:48
标题: Nginx 配置与实战
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不中断运行,即使运行几个月也不需要重新启动,还能在不中断服务的环境下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发毗连数,最重要的是, Nginx 是免费的并可以商业化,配置利用也比力简单。
Nginx特点:

一、配置(nginx.conf)

nginx.conf 配置文件的语法规则:
Nginx 的典范配置示例:


1.1 内置变量

nginx 常用的内置全局变量,你可以在配置中随意利用,点此查看结果:内置变量实例演示
变量说明$args哀求中的参数,例: baidu.com/?a=1&b=1 中的a和b$content_lengthHTTP 哀求信息里的"Content-Length"$content_typeHTTP 哀求信息里的"Content-Type"$document_rootnginx 虚拟主机配置文件中的 root 参数对应的值$document_uri当前哀求中不包罗指令的 URI$host主机头,也就是域名$http_user_agent客户端的具体信息,也就是浏览器的标识$http_cookie客户端的 cookie 信息$limit_rate如果 nginx服务器利用limit_rate 配置了表现网络速率,则会表现,如果没有设置,则表现0$remote_addr客户端的公网ip$remote_user如果 nginx有配置认证,该变量代表客户端认证的用户名$request_body_file做反向代理时发给后端服务器的当地资源的名称$request_method哀求资源的方式,GET /PUT /DELETE等$request_filename当前哀求的资源文件的路径名称$request_uri哀求的链接,包括$document_uri 和$args$scheme哀求的协议,如ftp, http, https$server_addr服务器IP地址$server_name服务器的主机名$server_port服务器的端口号
1.2 全局配置

1.2.1 main 段核心参数
  1. #1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
  2. #语法:user USERNAME [GROUP]
  3. user nginx lion;    #用户是nginx; 组是lion
  4. #2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
  5. pid /opt/nginx/logs/nginx.pid;   #master主进程的的pid存放在nginx.pid的文件
  6. #3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
  7. worker_rlimit_nofile 20480;     #可以理解成每个worker子进程的最大连接数量。
  8. #4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
  9. worker_rlimit_core 50M;     #存放大小限制
  10. working_directory /opt/nginx/tmp;   #存放目录
  11. #5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
  12. worker_processes 4;  #指定具体子进程数量
  13. worker_processes auto;   #与当前cpu物理核心数一致
  14. #6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
  15. worker_cpu_affinity 0001 0010 0100 1000;    #4个物理核心,4个worker子进程
  16. #7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
  17. worker_priority -10;    #120-10=110,110就是最终的优先级
  18. #Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
  19. #备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
  20. #8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
  21. worker_shutdown_timeout 5s;
  22. #9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
  23. timer_resolution 100ms;
  24. #在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
  25. #10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
  26. daemon off;     #默认是on,后台运行模式
复制代码
worker_cpu_affinity:将每个 worker 子进程与特定 CPU 物理核心绑定,优势在于,避免同一个 worker 子进程在差别的 CPU 核心上切换,缓存失效,低落性能。但其并不能真正的避免进程切换。

1.2.2 events 段核心参数
  1. #1. use:Nginx 使用何种事件驱动模型。
  2. use method;  #不推荐配置它,让nginx自己选择
  3. #method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
  4. #2. worker_connections:worker 子进程能够处理的最大并发连接数。
  5. worker_connections 1024;  #每个子进程的最大连接数为1024
  6. #3. accept_mutex:是否打开负载均衡互斥锁。
  7. accept_mutex on;  #默认是off关闭的,这里推荐打开
复制代码
1.3 常用配置

配置位置说明worker_processes 8开始工作进程, 通常等于CPU数最或者2倍于CPUinclude filename恣意用于引入其他文件worker_connectionsevents最大毗连数keepalive_timeouthttp毗连超时时间,默认为75sgzip onhttp开启 gzip 压缩client_header_buffer_sizehttp设定哀求缓冲client_max_body_sizehttp上传文件的大小限制,默认 1mkeepalive_requestsserver单毗连哀求上限次数listen 80server监听 80 端口server_nameserver监听地址error_pageserver界说错误提示界面setserver界说变量proxy_passlocation代理转发rewritelocation重定向returnlocation停止处理哀求1.3.1 server_name

指定虚拟主机域名
  1. #语法:server_name <name_1> [<name_2> ...]
  2. server_name www.nginx.com;
复制代码
域名匹配的四种写法:
点此查看:server_name实例演示
1.3.2 location
  1. #配置 URL路径
  2. location [ = | ~ | ~* | ^~ ] uri { ... }
复制代码
匹配规则(点此查看:location实例演示):
location 的末端斜线 /
  1. #当访问 www.nginx-test.com/test 时,location 中的是否有末尾反斜线,结果如下:
  2. location /test/ { ... }
  3. #末尾带 / 时,Nginx 只会找 test/index.html 文件。
  4. location /test { ... }
  5. #末尾不带 / 时,Nginx 会先找 test/index.html 文件,没有再找 test 文件。
  6. ##即:先找是否有 test 目录,有则找 test 目录下的 index.html ;没有则会找是否有 test 文件。
复制代码
1.3.3 root 与 alias

root 与 alias 都可以指定静态资源目次位置,两者选其一即可

寻找资源时:root 会将界说路径与 URI 叠加,alias 则只取界说路径
当用户访问 http://www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
1.3.4 proxy_pass

用于配置代理服务器,如:正向代理反向代理(点击即可查看演示)
  1. #上下文:location、if、limit_except
  2. #语法:proxy_pass URL;
  3. proxy_pass http://127.0.0.1:8081
  4. proxy_pass http://127.0.0.1:8081/proxy
复制代码
URL 参数原则:
在配置代理时,proxy_pass 有末端 带和 不带 / 两种用法,它们的区别可大了:proxy_pass实例演示
1.3.5 upstream

用于界说上游服务器(指的就是后台提供的应用服务器)的相关信息。
  1. #上下文:http
  2. ##语法
  3. #upstream name {
  4. #    server address [parameters]      #定义上游服务器地址。
  5. #}
  6. ##配置示例
  7. upstream back_end_server {
  8.     #上游服务器            权重     最大连接数      判定失败的超时时间 连接失败数
  9.     server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
  10.     keepalive 32;
  11.     keepalive_requests 50;
  12.     keepalive_timeout 30s;
  13. }
复制代码
在 upstream 内可利用的指令:
点此查看:负载平衡演示
1.3.6 return

停止处理哀求,直接返回响应码或重定向到其他 URL ;执行 return 指令后, location 中后续指令将不会被执行。
  1. #语法:
  2. #return code [text];
  3. #return code URL;
  4. #return URL;
  5. #例如:
  6. location / {
  7.     return 404;     #直接返回状态码
  8. }
  9. location / {
  10.     return 404 "pages not found";   #返回状态码 + 一段文本
  11. }
  12. location / {
  13.     return 302 /bbs;   #返回状态码 + 重定向地址
  14. }
  15. location / {
  16.     return https://www.baidu.com;   #返回重定向地址
  17. }
复制代码
1.3.7 rewrite

根据指定正则表达式匹配规则,重写 URL 。
  1. #上下文(标签):server、location、if
  2. #语法:rewrite <正则表达式> <要替换的内容> [flag];
  3. rewirte /images/(.*\.jpg)$ /pic/$1;     #变量$1 是前面括号(.*\.jpg)的反向引用
复制代码
flag 可选值的含义:
点此查看:rewrite实例演示
1.3.8 if
  1. #上下文:server、location
  2. #语法:if (condition) { ... }
  3. if ($http_user_agent ~ Chrome) {
  4.     rewrite /(.*) /browser/$1 break;
  5. }
  6. #实例:当访问 localhost:8080/images/ 时,会进入 if 判断里面,并执行 rewrite 命令。
  7. server {
  8.     listen 8080;
  9.     server_name localhost;
  10.     root html;
  11.     location / {
  12.         if ( $uri = "/images/" ) {
  13.             rewrite (.*) /pics/ break;
  14.         }
  15.     }
  16. }
复制代码
condition 判断条件:
1.3.9 autoindex

用户哀求以 / 结尾时,列出目次结构,可以用于快速搭建静态资源下载网站。

autoindex-nginx.conf 配置信息:
  1. #当访问 fe.lion.com/download/ 时,会把服务器 /opt/source/download/ 路径下的文件展示出来
  2. server {
  3.     listen 80;
  4.     server_name fe.lion-test.club;
  5.     location /download/ {
  6.         root /opt/source;
  7.         autoindex on;    #打开 autoindex,可选参数有 on | off
  8.         autoindex_exact_size on;    #修改为off(默认on),以bytes(KB、MB、GB)显示出⽂件的确切⼤⼩
  9.         autoindex_format html;    #以html的方式进行格式化,可选参数有 html | json | xml
  10.         autoindex_localtime off;    #显示的⽂件时间为⽂件的服务器时间(默认off)。显示的⽂件时间为GMT时间
  11.     }
  12. }
复制代码
1.4 HTTPS

在学习如何配置 HTTPS 之前,我们先来简单回首下 HTTPS 的工作流程是怎么样的?它是如何进行加密包管安全的?
1.4.1 HTTPS 工作流程

这就是 HTTPS 的基本运作原理,利用对称加密和非对称机密配合利用,包管传输内容的安全性。
有兴趣的可点此查看:什么是 SSL、TLS 和 HTTPS?
1.4.2 配置证书

下载证书的压缩文件,里面有个 Nginx 文件夹,把 xxx.crt 和 xxx.key 文件拷贝到服务器目次,再进行如下配置:
  1. server {
  2.     listen 443 ssl http2 default_server;   #SSL 访问端口号为 443
  3.     server_name lion.club;      #填写绑定证书的域名(我这里是随便写的)
  4.     ssl_certificate /etc/nginx/https/lion.club_bundle.crt;   #证书地址
  5.     ssl_certificate_key /etc/nginx/https/lion.club.key;      #私钥地址
  6.     ssl_session_timeout 10m;
  7.     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    #支持ssl协议版本,默认为后三个,主流版本是[TLSv1.2]
  8.    
  9.     location / {
  10.         root   /usr/share/nginx/html;
  11.         index  index.html index.htm;
  12.     }
  13. }
复制代码
注意:

1.5 CORS 跨域配置

CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种浏览器机制,允许网页从差别的域(源)哀求资源。它通过利用额外的 HTTP 头来告诉浏览器,允许某个源(协议 + 域名 + 端口)访问资源,即使这些资源来自差别的源。
1.5.1 跨域的界说

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。
这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许差别源间的读利用。
1.5.2 同源的界说

如果两个页面的协议,域名和端口都相同,则两个页面具有相同的源。
与 URL http://store.company.com/dir/page.html 的源进行对比的示例:
差别源会有如下限制:
1.5.3 Nginx 跨域方案

例如:
现在我在 fe.server.com 对 dev.server.com 发起哀求一定会出现跨域。
如下面的配置:
  1. server {
  2.     listen 80;
  3.     server_name fe.server.com;
  4.     location / {
  5.         proxy_pass http://dev.server.com;
  6.     }
  7. }
复制代码
这样可以完美绕过浏览器的同源策略:

1.6 gzip 压缩

GZIP 是规定的三种标准 HTTP 压缩格式之一。目前绝大多数的网站都在利用 GZIP 传输 HTML、CSS、JavaScript 等资源文件。
对于文本文件, GZiP 的结果非常明显,开启后传输所需流量大约会降至 1/4~1/3 。
启用 gzip 同时需要客户端和服务端的支持,然而并不是每个浏览器都支持 gzip 的。
可以通过哀求头中的 Accept-Encoding 来标识对压缩的支持,如图:

如果客户端支持 gzip 的解析,那么只要服务端能够返回 gzip 的文件就可以启用 gzip 了,
可以通过 Nginx 的配置来让服务端支持 gzip 。下面的 respone 中 content-encoding:gzip ,指服务端开启了 gzip 的压缩方式。
  1. #是否开启gzip
  2. gzip on;    #默认 off
  3. #采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用;
  4. gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  5. #---- 以上两个参数开启就可以支持Gzip压缩了 ----#
  6. #该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容;
  7. gzip_static on;    #默认 off
  8. #nginx做为反向代理时启用,用于设置"启用或禁用"从代理服务器上收到相应内容 gzip 压缩;
  9. gzip_proxied any;    #默认 off
  10. #用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩;
  11. gzip_vary on;
  12. #gzip 压缩比,压缩级别是 1-9,级别越高压缩率越大,压缩时间越长;1 压缩级别最低,9 最高,建议 4-6;
  13. gzip_comp_level 6;
  14. #获取多少内存,用于缓存压缩结果
  15. gzip_buffers 16 8k;     #16 8k 表示以 8k*16 为单位获得
  16. #允许压缩的页面最小字节数,页面字节数从header头中的 Content-Length 中进行获取。
  17. #建议设置成大于 1k 的字节数,小于 1k 可能会越压越大;(默认值是 0,不管页面多大都压缩)
  18. gzip_min_length 1k;
  19. #启用 gzip 所需的 HTTP 最低版本;
  20. gzip_http_version 1.1;    #默认 1.1
复制代码
1.7 Nginx 配置黑/白名单

Nginx 利用 deny 和 allow 指令来实现黑 /白名单的配置,利用好坏名单进行安全配置。
  1. #上下文:http、server、location
  2. #语法
  3. allow address | CIDR | all;     #允许访问
  4. deny address | CIDR | all;      #禁止访问
复制代码
参数说明:
例子:
  1. location ^~ /project/deny.txt { #明确请求是对其起作用的;
  2.     alias   /webroot/proj/;     #解析到 /webroot/proj 目录
  3.     deny  all;      #屏蔽任何来源
  4. }
复制代码
也可以把 deny all 改换成 return 404,这样将返回 404 而不是 403 Forbidden,更有“欺骗性”。

1.8 缓存配置

缓存可以非常有效的提升性能,因此不论是客户端(浏览器),还是代理服务器( Nginx ),乃至上游服务器都多少会涉及到缓存。可见缓存在每个环节都好坏常重要的。

存储一些之前被访问过、而且可能将要被再次访问的资源,利用户可以直接从代理服务器获得,从而淘汰上游服务器的压力,加快整个访问速度。
下面让我们来学习 Nginx 中如何设置缓存策略。
1.8.1 缓存文件设置
  1. #上下文:http
  2. #### proxy_cache_path
  3. #设置缓存文件的存放路径。
  4. proxy_cache_path path [level=levels] ...    #默认值:proxy_cache off;
复制代码
参数含义:
1.8.2 缓存条件设置
  1. #上下文:http、server、location
  2. #### proxy_no_cache
  3. #定义相应保存到缓存的条件,如果字符串参数的至少一个值不为空且不等于 “0”,则将不保存该响应到缓存。
  4. #语法:proxy_no_cache string;
  5. proxy_no_cache $http_pragma $http_authorization;
  6. #### proxy_cache_bypass
  7. #定义条件,在该条件下将不会从缓存中获取响应。
  8. #语法:proxy_cache_bypass string;
  9. proxy_cache_bypass $http_pragma $http_authorization;
复制代码
1.8.3 缓存参数配置
  1. #上下文:http、server、location
  2. #### proxy_cache
  3. #缓存开关
  4. proxy_cache zone | off ;    # zone 是共享内存的名称(默认值:off;)
  5. #### proxy_cache_valid
  6. #配置什么状态码可以被缓存,以及缓存时长。
  7. #语法:proxy_cache_valid [code...] time;
  8. proxy_cache_valid 200 304 2m;  #说明对于状态为200和304的缓存文件的缓存时间是2分钟
  9. #### proxy_cache_key
  10. #设置缓存文件的 key
  11. proxy_cache_key     #默认值 $scheme$proxy_host$request_uri;
复制代码
upstream_cache_status 变量,设置在响应头信息中,在调试中非常有效,它存储了缓存是否命中的信息,如下:
1.8.4 缓存配置实例

上游服务器:121.42.11.34 ,配置如下:
  1. server {
  2.     listen 1010;
  3.     root /usr/share/nginx/html/1010;
  4.     location / {
  5.         index index.html;
  6.     }
  7. }
  8. server {
  9.     listen 1020;
  10.     root /usr/share/nginx/html/1020;
  11.     location / {
  12.         index index.html;
  13.     }
  14. }
复制代码
代理服务器:121.5.180.193 ,配置如下:
  1. # 缓存文件设置
  2. proxy_cache_path /etc/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=2g inactive=60m use_temp_path=off;
  3. upstream cache_server {
  4.     server 121.42.11.34:1010;
  5.     server 121.42.11.34:1020;
  6. }
  7. server {
  8.     listen 80;
  9.     server_name cache.lion.club;
  10.     location / {
  11.         proxy_cache cache_zone;     #设置缓存内存,上面配置中已经定义好的
  12.         proxy_cache_valid 200 5m;   #缓存状态为200的请求,缓存时长为5分钟
  13.         proxy_cache_key $request_uri;   #缓存文件的key为请求的URI
  14.         add_header Nginx-Cache-Status $upstream_cache_status    #把缓存状态设置为头部信息,响应给客户端
  15.         proxy_pass http://cache_server;     #代理转发
  16.     }
  17. }
复制代码
缓存就是这样配置,我们可以在 /etc/nginx/cache_temp 路径下找到相应的缓存文件。
对于一些及时性要求非常高的页面或数据来说,就不应该去设置缓存,下面来看看如何配置不缓存的内容。
添加过滤条件,过滤哀求不缓存:
  1. # 缓存文件设置
  2. proxy_cache_path /etc/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=2g inactive=60m use_temp_path=off;
  3. upstream cache_server {
  4.     server 121.42.11.34:1010;
  5.     server 121.42.11.34:1020;
  6. }
  7. server {
  8.     listen 80;
  9.     server_name cache.lion.club;
  10.     # URI 中后缀为 .txt 或 .text 的设置变量值为 "no cache"
  11.     if ($request_uri ~ \.(txt|text)$) {
  12.         set $cache_name "no cache"
  13.     }
  14.    
  15.     location / {
  16.         proxy_no_cache $cache_name;     #判断该变量是否有值,如果有值则不进行缓存,如果没有值则进行缓存
  17.         proxy_cache cache_zone;     #设置缓存内存
  18.         proxy_cache_valid 200 5m;   #缓存状态为200的请求,缓存时长为5分钟
  19.         proxy_cache_key $request_uri;   #缓存文件的key为请求的URI
  20.         add_header Nginx-Cache-Status $upstream_cache_status    #把缓存状态设置为头部信息,响应给客户端
  21.         proxy_pass http://cache_server;     #代理转发
  22.     }
  23. }
复制代码
二、栗子

rewrite实例演示
  1. server{
  2.   listen 80;
  3.   server_name fe.lion.club;     #要在本地hosts文件进行配置
  4.   root html;
  5.   location /search {
  6.       rewrite ^/(.*) https://www.baidu.com redirect;    #返回 302 并临时重定向到百度
  7.   }
  8.   
  9.   location /images {
  10.       rewrite /images/(.*) /pics/$1;
  11.   }
  12.   
  13.   location /pics {
  14.       rewrite /pics/(.*) /photos/$1;
  15.   }
  16.   
  17.   location /photos {
  18.   
  19.   }
  20. }
复制代码
按照这个配置我们来分析:

负载平衡演示

配置负载平衡主要是要利用 upstream 指令。
我们把 121.42.11.34 服务器作为上游服务器,做如下配置:
  1. server {
  2.     listen 8020;
  3.     location / {
  4.         return 200 'return 8020 \n';
  5.     }
  6. }
  7. server {
  8.     listen 8030;
  9.     location / {
  10.         return 200 'return 8030 \n';
  11.     }
  12. }
  13. server {
  14.     listen 8040;
  15.     location / {
  16.         return 200 'return 8040 \n';
  17.     }
  18. }
复制代码
把 121.5.180.193 服务器作为代理服务器,做如下配置:
[code]#1. 配置当地 hostssudo tee -a /etc/hosts




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4