Nginx 核心配置详解
配置文件说明
nginx官方帮助文档
tengine帮助文档(淘宝对nginx二开之后开源的产品)
Nginx的配置文件的组成部分:
主配置文件:nginx.conf
子配置文件: include conf.d/*.conf
fastcgi, uwsgi,scgi 等协议相关的配置文件
mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。MIME参考文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types
nginx 配置文件格式说明
配置文件由指令与指令块构成 每条指令以;分号结尾,指令与值之间以空格符号分隔 可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐 指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块 include语句允许组合多个配置文件以提升可维护性 使用#符号添加注释,提高可读性 使用$符号使用变量 部分指令的参数支持正则表达式
Nginx 主配置文件的配置指令方式:
directive value [value2 ...]; 注意 (1) 指令必须以分号结尾 (2) 支持使用配置变量 内建变量:由Nginx模块引入,可直接引用 自定义变量:由用户使用set命令定义,格式: set variable_name value; 引用变量:$variable_name
主配置文件结构:四部分
main block:主配置段,即全局配置段,对http,mail都有效 #事件驱动相关的配置 event { ... } #http/https 协议相关配置段 http { ... } #默认配置文件不包括下面两个块 #mail 协议相关配置段 mail { ... } #stream 服务器相关配置段 stream { ... }
默认的nginx.conf 配置文件格式说明
#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路径,日志路径等。 user nginx nginx; worker_processes 1; #启动工作进程数数量 events { #events设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。 worker_connections 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为worker_connections * worker_processes,作为反向代理的时候为(worker_connections * worker_processes)/2 } http { #http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,http块可以包含多个server块,而一个server块中又可以包含多个location块,server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等。 include mime.types; default_type application/octet-stream; sendfile on; #作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用sendfile系统调用来传输文件,sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈。 keepalive_timeout 65; #长连接超时时间,单位是秒 server { #设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块。比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口,比如都使用80端口提供web服务、 listen 80; #配置server监听的端口 server_name localhost; #本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配。 location / { #location其实是server的一个指令,为nginx服务器提供比较多而且灵活的指令,都是在location中体现的,主要是基于nginx接受到的请求字符串,对用户请求的UIL进行匹配,并对特定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的配置也是在location模块中配置。 root html; #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路径配置。 index index.html index.htm; #默认的页面文件名称 } error_page 500 502 503 504 /50x.html; #错误页面的文件名称 location = /50x.html { #location处理对应的不同错误码的页面定义到/50x.html,这个跟对应其server中定义的目录下。 root html; #定义默认页面所在的目录 } } #和邮件相关的配置 #mail { # ... # } mail 协议相关配置段 #tcp代理配置,1.9版本以上支持 #stream { # ... # } stream 服务器相关配置段 #导入其他路径的配置文件 #include /apps/nginx/conf.d/*.conf }
全局配置
Main 全局配置段常见的配置指令分类
正常运行必备的配置
优化性能相关的配置
用于调试及定位问题相关的配置
事件驱动相关的配置
user nginx nginx; #启动Nginx工作进程的用户和组 worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同 worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ; #将Nginx工作进程绑 定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。 CPU MASK: 00000001:0号CPU 00000010:1号CPU #示例: worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU worker_cpu_affinity 0101 1010; #示例 worker_processes 4; worker_cpu_affinity 00000010 00001000 00100000 10000000; [root@kibana ~]# ps axo pid,cmd,psr | grep nginx |grep -v grep 57457 nginx: master process /usr/ 3 57458 nginx: worker process 1 57459 nginx: worker process 3 57460 nginx: worker process 3 57461 nginx: worker process 2
http 配置块
http 协议相关的配置结构
http { ... ... #各server的公共配置 server { #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器 ... } server { ... server_name #虚拟主机名 root #主目录 alias #路径别名 location [OPERATOR] URL { #指定URL的特性 ... if CONDITION { ... } } } }
http 协议配置说明
http { include mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录 default_type application/octet-stream; #除mime.types中文件类型外,设置其它文件默认类型,访问其它类型时会提示下载不匹配的类型文件 #日志配置部分 #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 on; #tcp_nopush on; #在开启了sendfile的情况下,合并请求后统一发送给客户端,必须开启sendfile #tcp_nodelay off; #在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户响应报文。 #keepalive_timeout 0; keepalive_timeout 65 65; #设置会话保持时间,第二个值为响应首部:keepalived:timeout=65,可以和第一个值不同 #gzip on; #开启文件压缩 server { listen 80; #设置监听地址和端口 server_name localhost; #设置server name,可以以空格隔开写多个并支持正则表达式,如:*.xiaohu.com www.xiaohu.* ~^www\d+\.magedu\.com$ default_server #charset koi8-r; #设置编码格式,默认是俄语格式,建议改为utf-8 #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; #定义错误页面 location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { #以http的方式转发php请求到指定web服务器 # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { #以fastcgi的方式转发php请求到php处理 # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { #拒绝web形式访问指定文件,如很多的网站都是通过.htaccess文件来改变自己的重定向等功能。 # deny all; #} location ~ /passwd.html { deny all; } } # another virtual host using mix of IP-, name-, and port-based configuration # #server { #自定义虚拟server # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; #指定默认网页文件,此指令由ngx_http_index_module模块提供 # } #} # HTTPS server # #server { #https服务器配置 # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #}
MIME
#在响应报文中将指定的文件扩展名映射至MIME对应的类型 include /etc/nginx/mime.types; default_type application/octet-stream;#除mime.types中的类型外,指定其它文件的默认 MIME类型,浏览器一般会提示下载 types { text/html html; image/gif gif; image/jpeg jpg; } #MIME参考文档: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types
举个例子
[root@kibana ~]# cat <<EOF >> /usr/share/nginx/html/test.php <?php phpinfo(); ?> EOF [root@kibana ~]# grep -B 1 default_type /etc/nginx/nginx.conf include /etc/nginx/mime.types; default_type application/octet-stream; [root@kibana ~]# curl localhost/test.php -I HTTP/1.1 200 OK Server: nginx/1.20.1 Date: Wed, 17 May 2023 03:35:53 GMT Content-Type: application/octet-stream # 识别到的文件内容 Content-Length: 20 Last-Modified: Wed, 17 May 2023 03:35:22 GMT Connection: keep-alive ETag: "64644b7a-14" Accept-Ranges: bytes 修改default_type [root@kibana ~]# grep -B 1 default_type /etc/nginx/nginx.conf include /etc/nginx/mime.types; default_type text/png/html; [root@kibana ~]# curl localhost/test.php -I HTTP/1.1 200 OK Server: nginx/1.20.1 Date: Wed, 17 May 2023 03:42:04 GMT Content-Type: text/png/html # 换成修改后的了 Content-Length: 20 Last-Modified: Wed, 17 May 2023 03:35:22 GMT Connection: keep-alive ETag: "64644b7a-14" Accept-Ranges: bytes
指定响应报文server首部
#是否在响应报文中的Content-Type显示指定的字符集,默认off不显示 charset charset | off; #示例 charset utf-8; #是否在响应报文的Server首部显示nginx版本 server_tokens on | off | build | string;
修改server字段
如果想自定义响应报文的nginx版本信息,需要修改源码文件,重新编译 如果server_tokens on,修改 src/core/nginx.h 修改第13-14行,如下示例 #define NGINX_VERSION "1.68.9" #define NGINX_VER "wanginx/" NGINX_VERSION 如果server_tokens off,修改 src/http/ngx_http_header_filter_module.c 第49行,如下示例: static char ngx_http_server_string[] = "Server: nginx" CRLF; 把其中的nginx改为自己想要的文字即可,如:mynginx # 我这边直接yum安装的就不演示了,编译完成之后再curl效果大概如下 [root@centos7 ~]#curl -I localhost HTTP/1.1 200 OK Server: mynginx/1.68.9 # server名字变了 Date: Thu, 24 Sep 2020 07:44:05 GMT Content-Type: text/html Content-Length: 8 Last-Modified: Wed, 23 Sep 2020 14:39:21 GMT Connection: keep-alive ETag: "5f6b5e19-8" Accept-Ranges: bytes
隐藏version
[root@kibana ~]# grep server_tokens /etc/nginx/nginx.conf server_tokens off; # 效果如下 [root@kibana ~]# curl localhost -I HTTP/1.1 200 OK Server: nginx # 版本信息不显示 Date: Wed, 17 May 2023 03:52:54 GMT Content-Type: text/html Content-Length: 4833 Last-Modified: Fri, 16 May 2014 15:12:48 GMT Connection: keep-alive ETag: "53762af0-12e1"
核心配置示例
基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块ngx_http_core_module实现。
创建一个新虚拟服务器
[root@kibana ~]# grep include /etc/nginx/nginx.conf include /usr/share/nginx/modules/*.conf; include /etc/nginx/mime.types; # See http://nginx.org/en/docs/ngx_core_module.html#include include /etc/nginx/conf.d/*.conf; # 先确定http下面有这行,否则会不生效 include /etc/nginx/default.d/*.conf; [root@kibana ~]# cat > /etc/nginx/conf.d/mynginx.conf <<EOF server { listen 80; server_name mynginx.org; location / { root /code/ ; index index.html index.htm; } } EOF [root@kibana ~]# mkdir /code [root@kibana ~]# echo "test page" >> /code/index.html [root@kibana ~]# systemctl restart nginx.service [root@kibana ~]# curl -H mynginx.org 10.10.21.20 test page
root 与 alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
[root@kibana ~]# cat > /etc/nginx/conf.d/mynginx.conf <<EOF server { listen 80; server_name mynginx; location / { root /code; } location /newpage { root /code ; index index.html index.htm; } } EOF [root@kibana ~]# mkdir /code/newpage/ [root@kibana ~]# cat > /code/newpage/index.htm <<EOF new page EOF [root@kibana ~]# curl -H mynginx.org 127.0.0.1 test page [root@kibana ~]# curl -H mynginx.org 127.0.0.1/newpage <html> <head><title>301 Moved Permanently</title></head> <body> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx</center> </body> </html> [root@kibana ~]# curl -L -H mynginx.org 127.0.0.1/newpage # 可以看到已经读到了路径拼接之后的页面 new page
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于location上下文,此指令使用较少
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location / { root /code; } location /newpage { #注意newpage后不要加/ , 使用alias的时候uri后面如果加了斜杠,则下面的路径配置必须加斜杠,否则403 alias /opt/html ; #当访问newpage的时候,会显示alias定义的/opt/html/里面的内容。 index index.html index.htm; } } [root@kibana ~]# mkdir /opt/html [root@kibana ~]# echo "alias page" > /opt/html/index.html # 实际上是不存在newpage的页面的 [root@kibana ~]# systemctl reload nginx [root@kibana ~]# curl -L -H mynginx.org 127.0.0.1/newpage alias page
注意:location中使用root指令和alias指令的意义不同
root 给定的路径对应于location中的/uri 左侧的/
alias 给定的路径对应于location中的/uri 的完整路径
location 的详细使用
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,而后应用其配置
在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
#语法规则: location [ = | ~ | ~* | ^~ ] uri { ... } = #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请 求 ^~ #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对uri的最左边部分做匹配 检查,不区分字符大小写 ~ #用于标准uri前,表示包含正则表达式,并且区分大小写 ~* #用于标准uri前,表示包含正则表达式,并且不区分大写 不带符号 #匹配起始于此uri的所有的uri \ #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号 #匹配优先级从高到低: =, ^~, ~/~*, 不带符号
官方范例如下
location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] } The “/” request will match configuration A(?), the “/index.html” request will match configuration B, the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E.
下面我们来测试一下
匹配案例-精确匹配
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location / { root /code; index index.html index.htm; } location = /my.jpg { root /opt/html; index index.html index.htm; } } [root@kibana ~]# curl -L -H mynginx.org 127.0.0.1/my.jpg # 加后缀精准匹配到 opt下的页面了 opt page [root@kibana ~]# curl -L -H mynginx.org 127.0.0.1/ # 不加匹配到code页面
匹配案例-区分大小写
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location ~ /txt { root /opt/html; index index.html index.htm; } } [root@kibana ~]# echo 'txt' > /opt/html/txt [root@kibana ~]# echo 'TXT' > /opt/html/TXT [root@kibana ~]# curl -L -H mynginx.org 127.0.0.1/txt txt [root@kibana ~]# curl -L -H mynginx.org 127.0.0.1/TXT # 可以看到大写的直接显示404 <html> <head><title>404 Not Found</title></head> <body> <center><h1>404 Not Found</h1></center> <hr><center>nginx</center> </body> </html>
匹配案例-不区分大小写
# 然后我们换成 ~* [root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location ~* /txt { root /opt/html; index index.html index.htm; } } [root@kibana ~]# systemctl reload nginx [root@kibana ~]# curl -L -H mynginx.org 127.0.0.1/TXT TXT [root@kibana ~]# curl -L -H mynginx.org 127.0.0.1/txt txt
匹配案例-URI开始
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location ^~ /html/ { root /opt/; index index.html index.htm; } location / { root /code; index index.html index.htm; } } [root@kibana ~]# curl -Hmynginx.org 127.0.0.1/html/ -L my opt page
匹配案例-文件名后缀
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location ~* \.(png|jpg|ico)$ { root /opt/png ; } location / { root /code; index index.html index.htm; } } [root@kibana ~]# mkdir /opt/png [root@kibana ~]# echo "this is a png file" > /opt/png/1.png [root@kibana ~]# systemctl reload nginx [root@kibana ~]# curl -Hmynginx.org 127.0.0.1/1.png # 并没有去 /code下面寻找 this is a png file
匹配案例-优先级
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location ~* \.(png|jpg|ico)$ { root /opt/png1 ; } location = /1.png { root /opt/png2/; index index.html index.htm; } location /1.png { root /opt/png3; index index.html index.htm; } } [root@kibana ~]# mkdir /opt/png{1..3} [root@kibana ~]# echo "png1" > /opt/png1/1.png [root@kibana ~]# echo "png2" > /opt/png2/1.png [root@kibana ~]# echo "png3" > /opt/png3/1.png [root@kibana ~]# systemctl restart nginx [root@kibana ~]# curl -Hmynginx.org 127.0.0.1/1.png png2 [root@kibana ~]# vim /etc/nginx/conf.d/mynginx.conf # 这一步将png2注释 [root@kibana ~]# systemctl restart nginx [root@kibana ~]# curl -Hmynginx.org 127.0.0.1/1.png png1 [root@kibana ~]# vim /etc/nginx/conf.d/mynginx.conf # 这一步将pn3注释 [root@kibana ~]# systemctl restart nginx [root@kibana ~]# curl -Hmynginx.org 127.0.0.1/1.png png3
建议配置
#直接匹配网站根会加速Nginx访问处理 location = /index.html { ......; } location / { ......; } #静态资源配置方法1 location ^~ /static/ { ......; } #静态资源配置方法2,应用较多 location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { ......; } #多应用配置 location ~* /app1 { ......; } location ~* /app2 { ......; }
Nginx 四层访问控制
访问控制基于模块ngx_http_access_module实现,可以通过匹配客户端源IP地址进行限制
注意: 如果能在防火墙设备控制,最好就不要在nginx上配置,可以更好的节约资源
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location = /login.html { root /opt/; } location /1.png { root /opt/png3; index index.html index.htm; } } [root@kibana ~]# echo "login secssful" > /opt/login.html [root@kibana ~]# curl -H mynginx.org 127.0.0.1/login.html login secssful # 然后加上deny [root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location = /login.html { root /opt/; deny all; } location /1.png { root /opt/png3; index index.html index.htm; } } [root@kibana ~]# curl -H mynginx.org 127.0.0.1/login.html # 此时报403 <html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx</center> </body> </html> # 然后加上allow [root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location = /login.html { root /opt/; allow 127.0.0.1; deny all; } location /1.png { root /opt/png3; index index.html index.htm; } } [root@kibana ~]# curl -H mynginx.org 127.0.0.1/login.html # 就又可以访问,但是其他节点任然访问不了 login secssful # 最好先allow 再deny
Nginx 账户认证功能
由 ngx_http_auth_basic_module 模块提供此功能
[root@kibana ~]# yum -y install httpd-tools # ubunt下安装 apache2-utils [root@kibana ~]# htpasswd -cb /code/.nginxpasswd admin 666 # -b 非交互式方式提交密码 Adding password for user admin [root@kibana ~]# tail /code/.nginxpasswd admin:$apr1$dEf2hf5D$TT4vOk1QaGtJ.hBm/EfvD0 # 密码已经被加密了 [root@kibana ~]# vim /etc/nginx/conf.d/mynginx.conf [root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location = /login.html { root /opt/; auth_basic "login password"; # 开启功能 auth_basic_user_file /code/.nginxpasswd; # 指定密码文件路径 } } [root@kibana ~]# systemctl reload nginx [root@kibana ~]# curl -H mynginx.org 127.0.0.1/login.html # 直接访问报401,如果浏览器访问会提示输入账号密码 <html> <head><title>401 Authorization Required</title></head> <body> <center><h1>401 Authorization Required</h1></center> <hr><center>nginx</center> </body> </html> [root@kibana ~]# curl -H mynginx.org -u admin:666 127.0.0.1/login.html # 两种方式都能携带账号密码curl login secssful [root@kibana ~]# curl -H mynginx.org http://admin:666@127.0.0.1/login.html login secssful
自定义错误页面
listen 80; server_name mynginx.org; error_page 500 502 503 504 /error.html; location = /error.html { root /code/html; } #重启nginx并访问不存在的页面进行测试 error_page 404 /40x.html; location = /40x.html { root /code/html/ ; }
除此之外,还可以在 404 时候返回首页
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; error_page 404 /index.html; location / { root /code/; } } [root@kibana ~]# curl -H mynginx.org 127.0.0.1/xxxxxxxxxxxxxx # 这个是不存在的 code page [root@kibana ~]# curl -H mynginx.org 127.0.0.1/ code page [root@kibana ~]# vim /etc/nginx/conf.d/mynginx.conf [root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; error_page 404 =302 /index.html; # 这种写法也可以 location / { root /code/; } } [root@kibana ~]# systemctl restart nginx [root@kibana ~]# curl -H mynginx.org 127.0.0.1/111111111 code page
自定义日志
自定义错误日志
Syntax: error_log file [level]; Default: error_log logs/error.log error; Context: main, http, mail, stream, server, location level: debug, info, notice, warn, error, crit, alert, emerg
为自己的应用单独定义日志路径
[root@kibana ~]# vim /etc/nginx/conf.d/mynginx.conf [root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; access_log /code/logs/mynginx_access.log; error_log /code/logs/mynginx_error.log; location / { root /code/; } } [root@kibana ~]# mkdir /code/logs [root@kibana ~]# systemctl reload nginx [root@kibana ~]# curl -H mynginx.org 127.0.0.1/111111111 <html> <head><title>404 Not Found</title></head> <body> <center><h1>404 Not Found</h1></center> <hr><center>nginx</center> </body> </html> [root@kibana ~]# curl -H mynginx.org 127.0.0.1/ code page [root@kibana ~]# tail /code/logs/mynginx_* ==> /code/logs/mynginx_access.log <== 127.0.0.1 - - [17/May/2023:16:52:50 +0800] "GET /111111111 HTTP/1.1" 404 146 "-" "curl/7.29.0" 127.0.0.1 - - [17/May/2023:16:52:54 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0" ==> /code/logs/mynginx_error.log <== 2023/05/17 16:52:50 [error] 106693#106693: *2 open() "/code/111111111" failed (2: No such file or directory), client: 127.0.0.1, server: mynginx, request: "GET /111111111 HTTP/1.1", host: "127.0.0.1"
设置默认页面
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
语法格式:
Syntax: try_files file ... uri; try_files file ... =code; Default: — Context: server, location
访问不存在uri时候返回自定义状态码
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location / { root /code; #try_files $uri $uri.html $uri/index.html /default.html; try_files $uri $uri.html $uri/index.html =488; } } [root@kibana ~]# systemctl restart nginx [root@kibana ~]# curl -H mynginx.org 127.0.0.1/1.html -I HTTP/1.1 488 Server: nginx Date: Wed, 17 May 2023 09:03:59 GMT Content-Length: 0 Connection: keep-alive
访问不存在uri时候返回默认页面
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; location / { root /code; try_files $uri $uri.html $uri/index.html /default.html; # 需要注意的是最后的uri如果也找不到会报404 #try_files $uri $uri.html $uri/index.html =488; } } [root@kibana ~]# systemctl restart nginx.service [root@kibana ~]# echo 'default page' > /code/default.html [root@kibana ~]# curl -H mynginx.org 127.0.0.1/1.html default page
长连接配置
keepalive_timeout timeout [header_timeout]; #设定保持连接超时时长,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置 keepalive_requests number; #在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500 # 如 keepalive_requests 3; keepalive_timeout 65 60; #开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断 开,第二个数字60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时 时间。 Keep-Alive:timeout=60 #浏览器收到的服务器返回的报文 #如果设置为0表示关闭会话保持功能,将如下显示: Connection:close #浏览器收到的服务器返回的报文
作为下载服务器配置
ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务配置使用
相关指令:
autoindex on | off;#自动文件索引功能,默为off autoindex_exact_size on | off; #计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on autoindex_localtime on | off ; #显示本机时间而非GMT(格林威治)时间,默认off autoindex_format html | xml | json | jsonp; #显示索引的页面文件风格,默认html limit_rate rate; #限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即 bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供 set $limit_rate 4k; #也可以通变量限速,单位B/s,同时设置,此项优级高.Rate limit can also be set in the $limit_rate variable, however, since version 1.17.0, this method is not recommended:
示例:
[root@kibana ~]# cat /etc/nginx/conf.d/mynginx.conf server { listen 80; server_name mynginx; root /code; location /download { autoindex on; # 启用自动首页功能 autoindex_format html; # 首页格式为HTML autoindex_exact_size on; # 计算文件大小(单位是bytes),此为默认值,off显示大概大小(单位是kb、mb、gb等) autoindex_localtime on; # on表示显示本机时间而非GMT时间(格林威治时间),默认是off,显示GMT时间 if ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){ # 当文件格式为上述格式时,将头字段属性Content-Disposition的值设置为"attachment" add_header Content-Disposition: 'attachment;'; } sendfile on; # 开启零复制文件传输功能,不需要将文件读至用户空间 sendfile_max_chunk 1m; # 每个sendfile调用的最大传输量为1MB tcp_nopush on; # 启用最小传输限制功能 # aio on; # 启用异步传输 directio 5m; # 当文件大于5MB时以直接读取磁盘的方式读取文件 directio_alignment 4096; # 与磁盘的文件系统对齐 output_buffers 4 32k; # 文件输出的缓冲区大小为128KB # limit_rate 1m; # 限制下载速度为1MB # limit_rate_after 2m; # 当客户端下载速度达到2MB时进入限速模式 max_ranges 4096; # 客户端执行范围读取的最大值是4096B send_timeout 20s; # 客户端引发传输超时时间为20s postpone_output 2048; # 当缓冲区的数据达到2048B时再向客户端发送 chunked_transfer_encoding on; # 启用分块传输标识 } } ps: sendfile on; 是 nginx 配置文件中的一个指令,用于启用或禁用 sendfile 功能,该功能可以提高服务器文件传输的性能。 当 sendfile 功能启用时,nginx 将使用操作系统提供的 sendfile 系统调用直接将文件发送给客户端,而不需要先将文件读入到用户空间后再发送。在传输大文件时可以显著提高传输速度,且占用的服务器资源也少。 当 sendfile 功能禁用时,nginx 会将文件内容读入到用户空间中,然后再发送到客户端。这会导致文件传输速度较慢,且占用的服务器资源也会更多。 因此,在生产环境中,建议启用 sendfile 功能以提高文件传输性能。在 nginx 的文档中也明确建议开启 sendfile。不过,在某些特定情况下,如网络文件系统等,sendfile 可能并不稳定,这时你可以尝试禁用 sendfile 来解决问题。 [root@kibana ~]# mkdir /code/download [root@kibana ~]# dd if=/dev/zero of=/code/download/test.txt bs=1M count=1024 [root@kibana ~]# systemctl restart nginx # 测试访问
作为上传服务器
client_max_body_size 1m; #设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误 client_body_buffer_size size; #用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置 client_body_temp_path path [level1 [level2 [level3]]]; #设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用 hash之后的值从后往前截取1位、2位、2位作为目录名
具体操作有点难,后面再学习