zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

nginx常用配置

配置Nginx 常用
2023-09-11 14:22:19 时间

一、Nginx配置虚拟主机

1.简介

在nginx中,一个server字段,就是一个虚拟机主机。

可以端口一样,域名不一样。域名一样,端口不一样。

2.添加

nginx主配置文件默认会加载conf.d目录下的配置,include /usr/locale/nginx/conf.d/*.conf;一般虚拟主机在这里添加一个xx.conf,xx一般为端口或者域名,好识别

如下添加一个端口为80,域名为ftp.baidu.com的虚拟主机
vim conf.d/ftp.conf

server {
    listen       80;
    server_name  ftp.baidu.com;
    index index.html;
    root   html;
    access_log  /tmp/ftp.log main; #一般讲日志单独出来,好区分哪个域名的问题
    error_log /tmp/ftp_error.log;
}

#如果开启了php,需要单独在这块添加php的location

二、Nginx开启用户认证

1.简介

场景:
如果有某些需要放置在外面,谁都可以访问,但只让某些人可以看到,就可以设置一个账号密码。通常用于Nginx做FTP,需要验证才能访问。

过程:
使用htpasswd命令创建账户文件,手写的密码是不行的。

2.操作

安装依赖
yum -y install httpd-tools

创建密码文件
htpasswd -cm /usr/local/nginx/pass tom

追加用户,不使用-c选项
htpasswd -m /usr/local/nginx/pass jerry

http,server,location字段均可添加

server {
        listen       80;
        server_name  localhost;
        auth_basic "Input Password:";  #认证提示符
        auth_basic_user_file "/usr/local/nginx/pass"; #认证密码文件

    location / {
            root   html;
            index  index.html index.htm;
        }
  }

三、Nginx开启PHP

1.简介

场景:
Nginx本身只能解析html文件,但有些网页是php写的,就需要Nginx连接php,将网页解析成html再发给客户端。

配置中将.php 结尾的请求通过 FashCGI 交给 PHP-FPM 处理,PHP-FPM
是 PHP 的一个 FastCGI 管理器。

2.配置

在server字段中添加一个location字段

    location ~ \.php$ { #匹配php文件,只有php文件才放到这里解析
        root           html/bbs; #php页面地址

        #nginx 将会连接回环地址 9000 端口执行 PHP 文件,需要使用 tcp/ip 协议,速度比较慢.建议大家换成使用 socket 方式连接。将 fastcgi_pass 127.0.0.1:9000;改成 fastcgi_pass unix:/var/run/phpfpm.sock;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;

        #/usr/local/xxx是php文件所在的目录,虽然root那行指定了目录,但通常不靠谱
        fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
        include        fastcgi_params;
        }

3.参数

以下均添加到location所在字段

#第一行代码是为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

#指定连接到后端FastCGI的超时时间,默认60秒
fastcgi_connect_timeout 30;

#指定向FastCGI传送请求的超时时间,规定时间内后端服务器必须传输完所有数据
fastcgi_send_timeout 30;

#指定接收FastCGI应答的超时时间,如果php-fpm迟迟不发送,将超时
fastcgi_read_timeout 30;

#用于指定读取nginx的FastCGI去响应php-fpm的响应头要多大的容量
fastcgi_buffer_size 64k;

#指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。
fastcgi_buffers 4 64k;

#用于系统很忙是使用的大小,的默认值是fastcgi_buffers的两倍。
fastcgi_busy_buffers_size 128k;

#表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍
fastcgi_temp_file_write_size 128k;

#表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生,但是开启缓存也会引起很多问题,要视具体情况而定。
fastcgi_cache TEST;

#fastcgi用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时,将301应答缓存1天,其他应答均缓存1分钟。
fastcgi_cache_valid 200 302 1h;

fastcgi_cache_valid 301 1d;

fastcgi_cache_valid any 1m;

四、开启PHP_INFO

1.简介

pathinfo是php需要的东西,php可以用这个函数来获得信息。

http://wangying.sinaapp.com/tools/index.php/login/index
这个访问,Apache都接受, 都会认为是对index.php的访问, 并会设置PATH_INFO为
/login/index
print_r($_SERVER[“PATH_INFO”]);//login/index

php程序或者页面,就可以根据这个信息来做一些操作,或者处理东西。但默认Nginx是不开启的。

2.配置

对于形如tools/index.php/login/index 这样的文件路径, Nginx正则匹配为路径而不是php文件. 所以我们需要去掉($)

1.使用php内部解析,将Nginx获取的变量直接传给后面的php页面。

location ~ .php { #去掉了最后的$
    fastcgi_index index.php;
    fastcgi_pass 127.0.0.1:9000;
    include fastcgi_params;
    fastcgi_param PATH_INFO $fastcgi_script_name;
}

2.使用nginx正则解析,手动用if命令将访问路径解析,然后作为PATH_INFO传递给php页面。

Nginx默认获取不到PATH_INFO的值,得通过fastcgi_split_path_info指定定义的正则表达式来给$fastcgi_path_info赋值。

#配置方案 使用nginx模块fastcgi_split_path_info(nginx版本>0.7.31)
    location ~ \.php {
        fastcgi_index index.php;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;

        set $real_script_name $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
            set $real_script_name $1;
            set $path_info $2;
        }

         fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
         fastcgi_param SCRIPT_NAME $real_script_name;
         fastcgi_param PATH_INFO $path_info;
    }

3.参数

#不推荐,这是正则后的值传递给path_info,会不安全
fastcgi_split_path_info       ^(.+\.php)(/.+)$;

#通过paht_info变量传递
fastcgi_param PATH_INFO       $fastcgi_path_info;

#传递,当前不清楚有何区别
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

#传递,当前不清楚有何区别
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

五、Nginx重定向

1.简介

据相关变量重定向和选择不同的配置,从一个 location 跳转到另一个 location,不过这样的循环最多可以执行10 次,超过后 nginx 将返回 500 错误。同时,重写模块包含 set 指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他 location、记录做了什么等等。

rewrite指令的第一个参数是一个正则,用于匹配那些需要重写的URI,第二个参数用于替换匹配到的URI,第三个参数是一个标记,表示后面是否还进行重写,或者重定向。

2.配置

1.访问a页面重定向到b页面
server {
        listen       80;
        server_name  localhost;

    location / {
        root   html;
        index  index.html index.htm;
        rewrite /a.html  /b.html;
    }
}
2.访问当前nginx,重定向到其他网址
server {
    listen       80;
    server_name  localhost;

    rewrite ^/ http://www.tmooc.cn/;

    location / {
        root   html;
        index  index.html index.htm;
    }
}

六、Nginx正向代理

1.简介

场景:
用于内网机器访问外网,就需要正向代理,类似VPN。

原理:
A机器可以访问外网,而B,C,D机器只能内网,便可以设立正向代理,将B,C,D机器的访问请求发给A,A机器访问外网后再将获得的信息再转发给B,C,D。

2.配置

server {
    listen 8090;

    location / {
        resolver 218.85.157.99 218.85.152.99;
        resolver_timeout 30s;
        proxy_pass http://$host$request_uri;
    }
    access_log /data/httplogs/proxy-$host-aceess.log;
}

3.参数

resolver后面填写dns地址,可以多个,将以轮询方式请求。
resolver_timeout 解析超时时间。

七、Nginx反向代理

1.简介

场景:
当后端服务器不直接面对客户,就需要代理了。这样的好处是代理可以进行缓存,加速访问,或者对访问进行负载均衡,做各种策略。

原理:
访问时 浏览器–反向代理–后端服务器,返回时 后端服务器–反向代理–浏览器

2.配置

1.反向代理
server {
    listen 80;
    server_name localhost;
    charset utf-8;

    location / {
        proxy_set_header  Host $host;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for ;
        proxy_set_header Accept-Encoding "";
        # 应用服务器 HTTP 地址
        proxy_pass http://192.168.0.112:8080;
        }
}
2.反向代理websocket

关于什么是websocket在知识普及版块有说明

在这里,我们看到客户端和服务器能够通过作为代理的NGINX进行通信,并且消息可以继续来回发送,直到客户端或服务器断开连接。

让NGINX正确处理WebSocket所需要的是正确设置头文件来处理将连接从HTTP升级到WebSocket的升级请求。

upstream websocket {
    server 192.168.100.10:8010; #后端WebSocket程序
}

server {
    listen 8010; #端口一般是对等的
    server_name xx;

    location / {
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; #升级http协议
        proxy_set_header Connection $connection_upgrade;
    }
}
3.负载均衡

当后端服务器不够用时,将使用负载均衡技术,将请求分发

#1.配置负载池子
upstream myapp {
    server 192.168.0.111:8080; # 应用服务器 1
    server 192.168.0.112:8080 bak; # 应用服务器 2,表示只有其他机器都繁忙或者坏掉,才用这台
    server 192.168.0.113:8080 down #表示暂不参与
}

#2.调用池子
server {
    listen 80;
    server_name xx;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://myapp; #池子名
    }
}

轮询策略

权重轮询

#指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream backserver {
    server 192.168.0.14 weight=10;
    server 192.168.0.15 weight=10;
}

ip_hash

#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}

fair(第三方)

#按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backserver {
    server server1;
    server server2;
    fair;
}

url_hash(第三方)

#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;

    hash $request_uri;
    hash_method crc32;
}

3.参数

#请求头为空的字段,将不传递给后端服务器。
proxy_set_header Accept-Encoding "";

#将端口,访问ip等传递给后端服务器。否则后端将只能看到nginx的访问。
proxy_set_header Host $host:$server_port;
#只传一层客户端的值,如果前面有代理,相当于2层代理,就只传代理的ip了。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;

#如果前面还有代理,nginx1-nginx2-php程序,那nginx2这层将给php程序nginx1的地址还有客户端的地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 #关闭缓存,将加快交互
proxy_buffering off;

#指定哪个网卡链接后端服务器
proxy_bind 127.0.0.2;

 #存放http报文头的哈希表容量上限,默认为512个字符
proxy_headers_hash_max_size 1024;

 #设置头部哈希表大小 默认为64
proxy_headers_hash_bucket_size 128;

# 应用服务器 HTTP 地址
proxy_pass http://192.168.0.112:8080;

#缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
client_body_buffer_size 512k;

#nginx 跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 5;

#这个指定设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到新的数据,nginx会关闭连接
proxy_send_timeout 60;

#该指令设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。这个时间不是获得整个response的时间,而是两次reading操作的时间。
proxy_read_timeout 10;

#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 16k;

#proxy_buffers 缓冲区,网页平均在 64k 以下的话,这样设置
proxy_buffers 4 64k;

#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 128k;

#设定缓存文件夹大小,大于这个值,将从 upstream 服务器传递请求,而不缓冲到磁盘
proxy_temp_file_write_size 128k;

#不允许代理端主动关闭连接
proxy_ignore_client_abort on;

#未知
proxy_redirect off;

八、Nginx配置HTTPS

1.简介

场景:
用于安全加密,让通信更安全

原理:
在http协议上加了一个加密层,所以信息加密后才发送,到服务器用公钥解密。

2.配置

1.生成证书

1.安装依赖
yum -y isntall openssl

2.生成
cd /usr/local/nginx/conf
openssl genrsa -out cert.key #生成私钥
openssl req -new -x509 -key cert.key -out cert.pem #生成证书

2.单独配置https
server {
    listen 443 ssl http2; #使用HTTP/2,需要Nginx1.9.7以上版本
    charset utf-8;
    server_name  www.xx.com;
    ssl_certificate /root/cert.pen; #证书
    ssl_certificate_key /root/cert.key;私钥
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # SSL(包括 v3)都有漏洞,应该用 TLS(TLS1.0 = SSL 3.1)
    ssl_ciphers   HIGH:!aNULL:!MD5; #加密方法

    ssl_session_tickets on; #开启浏览器的Session Ticket缓存
    ssl_session_timeout 10m; #SSL session过期时间

    ssl_stapling on; #OCSP Stapling开启,OCSP是用于在线查询证书吊销情况的服务,使用OCSP Stapling能将证书有效状态的信息缓存到服务器,提高TLS握手速度
    ssl_stapling_verify on; #OCSP Stapling验证开启

    add_header Strict-Transport-Security "max-age=31536000"; #开启HSTS,并设置有效期为“6307200秒”(6个月),包括子域名(根据情况可删掉),预加载到浏览器缓存(根据情况可删掉)

    access_log  /tmp/access.log; #日志

    location / {
        root /xxxx;
        index  index.html index.htm;
    }
}
3.配置访问http将转到https
server {
    listen       80;
    listen       443 ssl;
    server_name  www.xx,com;

    ssl_certificate /root/cert.pen;
    ssl_certificate_key /root/cert.key;
    ssl_session_tickets on;
    ssl_session_timeout 10m;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security "max-age=31536000";

    if ($scheme != https) { #http请求转到https
        rewrite ^(.*)$  https://$host$1 permanent;
    }

    location / {
        root /xxxx;
        index index.html index.htm;
    }

九、Nginx缓存

参考地址一
参考地址二

1.简介

proxy_cache模块用于反向代理,首先定义一个cache配置,后面使用中可以选择使用其中一个cache配置

2.原理

客户端–nginx–后端程序
当客户端访问nginx时,nginx将访问后端程序,获得信息后再返回给客户端

客户端–nginx–nginx_cache–后端程序
现在客户端访问nginx时,nginx先根据url进行hash,看本地cache文件里是否有,有则传给客户端,没有则去后端程序获取。

默认情况下,NGINX需要考虑从原始服务器得到的Cache-Control标头。当在响应头部中Cache-Control被配置为Private,No-Cache,No-Store或者Set-Cookie,NGINX不进行缓存。NGINX仅仅缓存GET和HEAD客户端请求。你也可以参照下面的解答覆盖这些默认值。

Cache-Control是http网页缓存,当服务器发送给浏览器的http中含有public,则浏览器呈现来自缓存的页面。private则浏览器重新发送请求到服务器。

3.配置

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
use_temp_path=off;

#path 缓存文件位置

#levels 设置缓存文件目录层次,1:2表示两级目录,将大量的文件放置在单个目录中会导致文件访问缓慢

#keys_zone 设置缓存名字和设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。将键的拷贝放入内存可以使NGINX在不检索磁盘的情况下快速决定一个请求是有缓存条目(hit)还是没缓存条目(MISS),这样大大提高了检索速度。一个1MB的内存空间可以存储大约8000个key,那么上面配置的10MB内存空间可以存储差不多80000个key。

#max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。

#inactive 在指定时间内没人访问则被删除

#use_temp_path 将在缓存这些文件时将它们写入同一个目录下,否则的话将会写到临时区域,再复制到目录下,重复了。


server {
...

    location / {
        proxy_cache my_cache; #使用上面定义的名字叫my_cache的配置
        proxy_cache_revalidate on;
        proxy_cache_min_uses 3;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_lock on;
        proxy_pass http://127.0.0.1:80;
        }

#proxy_cache_revalidate 指示NGINX在刷新来自服务器的内容时使用GET请求。如果客户端的请求项已经被缓存过了,但是在缓存控制头部中定义为过期,那么NGINX就会在GET请求中包含If-Modified-Since字段,发送至服务器端。
#    这项配置可以节约带宽,因为对于NGINX已经缓存过的文件,服务器只会在该文件请求头中Last-Modified记录的时间内被修改时才将全部文件一起发送。

#proxy_cache_min_uses 设置了在NGINX缓存前,客户端请求一个条目的最短时间。当缓存不断被填满时,这项设置便十分有用,因为这确保了只有那些被经常访问的内容才会被添加到缓存中。该项默认值为1。

#proxy_cache_use_stale 当想访问介绍页面时,后端服务器timout或者error 5xx错误,如果有介绍页面的缓存信息,将会推送给客户端,而不是返回error。这样对信息做冗余,返回一个旧数据总比没有好。

#proxy_cache_lock 被启用时,当多个客户端请求一个缓存中不存在的文件(或称之为一个MISS),只有这些请求中的第一个被允许发送至服务器。当获得内容并缓存后,其他请求去访问缓存。如果不启用,则所有没找到缓存的请求都去找服务器,压力会大。
}

4.其它参数

1.忽略Cache-Control头部
location /images/ {
    proxy_cache my_cache;
    proxy_ignore_headers Cache-Control;
    proxy_cache_valid any 30m;
    ...
}

#NGINX会忽略所有/images/下的Cache-Control头。proxy_cache_valid命令强制规定缓存数据的过期时间,如果忽略Cache-Control头,则该命令是十分必要的。NGINX不会缓存没有过期时间的文件。
2.缓存post请求

默认是缓存来自get的请求,例如浏览器访问百度,大部分就是get请求,登陆账号则是post。

proxy_cache_methods GET HEAD POST;
3.缓存动态内容

可以,提供的Cache-Control头部可以做到。缓存动态内容,甚至短时间内的内容可以减少在原始数据库和服务器中加载,可以提高第一个字节的到达时间,因为页面不需要对每个请求都生成一次。

4.使用Cookie作为缓存键的一部分
proxy_cache_key $proxy_host$request_uri$cookie_jessionid;
5.手动清理缓存

访问 curl http://127.0.0.1/tmp-test/TL39ef7ea6d8e8d48e87a30c43b8f75e30.txt
将清理其中一个缓存。这个缓存文件存在才行。

location /tmp-test/ {
                allow 127.0.0.1; //只允许本机访问
                deny all; //禁止其他所有ip
                proxy_cache_purge tmp-test $uri;  //清理缓存

#proxy_cache_purge:缓存清理模块
#tmp-test:指定的key_zone的名字
#$uri:指定的生成key的参数
}
6.支持断点续传

导致range参数无法传递到下一级的原因如下:
当缓存代理转发http请求到后端服务器时,http header会改变,header中的部分参数,会被取消掉。其中range参数被取消,导致,后端nginx服务器没有收到range参数,最终导致这个分片下载不成功。所以需要对代理转发的header进行配置。

将http请求中的range值($http_range)放到代理转发的http请求头中作为参数range的值。

#location字段添加
proxy_cache_key $http_range$uri;
<span style="color:#ff0000;">proxy_set_header Range $http_range;</span>

if ( $http_range = ''){
    expires 30d;
}

#proxy_cache_key 默认是将$uri去hash后,作为缓存内容。但range是断点续传,url是一样的,会导致后续的访问还是从$uri缓存后的内容,所以要加一些东西区分一下。
#这样让缓存的东西唯一。

#<span> 将http请求中的range值($http_range)放到代理转发的http请求头中作为参数range的值。

#if那段写的是,当range(断点续传)为空,则让浏览器缓存,否则不缓存。因为断点续传的内容是不一样的,如果缓存了,那下载一个图片用断点续传,将会出现错误,显示的总是第一段。
7.设置查看缓存命中与否
#server字段
add_header  Nginx-Cache "$upstream_cache_status";

十、try_file伪静态

1.简介

try_file用于伪静态。

正常的静态文件是一个xx.html文件,他是真实存在于服务器某个文件夹中的。动态网页是从数据库里查询,返回给浏览器的,实际上并没有这个文件,另外路径也很长。

伪静态优点:
缩短URL路径,更美观
URL路径短,容易被SEO收录,搜索排名靠前
隐藏了真实的访问路径,更安全

伪静态缺点:
与原生的url比较在性能上,不如原生的url,简单的说伪静态就是在服务器上又进行了一层url解析,消耗服务器资源。当然了这点消耗与优点相比,我们还是可以接受的。

下面是博客园中的一篇博客,地址是xx.html,让人看起来是一个html文件

这个是微信的一个文章的地址,后面的参数是文章在数据库中的位置,还有一些其它信息

2.配置

server {
    listen       80;
    server_name   xxx.baidu.com;
    index index.html  index.php;
    root   /data/html;

    location / {
            try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
    }

}

try_files $uri $uri/ /index.php?$query_string

当访问http://www.baidu.com/3434.html 时,$uri就是3434.html,它会去本地的/data/html下面找3434.html。

如果没找到3434.html,就匹配$uri/,nginx会去/data/html找有没有这个目录。

如果还找不到就会匹配最后一个选项,/index.php?$query_string。发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求http://www.baidu.com/3434.php 这个请求会被后面的location ~ .php$ 来匹配,当php程序解析完后,再返回给浏览器。

而具体的 URI 及参数是在 REQUEST_URI 中传递给 FastCGI 和 PHP 程序的,因此不受 URI 变化的影响。

3.整体流程

你在百度搜索一篇文章,右键复制链接地址,粘贴到笔记上,会发现链接非常的长。
https://www.baidu.com/link.php?wd=&eqid=e307e4f6000029fa000000035b864c15

当点击后,这篇文章所在的服务器,会try_files $uri $uri/ /index.php?$query_string;,首先匹配是否是xx.html,明显不是,但也不是文件夹,那就交给fastcgi,转而交给php-fpn去操作。

php看到里面写的是去数据库查询一个id号为e307e4f6000029fa000000035b864c15的文章,就将文章提取后发给浏览器,并取名叫3434.html,这个只是显示,并不存在。

4.更多

1.交给反向代理

如果后端不是php而是反向代理则:

    location / {
        #直接匹配最后面的,不去寻找了
        try_files /_not_exists_ @backend;
    }

    location @backend {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host            $http_host;
        proxy_set_header   X-Forwarded-Proto $scheme;

        #后端程序地址
        proxy_pass http://127.0.0.1:8181;
    }
2.A机器没有的图片从B机器获得
server {

#访问图片文件,这里做解析
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
        root /img; #指定图片所在目录
        try_files $uri $uri/ @backend; #当图片不存在,会尝试交给@backend来获取图片
    }

    location @backend { #反向代理给图片服务器
        proxy_pass http://192.168.2.166; #图片服务器可以获取图片
    }
}