欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx配置文件介绍

程序员文章站 2022-06-11 16:17:44
...
server {

    listen       80;    

    server_name  local.api.baidu.com;

    access_log   /logs/local-api.baidu.com/access.log  main;
    error_log    /logs/local-api.baidu.com/error.log  ;

    root   "/data/www/api.baidu.com/init/";
    
    index index.html index.php;

     
    location / {
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php/$1 last;
        }
    }
    
    location ~ \.php(.*)$ {
        fastcgi_pass   127.0.0.1:9003;
        fastcgi_index  index.php;
        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
        include        fastcgi_params;
    }
}

这是一个常规的nginx的配置文件这里重点解说一下里面的关键词

listen:监听的端口 这里配置的是80,如果是https的请修改为443

server_name :访问的域名(正式环境写公网可以访问的域名,本地或者测试环境随便写)

access_log:记录nginx访问的日志地址,一般只能记录get请求的日志

error_log :顾名思义,错误日志文件地址

root:项目的地址

index:默认加载的文件名称

location:根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

具体的语法描述:

  location  [ = | ~ | ~* | ^~ ]     uri          { .... }
# | 指令    |     匹配标识      | 匹配的网站网址    |匹配URI之后要执行的配置段|

其中"="的优先级为最高,为精确匹配;特殊字符"~"和"~*"的区别在于前者区分大小写,后者不区分大小写。还可以用逻辑操作符"!"来取反匹配;"^~"的意思是匹配之后不做正则表达式的检查,就是不用匹配类似于"\.(gif|jpg|jpeg)$"的正则表达式了,也就是说"^~"后面跟了正则表达式也没有用的。

fastcgi_pass :指定FastCGI服务器监听端口与地址

                        配置方式1:fastcgi_pass 127.0.0.1:9003;

                        配置方式2:unix:/tmp/fastcgi.socket;

fastcgi_index  index.php; 如果请求的Fastcgi_index URI是以 / 结束的, 该指令设置的文件会被附加到URI的后面并保存在变量$fastcig_script_name中

fastcgi_split_path_info ^(.+\.php)(/.*)$;

fastcgi_param  PATH_INFO  $fastcgi_path_info;

这两句是什么意思呢?

nginx默认获取不到PATH_INFO的值,得通过fastcgi_split_path_info指定定义的正则表达式来获取值

^(.+\.php)(/.*)$; 这个正则表达是有两个小括号 , 也就是有两个捕获

第二个捕获到的值会自动重新赋值给$fastcgi_path_info变量。

第一个捕获的值会重新赋值给$fastcgi_script_name变量。

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

$document_root 和 $fastcgi_script_name 之间没有 /。原本Nginx只有「fastcgi_params」,后来发现很多人在定义「SCRIPT_FILENAME」时使用了硬编码的方式,于是为了规范用法便引入了「fastcgi.conf」。
这样就产生一个新的疑问:为什么一定要引入一个新的配置文件,而不是修改旧的配置文件?因为「fastcgi_param」指令是数组型的,和普通指令相同的是:内层替换外层;和普通指令不同的是:当在同级多次使用的时候,是新增而不是替换。
如果在同级定义两次「SCRIPT_FILENAME」,那么它们都会被发送到后端,这可能会导致一些潜在的问题,为了避免此类情况,便引入了一个新的配置文件。

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;#脚本文件请求的路径  
fastcgi_param  QUERY_STRING       $query_string; #请求的参数;如?app=123  
fastcgi_param  REQUEST_METHOD     $request_method; #请求的动作(GET,POST)  
fastcgi_param  CONTENT_TYPE       $content_type; #请求头中的Content-Type字段  
fastcgi_param  CONTENT_LENGTH     $content_length; #请求头中的Content-length字段。  
  
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; #脚本名称   
fastcgi_param  REQUEST_URI        $request_uri; #请求的地址不带参数  
fastcgi_param  DOCUMENT_URI       $document_uri; #与$uri相同。   
fastcgi_param  DOCUMENT_ROOT      $document_root; #网站的根目录。在server配置中root指令中指定的值   
fastcgi_param  SERVER_PROTOCOL    $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。    
  
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;#cgi 版本  
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;#nginx 版本号,可修改、隐藏  
  
fastcgi_param  REMOTE_ADDR        $remote_addr; #客户端IP  
fastcgi_param  REMOTE_PORT        $remote_port; #客户端端口  
fastcgi_param  SERVER_ADDR        $server_addr; #服务器IP地址  
fastcgi_param  SERVER_PORT        $server_port; #服务器端口  
fastcgi_param  SERVER_NAME        $server_name; #服务器名,域名在server配置中指定的server_name