nginx的配置文件结构如下

[root@myserver_2 conf]# egrep -v '#|^$' nginx.conf 
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@myserver_2 conf]# 

结构模块分为下面几类

http {
	
	...
	...
	
	server {
		...
		...
		
		location ... {
				...
				...
		}
		
	}

	server {
		...
		...
	}
	

}

从上述语法配置示例可以看出,上述示例可以分为几个逻辑部分,http部分、server部分、location部分,或者说,上述示例可以分为几个逻辑块,http块、server块、location块,聪明如你一定看出来了,每个"配置块"都是使用大括号"{  }"作为分界线的,而且,从缩进可以看出,它们是有层级关系的,http中可以配置多个server,一个server中可以配置多个location,我们知道,nginx最基础的功能就是用来提供http服务,所以,跟http有关的公共配置,可以放置在http块中,http块中又可以配置多个server,那么server代表了什么呢?我们在一台主机中安装了nginx,那么能不能让这台nginx主机同时提供多个web服务呢?答案是肯定的,每一个server就代表一个http服务,我们可以同时配置多个server,以便同时提供多个http服务,不同的server可以使用不同的配置,写入到某个server块中的配置只对对应的http服务生效,如果多个server存在共同的公用配置,则可以将共同的配置写在http块中,以便多个server共享这些配置,一个server块中又可以有一个或多个location,location又是什么意思呢?当我们访问一个网络上的资源时,都是通过url访问的,你可以把location当做url的一部分。

nginx.conf中包含了我们最常用到的配置块:http块、server块和location块,当然,nginx中不止有这三种块,还有一些其他的块,比如events块、stream块等,示例中的nginx.conf中有一些配置不在任何"块"中,而是放在了nginx.conf文件的最顶部,比如"worker_processes"配置项,它没有配置到任何一个块中,而是配置的到了这些"块"之外的最上方,你可以把最上方这一片区域理解成"全局配置区"或者"主配置区",暂且把这片区域称之为"main"配置区,"main"配置区不属于任何一个块。

nginx.conf中看到各种各样的配置项,比如刚才提到的"worker_processes",以及示例文件中看到的"include"、"listen"等,我们可以把这些配置项称之为"配置指令",而配置指令后面通常会跟随一个或多个"值",我们也可以称这些"值"为"配置参数",一个配置指令通常会跟随一个或多个配置参数,想要正确的配置这些指令,最好先理解这些指令对应的功能,每个指令都是以分号结尾的,分号代表了指令的配置结束,每添加一个配置指令,都不要忘记加分号,否则会因为配置语法错误,而导致无法正常启动nginx,为了清晰明了,方便查看,通常每个指令单独配置在一行中,你也可以将多个指令配置在一行中,每个指令用分号隔开

块的基本结构就是大括号"{ }",每个块后面都有一对大括号,"{"代表块配置的开始,"}"代表块配置的结束,而"块"和"配置指令"是有一定的对应关系的,比如,某些配置指令只能在http块中配置,某些配置指令只能在server块中配置,某些配置指令只能在location块中配置,有些配置指令既能在server块中配置又能在http块中配置,而有些配置指令只能在main区中进行配置,比如刚才提到的"worker_processes"配置项,就只能在main区中配置,不能配置在块中,了解具体的可以参考官网http://nginx.org/en/docs/

我访问"http://192.168.1.39/"这个网址时,默认会访问到nginx服务器上的/nginx/html/index.html文件,之所以会访问到这个文件,是由下面这段配置决定的:

 server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }

location可以理解成url的一部分,那么当我们访问"http://192.168.1.39/"这个url时,这个url的最后一个"/"其实就是上图中的"location /",上图中红线标记出的"/"其实对应的就是"http://192.168.1.39/"这个url的最后一个"/",这个location块中有两条配置指令,它们分别是root和index。root配置指令的意思是:当前location所对应的文档根目录是哪里,"root html;"  表示当前location的文档根目录是html目录,那么"文档根目录"又是什么意思呢?说白了,文档根目录的意思就是当有人访问"/"这个路径时,去服务器的哪个目录中找对应的资源,举个例子,如果我在html目录中放了一张图片,图片名为a.jpg,那么我就能通过"http://192.168.1.39/a.jpg"访问到这张图片,url中的"/"对应了"location /"配置段,而"location /"又对应到了服务器的html目录,所以,url中的"/"就与服务器的html目录建立了对应关系,当我们访问"http://192.168.1.39/a.jpg"这个地址时,其实访问的是服务器上html目录中的a.jpg,再换句话说,html目录就是当前location的资源目录。注意,上例中的html路径是一个相对路径,表示nginx安装目录中的html目录,因为我将nginx安装到了/nginx目录中,所以上例中的html目录的绝对路径就是"/nginx/html/",你可以在"/nginx/html/"目录中放一张a.jpg图片,然后尝试使用"http://192.168.1.39/a.jpg"这个地址访问它,其实,要想完全搞明白location还是要费一番口舌的,不要怕,后面会有专门总结location的文章。index指令表示当没有指明任何资源时,默认访问哪个资源,什么意思呢?仍然拿刚才的url作为示例,当我们访问"http://192.168.1.39/a.jpg"这个地址时,nginx知道我们想要获取a.jpg这张图片资源,但是如果我们直接访问"http://192.168.1.39/"这个地址,没有指明我们想要获取什么,那么nginx会默认去把index.html或者index.htm返回给我们,原因就是上图中配置的"index  index.html index.htm;"起的作用。

