Nginx 配置与实战

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

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

  • 高并发、高性能;
  • 模块化架构使得它的扩展性非常好;
  • 异步非壅闭的事件驱动模型这点和 Node.js 相似;
  • 相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性;
  • 热部署、平滑升级;
  • 完全开源,生态繁荣;

一、配置(nginx.conf)

nginx.conf 配置文件的语法规则:

  • 配置文件由指令与指令块构成;
  • 每条指令以 ; 分号结尾,指令与参数间以空格符号分隔;
  • 指令块以 {} 大括号将多条指令构造在一起;
  • include 语句允许组合多个配置文件以提升可维护性;
  • 通过 # 符号添加解释,提高可读性;
  • 通过 $ 符号利用变量;
  • 部分指令的参数支持正则表达式,例如常用的 location 指令.
Nginx 的典范配置示例:


  • main 全局配置,对全局见效;
  • events 配置影响 Nginx 服务器与用户的网络毗连;
  • http 配置代理,缓存,日记界说等绝大多数功能和第三方模块的配置;
  • server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
  • location 用于配置匹配的 uri ;
  • upstream 配置后端服务用具体地址,负载平衡配置不可或缺的部分;
    1. #1. main段配置信息
    2. user  nginx;                        #运行用户,默认即是nginx,可以不进行设置
    3. worker_processes  auto;             #Nginx 进程数,一般设置为和 CPU 核数一样
    4. error_log  /var/log/nginx/error.log warn;   #Nginx 的错误日志存放目录
    5. pid        /var/run/nginx.pid;      #Nginx 服务启动时的 pid 存放位置
    6. #2. events段配置信息
    7. events {
    8.     use epoll;     #使用epoll的I/O模型(缺省会自动选择一个最适合你操作系统的)
    9.     worker_connections 1024;   #每个进程允许最大并发数
    10. }
    11. #3. http段配置信息
    12. #配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
    13. http {
    14.     #设置日志模式
    15.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    16.                     '$status $body_bytes_sent "$http_referer" '
    17.                     '"$http_user_agent" "$http_x_forwarded_for"';
    18.     access_log  /var/log/nginx/access.log  main;   #Nginx访问日志存放位置
    19.     sendfile            on;   #开启高效传输模式
    20.     tcp_nopush          on;   #减少网络报文段的数量
    21.     tcp_nodelay         on;
    22.     keepalive_timeout   65;   #保持连接的时间,也叫超时时间,单位秒
    23.     types_hash_max_size 2048;
    24.     include             /etc/nginx/mime.types;      #文件扩展名与类型映射表
    25.     default_type        application/octet-stream;   #默认文件类型
    26.     #4. server段配置信息
    27.     server {
    28.         listen       80;       #配置监听的端口
    29.         server_name  localhost;    #配置的域名
    30.         #5. location段配置信息
    31.         location / {
    32.             root   /usr/share/nginx/html;  #网站根目录
    33.             index  index.html index.htm;   #默认首页文件
    34.             deny 172.168.22.11;   #禁止访问的ip地址,可以为all
    35.             allow 172.168.33.44;   #允许访问的ip地址,可以为all
    36.         }
    37.         error_page 500 502 503 504 /50x.html;  #默认50x对应的访问页面
    38.         error_page 400 404 error.html;   #同上
    39.     }
    40.     #加载子配置项
    41.     include /etc/nginx/conf.d/*.conf;
    42. }
    复制代码

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 www.nginx.com
  • 左侧通配: server_name *.nginx.com
  • 右侧统配: server_name www.nginx.*
  • 正则匹配: server_name ~^www.nginx.*$
    匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
点此查看: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

  • root:指定静态资源目次位置,可以写在 http、server、location 等配置中。
    1. #语法:root path
    2. location /image {
    3.     root /opt/nginx/static;
    4. }
    复制代码
  • alias:指定静态资源目次位置,只能写在 location 中,且资源路径以 / 结尾。
    1. #语法:root path/
    2. location /image {
    3.     alias /opt/nginx/static/image/;
    4. }
    复制代码
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 参数原则:

  • URL 必须以 http 或 https 开头;
  • URL 中可以携带变量;
  • URL 中是否带 URI ,会直接影响发往上游哀求的 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 内可利用的指令:

  • zone    #界说共享内存,用于跨 worker 子进程;
  • keepalive      #对上游服务启用长毗连,限制每个 worker 子进程与上游服务器空闲长毗连的最大数量。
  • keepalive_requests     #一个长毗连最多哀求 HTTP 的个数(默认100);:单个长毗连可以处理的最多 HTTP 哀求个数。
  • keepalive_timeout      #空闲环境下,一个长毗连的超时时长;空闲长毗连的最长保持时间(默认60s)。
  • hash    #哈希负载平衡算法;
  • ip_hash   #依据 IP 进行哈希计算的负载平衡算法;
  • least_conn    #最少毗连数负载平衡算法;
  • least_time    #最短响应时间负载平衡算法;
  • random    #随机负载平衡算法,random 还支持两种可选的负载平衡模式如下:

    • random two:从后端服务器列表中,随机选择两个服务器,然后根据配置的权重(weight)选择其中一个。
    • random two least_conn:从后端服务器列表中,随机选择两个服务器,然后选择其中毗连数较少的服务器。(联合了随机性和最少毗连数的长处)

  • server  [parameters]    #界说上游服务器地址,parameters 可选值:

    • weight=  #权重值,默认为1;
    • max_conns=  #上游服务器的最大并发毗连数;
    • fail_timeout=  #服务器不可用的判定时间;
    • max_fails=  #服务器不可用的查抄次数;
    • backup  #备份服务器,仅当其他服务器都不可用时才会启用;
    • down  #标记服务器长期不可用,离线维护;

点此查看:负载平衡演示
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 可选值的含义:

  • last 重写后的 URL 发起新哀求,再次进入 server 段,重试 location 的中的匹配;
  • break 直接利用重写后的 URL ,不再匹配其它 location 中语句;
  • redirect 返回 302 暂时重定向;
  • permanent 返回 301 永世重定向;
点此查看: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 判断条件:

  • $variable   #仅为变量时,值为空或以0开头,字符串都会被当做 false 处理;
  • = !=   #相称或不等;
  • ~   #正则匹配;
  • ~*  #正则匹配,不区分大小写;
  • -f  #检测 文件 存在;
  • -d  #检测 目次 存在;
  • -e  #检测 文件、目次、符号链接 等存在;
  • -x  #检测文件可以执行;
  • !   #取反,非;如 ! ~ 非正则匹配;或 ! -f 文件不存在
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://www.baidu.com 百度网站;
  • 百度服务器返回 HTTPS 利用的 CA 证书;
  • 浏览器验证 CA 证书是否为正当证书;
  • 验证通过,证书正当,生成一串随机数并利用公钥(证书中提供的)进行加密;
  • 发送公钥加密后的随机数给百度服务器;
  • 百度服务器拿到密文,通过私钥进行解密,获取到随机数(公钥加密,私钥解密,反之也可以);
  • 百度服务器把要发送给浏览器的内容,利用随机数进行加密后传输给浏览器;
  • 此时浏览器可以利用随机数进行解密,获取到服务器的真实传输内容;
这就是 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. }
复制代码
注意:

  • ssl_certificate证书的后缀不固定,目前知道的有有:.cer、.pem、.crt ;
  • ssl_certificate_key的文件的后缀是固定的为.key

1.5 CORS 跨域配置

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

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

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

  • Web 数据层面:同源策略限制了差别源的站点读取当前站点的 Cookie 、 IndexDB 、 LocalStorage 等数据。
  • DOM 层面:同源策略限制了来自差别源的 JavaScript 脚本对当前 DOM 对象读和写的利用。
  • 网络层面:同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给差别源的站点。
1.5.3 Nginx 跨域方案

例如:

  • 前端服务的域名为: fe.server.com
  • 后端服务的域名为: dev.server.com
现在我在 fe.server.com 对 dev.server.com 发起哀求一定会出现跨域。

  • 启动一个 Nginx 服务器,将 server_name 设置为 fe.server.com
  • 设置相应的 location 以拦截前端需要跨域的哀求
  • 最后将哀求代理回 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. }
复制代码
这样可以完美绕过浏览器的同源策略:

  • fe.server.com 访问 Nginx 的 fe.server.com 属于同源访问,
  • 而 Nginx 对服务端转发的哀求不会触发浏览器的同源策略。

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;      #禁止访问
复制代码
参数说明:

  • address:具体的ip地址。
  • CIDR:ip加掩码形式地址。
  • all:所有ip地址。
例子:

  • 黑名单: 配置克制的ip访问,允许其他所有的地址访问。
    1. deny 192.168.1.234
    2. deny 192.168.1.235
    3. deny 192.168.1.236
    4. allow all;
    复制代码
    在这个配置下,234、235和236的ip访问不了服务器,会表现403 Forbidden,而其他ip都可以访问。
  • 白名单: 配置允许的ip访问,克制其他所有的地址访问。
    1. allow 192.168.1.234
    2. allow 192.168.1.235
    3. allow 192.168.1.236
    4. deny all;
    复制代码
    在这个配置下,234、235和236的ip可以访问服务器,而其他所有ip都不允许访问,表现403 Forbidden。
  • 配置克制访问文件或文件夹
  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;
复制代码
参数含义:

  • path  #缓存文件的存放路径;
  • level  #path的目次层级;
  • keys_zone  #设置共享内存;
  • inactive  #在指定时间内没有被访问,缓存会被清算,默认10分钟;
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 变量,设置在响应头信息中,在调试中非常有效,它存储了缓存是否命中的信息,如下:

  • MISS:  #未命中缓存
  • HIT::  #命中缓存
  • EXPIRED:  #缓存过期
  • STALE:  #命中了陈旧缓存
  • REVALIDDATED:  #Nginx验证陈旧缓存依然有效
  • UPDATING:  #内容陈旧,但正在更新
  • BYPASS:  #响应从原始服务器获取
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. }
复制代码
按照这个配置我们来分析:

  • 当访问 fe.lion.club/search 时,自动重定向到 https://www.baidu.com
  • 当访问 fe.lion.club/images/1.jpg 时:

    • 找到 /images 的 location ,然后重写 URL 为 fe.lion.club/pics/1.jpg
    • 找到 /pics 的 location ,继续重写 URL 为 fe.lion.club/photos/1.jpg
    • 找到 /photos 的 location 后,去 html/photos 目次下寻找 1.jpg 静态资源。


负载平衡演示

配置负载平衡主要是要利用 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表