写点什么

nginx 配置系列(一)nginx 配置语法解读

作者:乌龟哥哥
  • 2022 年 4 月 28 日
  • 本文字数:4330 字

    阅读完需:约 14 分钟

nginx配置系列(一)nginx配置语法解读

一、nginx 的安装

安装就不说了......

二、nginx 的配置文件解释

2.1、快速入门

main(全局设置),main 部分设置的指令将影响其它所有部分的设置;


http(http 服务器设置),http 标准核心模块,http 服务的相应配置;


server(主机设置)


接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过创建虚拟主机(server)的概念来将这些不同的服务配置隔离。


location(URL 匹配特定位置后的设置)


location 部分用于匹配网页位置(比如,根目录“/”,“/images”,等等),server 是对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。


下面附一张 nginx 配置文件详解示例图:



上图中只是把一些常见的配置做了解释,当然了,nginx 还有更多的配置指令。。


在上一份儿 nginx.conf 文件大部分指令有注释的,如下:


#运行用户``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参数详细说明如下:``  ``#http是一种无状态协议,客户端向服务器发送一个 TCP 请求,服务端响应完毕后断开连接。如果客户端向服务器发送多个请求,每个请求都要建立各自独立的连接以传输数据。``  ` `  ``#http有一个Keep-Alive模式,它告诉webserver在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。``  ``#Keep-Alive在一段时间内保持打开状态,它们会在这段时间内占用资源,占用过多就会影响性能。``  ``#Nginx使用keepalive_timeout来指定Keep-Alive的超时时间(timeout)。指定每个TCP连接最多可以保持多长时间。Nginx 的默认值是75秒,有些浏览器最多只保持60秒,所以可以设定为60秒。若将它设置为0,就禁止了keep-alive连接。``  ` `  ``keepalive_timeout 65; ``#65s(单位是:秒)。该参数是一个请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损耗,类似于数据库连接池。``  ``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;``    ``}` `  ``}``}
复制代码

2.2、详细解析

配置语法说明:


①、配置文件由指令与指令块构成


②、每条指令以;分号结尾,指令与参数间以空格符号分隔


③、指令块以{}大括号将多条指令组织在一起


④、使用 #符号添加注释,提高可读性


⑤、include 语句允许组合多个配置文件以提升可维护性


⑥、使用 $符号使用变量


⑦、部分指令的参数支持正则表达式


Nginx 的各种指令以及配置繁多,该系列博文会记录一些 nginx 常用配置,后期会说一些优化配置,有些配置可以在 https://tengine.taobao.org/nginx_docs/cn/docs/ 或者在 http://www.nginx.cn 或者在 官方文档上查看


配置块: server


由于 IP 地址的数量有限,因此经常存在多个主机域名对应着同一个 IP 地址的情况,这时在 nginx.conf 中就可以按照 server_name(对应用户请求中的主机域名)并通过 server 块来定义虚拟主机,每个 server 块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样,一台服务器上的 Nginx 就能以不同的方式处理访问不同主机域名的 HTTP 请求了


语法:


语法: server_name name[...];


默认: server_name"";


配置块: server


虚拟主机名可以使用确切的名字,通配符,或者是正则表达式来定义,在开始处理一个 HTTP 请求时,Nginx 会取出 request header 头(请求头)中的 Host,与每个 server 中的 server_name 进行匹配,以此决定到底由哪一个 server 块来处理这个请求。有可能一个 Host 与多个 server 块中的 server_name 都匹配,这时就会根据匹配优先级来选择实际处理的 server 块。


注意:优先级问题,所导致的配置不生效。


server_name 与 Host 的匹配优先级如下:


1)首先选择所有字符串完全匹配的 server_name,如 nginx.2367.com 。


2)其次选择通配符在前面的 server_name,如 *.2367.com。


3)再次选择通配符在后面的 server_name,如 nginx.2367.* 。


4)最后选择使用正则表达式才匹配的 server_name,如 ~^.testweb.com$


如果都不匹配


1)、优先选择 listen 配置项后有 default 或 default_server 的


2)、找到匹配 listen 端口的第一个 server 块


配置块: location


location


语法: location[=|~|~*|^~|@]/uri/{...}


location 会尝试根据用户请求中的 URI 来匹配上面的/uri 表达式,如果可以匹配,就选择。


location{} 块中的配置来处理用户请求。当然,匹配方式是多样的,下面说一下 location 的匹配规则。


location 表达式类型:


~ 表示执行一个正则匹配,区分大小写;


~* 表示执行一个正则匹配,不区分大小写;


^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它的 location;


= 进行普通字符精确匹配。也就是完全匹配;


@ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files;


location 表达式类型的优先级:


等号类型(=)的优先级最高。一旦匹配成功,则不再查找其它匹配项;


前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个 location 匹配的话,则使用表达式最长的那个;


正则表达式类型(~ ~*)的优先级次之。一旦匹配成功,则不再查找其它匹配项;


常规字符串匹配,如果有多个 location 匹配的话,则使用表达式最长的那个;


优先级总结来说:(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径)


文件路径的定义:


以 root 方式设置资源路径:


语法: root path;


配置块: http、server、location、if


以 alias 方式设置资源路径:


语法: alias path;


配置块: location


alias 也是用来设置文件资源路径的,它与 root 的不同点主要在于如何解读紧跟 location 后面的 uri 参数


注意: location 中使用 root 指令和 alias 指令的意义不同


(a) root,相当于追加在 root 目录后面 。比如访问的是 xxx/test=>/www/test


(b) alias,相当于对 location 中的 uri 进行替换,比如访问的是 xxx/test,想要访问到/www/test 就必须设置 alias /www/test

三、nginx 常用命令

3.1、查看 Nginx 的版本号:nginx -V


3.2、停止 nginx -s stop


3.3、退出 nginx -s quit


3.4、重启加载配置 nginx -s reload


3.5、配置文件启动 nginx -c </path/to/config> 为 Nginx 指定一个配置文件


3.6、nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

四、nginx 常用模块了解及使用


发布于: 刚刚阅读数: 3
用户头像

乌龟哥哥

关注

正在努力寻找offer的大四小菜鸟 2021.03.16 加入

擅长 Hbuilder、VS Code、MyEclipse、AppServ、PS 等软件的安装与卸载 精通 Html、CSS、JavaScript、jQuery、Java 等单词的拼写 熟悉 Windows、Linux、 等系统的开关机 看–时间过得多快,不说了,去搬砖了

评论

发布
暂无评论
nginx配置系列(一)nginx配置语法解读_4月月更_乌龟哥哥_InfoQ写作社区