nginx学习(核心配置详解)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: nginx学习(核心配置详解)

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
# 测试访问 

image-iqjm.png

作为上传服务器

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位作为目录名  

具体操作有点难,后面再学习

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
缓存 应用服务中间件 网络安全
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
107 7
|
11天前
|
存储 应用服务中间件 nginx
nginx反向代理bucket目录配置
该配置实现通过Nginx代理访问阿里云OSS存储桶中的图片资源。当用户访问代理域名下的图片URL(如 `http://代理域名/123.png`)时,Nginx会将请求转发到指定的OSS存储桶地址,并重写路径为 `/prod/files/2024/12/12/123.png`。
43 5
|
1月前
|
缓存 负载均衡 算法
如何配置Nginx反向代理以实现负载均衡?
如何配置Nginx反向代理以实现负载均衡?
|
1月前
|
存储 负载均衡 中间件
Nginx反向代理配置详解,图文全面总结,建议收藏
Nginx 是大型架构必备中间件,也是大厂喜欢考察的内容,必知必会。本篇全面详解 Nginx 反向代理及配置,建议收藏。
Nginx反向代理配置详解,图文全面总结,建议收藏
|
26天前
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
49 3
|
1月前
|
应用服务中间件 API nginx
nginx配置反向代理404问题
【10月更文挑战第18天】本文介绍了使用Nginx进行反向代理的配置方法,解决了404错误、跨域问题和302重定向问题。关键配置包括代理路径、请求头设置、跨域头添加以及端口转发设置。通过调整`proxy_set_header`和添加必要的HTTP头,实现了稳定的服务代理和跨域访问。
295 1
nginx配置反向代理404问题
|
1月前
|
负载均衡 监控 应用服务中间件
配置Nginx反向代理时如何指定后端服务器的权重?
配置Nginx反向代理时如何指定后端服务器的权重?
63 4
|
1月前
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
61 3
|
1月前
|
安全 应用服务中间件 网络安全
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
121 3
|
1月前
|
应用服务中间件 网络安全 nginx
轻松上手Nginx Proxy Manager:安装、配置与实战
Nginx Proxy Manager (NPM) 是一款基于 Nginx 的反向代理管理工具,提供直观的 Web 界面,方便用户配置和管理反向代理、SSL 证书等。本文档介绍了 NPM 的安装步骤,包括 Docker 和 Docker Compose 的安装、Docker Compose 文件的创建与配置、启动服务、访问 Web 管理界面、基本使用方法以及如何申请和配置 SSL 证书,帮助用户快速上手 NPM。
250 1