官方yum源安装nginx后,默认的"server块"会配置在"/etc/nginx/conf.d/default.conf"文件中,换句话说就是,如果你通过官方yum源安装了nginx,那么你在/etc/nginx/nginx.conf文件中无法找到默认提供的server块,只能在/etc/nginx/conf.d/default.conf文件中找到默认的server块,这是为什么呢?其实,我们从/etc/nginx/nginx.conf文件中就能找到答案,打开/etc/nginx/nginx.conf文件,查看默认的http块的配置

include指令表示将指定的文件中的内容包含到当前位置中,举个例子,如果我在http配置块中的第10行设置了"include  test.conf;"指令,那么test.conf文件中的所有内容都会替换到http配置块的第10行,换句话说就是,虽然文本内容写在test.conf文件中,但是通过include指令替换后,相当于test.conf中的文本写在了http块中的第10行

"include /etc/nginx/conf.d/*.conf;"这条指令的作用就是将"/etc/nginx/conf.d/*.conf"文件中的内容替换到当前指令所在的位置,由于使用了"*"作为通配符,所以/etc/nginx/conf.d/目录中所有以".conf"作为后缀名的文件都会被匹配到,/etc/nginx/conf.d/default.conf文件自然也会被匹配到,所以最终,http块中include指令所在位置的文本内容会被替换成/etc/nginx/conf.d/default.conf文件中的内容,而/etc/nginx/conf.d/default.conf文件中的内容恰好是默认提供的server块配置,当然,如果你在/etc/nginx/conf.d/目录中放了一些其他以".conf"结尾的文本文件,那么这些文件中的内容也会因为刚才的include指令而被包含到nginx.conf文件中。

通过官方yum源安装nginx后,虽然/etc/nginx/nginx.conf文件中看不到默认server块的配置,但是并不代表没有提供默认的server块配置,只是通过include指令的方式,将默认server块的配置单独放置在了/etc/nginx/conf.d/default.conf文件中,最终效果与直接将server块配置写入到http块中无异。其实,即使是通过编译安装的方式安装的nginx,也可以借鉴这种配置方式,当我们配置了多个server块时,可以将各个server块分别提取出来,单独放置到一个配置文件中,然后再使用include指令引用对应的配置文件,这样就能从逻辑上将各个server块的配置隔离到不同的配置文件中,结构上更加分明,也方便我们进行配置管理.

中文解释各个配置参数

#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes  1;
 
#全局错误日志及PID文件
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
#工作模式及连接数上限
events {
    #epoll是多路复用IO(I/O Multiplexing)中的一种方式,
    #仅用于linux2.6以上内核,可以大大提高nginx的性能
    use   epoll; 
 
    #单个后台worker process进程的最大并发链接数    
    worker_connections  1024;
 
    # 并发总数是 worker_processes 和 worker_connections 的乘积
    # 即 max_clients = worker_processes * worker_connections
    # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4  为什么
    # 为什么上面反向代理要除以4,应该说是一个经验值
    # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
    # worker_connections 值的设置跟物理内存大小有关
    # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
    # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
    # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
    # $ cat /proc/sys/fs/file-max
    # 输出 34336
    # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
    # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
    # 使得并发总数小于操作系统可以打开的最大文件数目
    # 其实质也就是根据主机的物理CPU和内存进行配置
    # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
    # ulimit -SHn 65535
 
}
 
 
http {
    #设定mime类型,类型由mime.type文件定义
    include    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  logs/access.log  main;
 
    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
    #对于普通应用,必须设为 on,
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
    #以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile     on;
    #tcp_nopush     on;
 
    #连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay     on;
 
    #开启gzip压缩
    gzip  on;
    gzip_disable "MSIE [1-6].";
 
    #设定请求缓冲
    client_header_buffer_size    128k;
    large_client_header_buffers  4 128k;
 
 
    #设定虚拟主机配置
    server {
        #侦听80端口
        listen    80;
        #定义使用 www.nginx.cn访问
        server_name  www.nginx.cn;
 
        #定义服务器的默认网站根目录位置
        root html;
 
        #设定本虚拟主机的访问日志
        access_log  logs/nginx.access.log  main;
 
        #默认请求
        location / {
            
            #定义首页索引文件的名称
            index index.php index.html index.htm;   
 
        }
 
        # 定义错误提示页面
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
        }
 
        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            
            #过期30天,静态文件不怎么更新,过期可以设大一点,
            #如果频繁更新,则可以设置得小一点。
            expires 30d;
        }
 
        #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
        location ~ .php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
 
        #禁止访问 .htxxx 文件
            location ~ /.ht {
            deny all;
        }
 
    }
}

模块指令测试

[root@myserver_2 conf]# egrep -v '#|^$' nginx.conf 
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /test {
            root   /opt;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@myserver_2 conf]# cat /opt/test/index.html 
<h1>1212121212</h1>
[root@myserver_2 conf]# 

location块匹配的url为"/test",root指令的路径为"/opt",那么,根据上述配置,当我们访问"/test"这个url时,实际上访问的到底是服务器中的哪个路径呢?答案是"/opt/test/"路径,怎么得到这个答案呢?方法很简单,我们只需要将location中的url添加到root指令对应的路径后面,即可得到最终的服务器路径,具体方法如下图所示:

root指令会将location块的"url路径"带入到"root指令路径"中,将带入后的路径作为"最终路径",使用"最终路径"与url建立对应关系。

alias指令则直接将location块的"url路径"与"alias指令路径"建立对应关系。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