web中间件——Nginx

文章目录

Web服务选型

  • web服务,网站服务,应用:运行开发书写代码(处理后)

  • 中间件:

    • web中间件:web服务
    • 数据库中间件:缓存,数据库
web中间件选型 说明 官网
Nginx 目前使用最多的web服务器,使用简单,性能强 nginx
apache(httpd) 之前使用多,现在份额基本都被nginx或其他占用 Welcome! - The Apache HTTP Server Project
nginx二次开发版本 tengine(淘宝基于nginx二次开发版本)需要编译安装 The Tengine Web Server
nginx二次开发版本 openresty:nginx+lua模块,lua语言,给nginx增加语言功能 OpenResty® - 开源官方站
cady 新型web服务,性能高,golang写的 Caddy - 具有自动 HTTPS 功能的终极服务器
...
云厂商的web cloudflare web服务器
特定场景 tomcat(运行java代码) Apache Tomcat® - Welcome!
中间件说明
代码(网站代码)
服务 <== 中间件
系统
硬件

Nginx架构和安装

Nginx概述

Nginx(发音为"engine-x")是一款开源的高性能Web服务器和反向代理服务器。因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。

Nginx功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源
  • http/https协议的反向代理
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  • tcp/udp协议的请求转发(反向代理)
  • imap4/pop3协议的反向代理

基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile

web服务相关的功能

  • 虚拟主机(server)
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制重新配置和在线升级而无须中断客户的工作进程

Nginx架构和进程

Nginx架构

Nginx进程结构

web请求处理机制

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。

  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。

主进程(master process)的功能:

shell 复制代码
对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本

工作进程(worker process)的功能:

shell 复制代码
所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等

yum安装、编译安装Nginx

部署Nginx1.28(Kylinv10sp3、Ubuntu2204、Rocky9.3)_yum 安装nginx1.28-CSDN博客

nignx命令

shell 复制代码
nginx              # 启动
nginx  -V          # 查看当前版本及编译配置信息
nginx  -t          # 检查配置文件语法是否正确
nginx  -s  stop    # 直接关闭worker子进程
nginx  -s  quit    # 等待worker子进程正确处理完请求后关闭
nginx  -s  reload  # 重新读取配置文件

Nginx模块

nginx 模块 说明 指令
core 核心模块 常用指令都属于这个模块 listen,location ,root,server_name
access 模块 访问控制 allow,deny
log 模块 访问日志模块 access_log ,log_format
proxy 模块 传球,转发 (代理) proxy_pass,proxy_set_header优化选项proxy_buffer,proxy_cache
upstream 模块 创建分组,proxy+upstream 负载均衡. upstream,server
auth_basic_module 认证模块 auth_basic,auth_basic_user_file
autoindex 模块 目录索引功能,自建共享站点,yum 仓库 autoindex
fastcgi_module ngx 与 php 模块 fastcgi_pass fastcgi_param
geoip_module 定位模块,根据客户端 IP 可以进行定位.
gzip_module 优化选项,压缩,对页面资源进行压缩 gzip,...
limit_conn,limit_req 优化选项,limit 限制 (请求频率,网站处理频率)
stub_status_module nginx 状态 stub_status
ssl_module https
rewrite_module 后面实现 301,302 return,rewrite,if,set
http_v2_module http2.0 支持,https 配置后才能使用.
nginx_stream_xxx 模块 4 层协议

Nginx核心配置文件说明

nginx配置文件的组成部分

nginx配置 说明 配置建议
主配置文件 /etc/nginx/nginx.conf 避免配置文件内容过多。全局核心
子配置文件(如果有) include /etc/nginx/conf.d/*.conf 站点信息写到子配置文件
fastcgi、uwsgi、scgi /etc/nginx目录下 协议相关的配置文件
mime.types 支持的媒体类型 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Guides/MIME_types 参考文档

nginx配置文件格式说明

复制代码
配置文件由指令与指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
使用#符号添加注释,提高可读性
使用$符号使用变量
部分指令的参数支持正则表达式

nginx主配置文件的配置指令方式

shell 复制代码
directive value [value2 ...];

注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
 内建变量:由Nginx模块引入,可直接引用
 自定义变量:由用户使用set命令定义,格式: set variable_name value;
 引用变量:$variable_name
  • 主配置文件内容nginx.conf
shell 复制代码
[root@nginx nginx]# whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz
[root@nginx nginx]# ls /etc/nginx/
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
[root@nginx nginx]# cat /etc/nginx/nginx.conf 
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

主配置文件结构:三部分

全局配置

Main 全局配置段常见的配置指令分类

  • 正常运行必备的配置

  • 优化性能相关的配置

  • 用于调试及定位问题相关的配置

  • 事件驱动相关的配置

全局配置说明:

shell 复制代码
#指定,nginx所属用户(虚拟用户)工具人进程用户
user  nginx;
#启动nginx工作进程的数量,处理用户请求的进程,一般设为和CPU核心数相同
worker_processes  auto;
#nginx错误日志及位置
error_log  /var/log/nginx/error.log notice;
#pid文件
pid        /run/nginx.pid;

events块

events设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等

shell 复制代码
events {
    #nginx工作进程可以处理多少个连接(每个进程最大的连接数)
    worker_connections  1024;
}

http块

http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,http块可以包含多个server块,而一个server块中又可以包含多个locatio块,server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等

shell 复制代码
http {
    #引用媒体类型
    include       /etc/nginx/mime.types;
    #设置了默认的媒体类型
    default_type  application/octet-stream;
    #指定nginx访问日志格式,格式叫做main
    
#日志配置部分    
    #访问里面记录了什么内容(access.log)
    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  /var/log/nginx/access.log  main;
    
#自定义优化参数
    #提高nginx性能
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;  #长连接超时时间,单位秒
    #gzip  on
    ;
#调用子配置文件
	#文件包含或引用功能,用于在nginx配置文件中调取其他文件
	#引用nginx子配置文件
    include /etc/nginx/conf.d/*.conf;
}

server块

  • con.d/default.conf子配置文件(yum安装默认位置)
shell 复制代码
server 
{
    #指定监听的端口
    listen       80;
    #网站的域名(DNS->IP)
    server_name  localhost;
    
    #access_log  /var/log/nginx/host.access.log  main;
    #用于匹配用户请求的uri,location / 表示默认
    location / {
    #用于指定站点目录,网站的根目录,存放代码
        root   /usr/share/nginx/html;
    #指定首页文件,只输入域名的时候默认展示的页面
        index  index.html index.htm;
    }
	
    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    #用于指定出现500 502 503 504错误的时候显示/50x.html文件
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.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 {
    #    deny  all;
    #}
}

主配置文件内容nginx.conf

shell 复制代码
[root@nginx nginx]# whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz
[root@nginx nginx]# ls /etc/nginx/
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
[root@nginx nginx]# cat /etc/nginx/nginx.conf 
#指定nginx基本功能
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Nginx核心示例

  • windows,hosts解析-测试
  • dns解析-正式
域名 代码 站点目录
csqyouxi.xnfff.com bird.tar.gz /app/code/bird/
csqyouxi.xbw.com 小霸王游戏代码 /aap/code/xbw/
share.file.com 共享的目录 /app/code/share/

代码链接: https://pan.baidu.com/s/1nX4QKtziVKHX5TD97zQLBA?pwd=1111

部署小鸟飞飞飞站点

shell 复制代码
#创建站点文件
cat > /etc/nginx/conf.d/csqyouxi.xnfff.com.conf  <<EOF
server{
	listen 80;
	server_name csqyouxi.xnfff.com;
	root /app/code/bird/;
	location / {
		index index.html;
	}
}
EOF
#检查语法
nginx -t 
#创建站点目录
mkdir -p /app/code/bird/
#把代码解压到站点目录
tar -zxvf bird.tar.gz -C /app/code/bird/
#重启nginx
systemctl restart nginx
#命令访问
curl -H Host:csqyouxi.xnfff.com http://10.0.0.143

浏览器访问(配置windows的hosts解析)

部署小霸王游戏站点

shell 复制代码
#创建站点文件
cat > /etc/nginx/conf.d/csqyouxi.xbw.com.conf <<EOF
server{
   listen 80;
   server_name csqyouxi.xbw.com;
   root /app/code/xbw/;
   location / {
      index index.html;
	}
}
EOF

#检查语法
nginx -t 
#创建站点目录
mkdir -p /app/code/xbw/
#把代码解压到站点目录
unzip FC小霸王怀旧游戏机-HTML源码.zip  -d /app/code/xbw/
#重启nginx
systemctl restart nginx
#命令访问
curl -H Host:csqyouxi.xbw.com http://10.0.0.143

浏览器访问(配置windows的hosts解析)

作为下载服务器

ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务配置使用

官方文档:https://nginx.org/en/docs/http/ngx_http_autoindex_module.html

相关指令

shell 复制代码
#网站显示站点目录列表功能
autoindex on;
#关闭详细大小显示(单位bytes),显示人类可读大小(K、M)
autoindex_exact_size off;
#显示索引的页面文件风格,默认html
autoindex_format html | xml | json | jsonp;
#根据linux时间显示文件,否则相差8小时
autoindex_localtime on;
#字符集,用于支持中文,上面的小游戏之所以有中文是因为代码中定义了字符集
charset utf8;
#限制访问(注意顺序,deny all在最后,前面几行是放行的网段或IP)
allow 10.0.0.0/24
allow 172.16.1.0/24
deny all;

案例

  • 搭建公司内部使用的站点:共享文件

  • 要求:

    • 用户打开网站后,显示网站目录下的内容,而不是显示指定首页文件(首页文件不存在)
    • 使用8848端口
    • 网站现在只能局域网访问,网段限制(只开放给10.0.0.0/24,172.16.1.0/24)
  • 站点目录:/app/code/share/目录

  • 可以不用配置域名

配置过程

shell 复制代码
cat > /etc/nginx/conf.d/share.file.com.conf <<EOF
server {
      listen 8848;
      server_name share.file.com;
      root /app/code/share/;
      
      charset utf8;
      autoindex on;
      autoindex_exact_size off;
      autoindex_localtime on;
     
      allow 10.0.0.0/24;
      allow 172.16.1.0/24;
      deny  all; 
      location / {
	index index.html;
	}

}
EOF

#检查语法
nginx -t 
#创建站点目录
mkdir -p /app/code/xbw/
#将/etc/下的所有文件,复制到站点目录进行测试
cp -a /etc/* /app/code/share/
#重启nginx
systemctl restart nginx
#放行8848端口
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --reload
#命令访问
curl -H Host:share.file.com http://10.0.0.143:8848

浏览器访问(ip:端口)

作为上传服务器

相关指令

shell 复制代码
#设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误(http,location,server)
client_max_body_size 1M;

#用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时
#其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_buffer_size size; 

#设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,
#使用hash之后的值从后往前截取1位、2位、2位作为目录名
client_body_temp_path path [level1 [level2 [level3]]];

Nginx高级配置

Nginx状态页面

基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module,否则配置完成之后监测会是提示语法错误

注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态

shell 复制代码
cat  > /etc/nginx/conf.d/status.csq.xyz.conf<<EOF
server {
	listen 80;
	server_name status.csq.xyz;
	#可以将访问这个状态页面的日志定位到空
	#error_log /dev/null;
	#access_log /dev/null;
	location / {
	    #设置谁可以访问
		allow 172.16.1.0/24;
		deny all;
		#开启状态页
		stub_status on;
	}
}
EOF
#检查语法
nginx -t
#重新加载nginx
systemctl reload nginx

#返回403权限拒绝
[root@web01 ~]# curl -H Host:status.csq.xyz http://10.0.0.103
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.28.0</center>
</body>
</html>
#172网段能访问
[root@web01 ~]# curl -H Host:status.csq.xyz http://172.16.1.103
Active connections: 2 
server accepts handled requests
 10 10 108 
Reading: 0 Writing: 1 Waiting: 1 
nginx状态页输出内容 说明 如何计算的
Active connections 已经建立的连接数量。实时更新 reading+writing+waiting
server accepts 接收了多少请求总数。重启nginx后清空
handled 处理了多少请求总数。重启nginx后清空
requests 用户发出的请求数量总数。重启nginx后清空
reading读 正在读取多少各请求头数量。实时更新
writing写 正在发送多少各响应数量。实时更新
waiting 多少等待数量。实时更新 开启长连接的情况下这个值等于 active-(reading+writing)

Nginx认证功能

由 ngx_http_auth_basic_module 模块提供此功能

官方帮助:http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html

给状态页面加上认证功能,给没有认证功能的站点或页面加上防护

shell 复制代码
cat  > /etc/nginx/conf.d/status.csq.xyz.conf<<EOF
server {
	listen 80;
	server_name status.csq.xyz;
	#可以将访问这个状态页面的日志定位到空
	#error_log /dev/null;
	#access_log /dev/null;
	#使用"HTTP 基本身份验证"协议启用用户名和密码验证
	auth_basic   "csq status";
	#指定一个保存用户名和密码的文件
	auth_basic_user_file /etc/nginx/pass;
	
	location / {
	    #设置谁可以访问
		allow 172.16.1.0/24;
		deny all;
		#开启状态页
		stub_status on;
	}
}
EOF

#1.使用htpasswd创建密码(强制)
htpasswd -cb /etc/nginx/pass www 123
#-c创建一个新文件
#-b使用命令行中的密码,而不是提示输入密码
#/etc/nginx/pass 密码存储路径
#www 要创建的用户名
#123 对应的密码
##如果要csq这个用户也可以访问,不要再指定-c选项了,如果指定会覆盖原有的文件
htpasswd -b /etc/nginx/pass csq 123

#2.查看创建的密码文件
cat /etc/nginx/pass 
www:$apr1$eW78Bsur$c.Uik2zN7mXu1ASL8spkz0

#3.检查语法
nginx -t
#4.重新加载nginx
systemctl reload nginx

#测试,如果不指定-u会返回401 Authorization Required,需要授权的状态码
[root@web01 ~]# curl -u www:123 -H Host:status.csq.xyz http://172.16.1.103
Active connections: 2 
server accepts handled requests
 19 19 137 
Reading: 0 Writing: 1 Waiting: 1

Nginx变量使用

nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用

变量可以分为内置变量和自定义变量

内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值

常用内置变量

shell 复制代码
$remote_addr; 
#存放了客户端的地址,注意是客户端的公网IP

$proxy_add_x_forwarded_for
#此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没
#有X-Forwarded-For,就使用$remote_addr

$args; 
#变量中存放了URL中的参数,例如:http://myblog.csq.xyz/main/index.do?id=20190221&partner=search
#返回结果为: id=20190221&partner=search

$document_root; 
#保存了针对当前资源的请求的系统根目录,例如:/apps/nginx/html

$document_uri;
#保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比
如:http://myblog.csq.xyz/main/index.do?id=20190221&partner=search会被定义
为/main/index.do 
#返回结果为:/main/index.do

$host; 
#存放了请求的host名称

limit_rate 10240;
echo $limit_rate;
#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0

$remote_port;
#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口

$remote_user;
#已经经过Auth Basic Module验证的用户名

$request_body_file;
#做反向代理时发给后端服务器的本地资源的名称

$request_method;
#请求资源的方式,GET/PUT/DELETE等

$request_filename;
#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,
如:/apps/nginx/html/main/index.html

$request_uri;
#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,例如:/main/index.do?
#id=20190221&partner=search 

$scheme;
#请求的协议,例如:http,https,ftp等

$server_protocol;
#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等

$server_addr;
#保存了服务器的IP地址

$server_name;
#请求的服务器的主机名

$server_port;
#请求的服务器的端口号

$http_<name>
#name为任意请求报文首部字段,表示记录请求报文的首部字段
#示例: echo $http_User_Agent;  

$http_user_agent;
#客户端浏览器的详细信息

$http_cookie;
#客户端的cookie信息

$cookie_<name>
#name为任意请求报文首部字部cookie的key名

自定义访问日志与错误日志

错误日志

  • 指令error_log
error_log指令 说明
语法格式 error_log file [level]
默认 error_log logs/error.log error;
上下文(放在哪) main、http、mail、stream、server、location
  • 日志级别

Linux日志管理-CSDN博客

访问日志

  • log_format指定访问日志的格式
  • access_log 类似于error_log指定日志的位置和格式
access_log指令 说明
语法格式 access_log path [format [buffer=size ] [gzip[=level ]] [flush=time ] [if=condition ]]; access_log off;
默认 access_log logs/access.log combined;
上下文(放在哪) http, server, location, if in location, limit_except
log_format指令 说明
语法格式 log_format name [escape=default | json | none] string ...;
默认 log_format combined "...";
上下文(放在哪) http

规范网站的访问日志和错误日志

shell 复制代码
cat > /etc/nginx/conf.d/csqyouxi.xnfff.com.conf <<EOF
server{
	listen 80;
	server_name csqyouxi.xnfff.com;
	root /app/code/bird/;
	error_log /var/log/nginx/csqyouxi.xnfff.com-error.log notice;
	access_log /var/log/nginx/csqyouxi.xnfff.com-access.log main;
	location / {
		index index.html;
	}
}
EOF

#重新加载配置文件
systemctl reload nginx
#查看是否创建了日志
ll /var/log/nginx/csqyouxi.xnfff.com-*
#刷新小鸟飞飞页面看看是否创建了日志
ll /var/log/nginx/csqyouxi.xnfff.com-*
-rw-r--r-- 1 root root 4014 Oct 24 09:20 /var/log/nginx/csqyouxi.xnfff.com-access.log
-rw-r--r-- 1 root root 1512 Oct 24 09:20 /var/log/nginx/csqyouxi.xnfff.com-error.log

访问日志格式

shell 复制代码
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
访问日志格式 (ngx 变量) 说明 分析
$remote_addr 远程地址 (客户端 ip) 分析日志,客户端 ip 次数.
$remote_user 远程用户 (ngx 简单认证功能用户) 一般都是空的 -
$time_local 时间 分析的时候注意格式.
$request http 请求起始行 3 个内容 请求方法 URI http/1.1 分析核心:请求方法 URI
$status 状态码 分析每个状态码次数
$body_bytes_sent 服务端 --> 客户端返回数据的大小 可以用于统计流量情况.
$http_referer 资源 / 请求从哪里来的,从哪里跳转过来的 可以用于分析网站访问的情况 (跳转) 搜索引擎竞价分析 SEM.
$http_user_agent 客户端浏览器. 可以分析浏览器类型,可以分析是否有异常攻击.
$http_x_forwarded_for 代理 / 负载均衡场景下,web 节点用于记录客户端 ip 地址. -

localtion的匹配规则

URL地址 URI部分
http://www.chenshiquan.xyz /
http://www.chenshiquan.xyz/csq.txt /csq.txt
http://www.chenshiquan.xyz/img/csq.jpg /img/csq.jpg
http://www.chenshiquan.xyz/xxxxxxxxxxx/dd/dd/dd/d/ /xxxxxxxxxxx/dd/dd/dd/d/
location匹配URI写法 说明
location / {} 默认规则,其他location规则都失败了,这个保底
location /csq/ {} 用于匹配对应的URI 匹配路径
location ~ 正则 {} 支持正则匹配URI,区分大小写 匹配图片,静态资源
location ~* 正则 {} 支持正则匹配URI,不区分大小写 匹配图片,静态资源
location = 内容 {} 精确匹配,一般配合error_page指定错误页面
location ^~ 内容 {} 不是正则,匹配字符,优先级高,用的较少
location @xxx 命名的location,内部跳转
shell 复制代码
 erro    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

案例01

  • 给小鸟飞飞网站添加一个/admin功能(页面),只能172.16.1.0/24访问

  • 搭建bird小鸟飞飞网站,给网站加速,设置缓存,网站中js、css结尾的文件缓存1天,图片缓存1小时

    浏览器缓存

  • 指定错误404页面

shell 复制代码
缓存使用 浏览器缓存
expires 1d;
expires 1h;
shell 复制代码
#配置站点文件
cat > /etc/nginx/conf.d/csqyouxi.xnfff.com.conf <<EOF
server{
	listen 80;
	server_name csqyouxi.xnfff.com;
	root /app/code/bird/;
	#日志
	error_log /var/log/nginx/csqyouxi.xnfff.com-error.log notice;
	access_log /var/log/nginx/csqyouxi.xnfff.com-access.log main;
	location / {
		index index.html;
	}
	#后台访问限制
	location /admin/ {
		allow 172.16.1.0/24;
		deny all;
		index index.html;
	}
	#静态资源缓存配置
	location ~* \.(js|css)$ {
		expires 1d;	
	}
	#动态资源缓存配置
	location ~* \.(png|jpg|jepg|bmp)$ {
		expires 1h;
	}
	#404页面
	error_page 404 /404.html;
	location = /404.html {
		root /app/code/error;
	}
}
EOF
#检查语法
nginx -t
#配置站点文件所需资源
mkdir -p /app/code/{error,bird/admin}
#写入404页面信息
echo 404 not found > /app/code/error/404.html
#写入admin下目录所需index.html
echo bird admin > /app/code/bird/admin/index.html
#重启nginx
systemctl restart nginx
#查看admin后台
curl -H Host:csqyouxi.xnfff.com http://172.16.1.125/admin/
#回复内容如下
bird admin

浏览器F12查看页面缓存

404页面

浏览器访问后台

案例02

修改小鸟飞飞网站要求,用户访问网站IP或其他不符合的内容返回418状态码

shell 复制代码
#修改默认站点,当用户不正当访问返回418状态(就是用户访问的不是csqyouxi.xnfff.com就返回418状态)
#先备份默认站点
cp /etc/nginx/conf.d/{default.conf,.bak}
#修改默认站点
server {
        #指定当前 server 块作为 80 端口的 "默认虚拟主机"
        listen 80 default_server;
        #处理所有未被其他 server 块匹配的请求
        server_name _;
        return 418;
        #如果不想显示418也可以写个页面,让用户访问到指定站点
}
#5.检查nginx语法,并重新加载配置文件
nginx -t
systemctl restart nginx

https功能

HTTPS 是 HTTP 协议的安全增强版,核心是在 HTTP 基础上叠加 SSL/TLS 加密层,实现客户端与服务端之间的加密数据传输,防止敏感信息被第三方窃取或篡改

  1. 本质组成:HTTP + SSL/TLS 加密模块,是 "加密版 HTTP"。
  2. 核心功能:对传输数据(如登录密码、支付信息等)进行加密,保障数据传输过程的安全性和完整性。
  3. 适用场景:安全级别要求高的服务,如银行网站、电子邮箱、登录页面、电商支付等。
  4. 传输逻辑:客户端与服务端的所有通信都通过 TLS 协议加密,第三方无法破解传输内容

http配置参数

shell 复制代码
listen 443 ssl;
#为指定的虚拟主机配置是否启用ssl功能

ssl_certificate /path/to/file;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件

ssl_certificate_key /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个

ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!IDES:!RC4:!MD5;
#加密算法,需要排除不安全的算法

ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl缓存
   off: #关闭缓存
 none:  #通知客户端支持ssl session cache,但实际不支持
 builtin[:size]:#使用OpenSSL内建缓存,为每worker进程私有
 [shared:name:size]:#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称
 
ssl_session_timeout time;
#客户端连接可以复用ssl session cache中缓存的有效时长,默认5m

https配置

第一步:证书申请

  • 阿里云:免费20个
  • 腾讯云:免费50个

第二步:下载证书文件进行配置

shell 复制代码
server {
    listen 80;
    server_name ssl.chenshiquan.xyz;
    return 302 https://ssl.chenshiquanx.xyz$request_uri;
}
server {
    listen 443 ssl;
    server_name ssl.chenshiquan.xyz  ;
    ssl_certificate     /etc/nginx/keys/ssl.chenshiquan.xyz.pem;
    ssl_certificate_key /etc/nginx/keys/ssl.chenshiquan.xyz.key;
    ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!IDES:!RC4:!MD5;
    ssl_protocols TLSv1.1 TLS1.2 TLSv1.3;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    root /app/code/ssl;
    location / {
        index index.html;
    }
}

第三步:监控,https证书是否过期,30天

shell 复制代码
#!/bin/bash
##############################################################
# File Name:/server/scripts/check_yuming_and_zhengshu.sh
# Version:V1.0
# Author:csq
# Organization: www.chenshiquan.xyz
# Desc:
##############################################################
#vars
yuming=chenshiquan.xyz
zhengshu=myblog.chenshiquan.xyz
virt_ip=10.0.0.5

nowtime=`date +%s`
yuming_time_end=`whois ${yuming} | grep -i expir | awk -F': ' '{print $2}'`
yuming_time_end_seconds=`date +%s -d "${yuming_time_end}"`

zhengshu_time_end=`curl -s -v -o /dev/null -H Host:${zhengshu} https://${virt_ip}  |&  grep expire | awk -F': '  '{print $2}'`
zhengshu_time_end_seconds=`date +%s -d "${zhengshu_time_end}"`

yuming_time=`echo "($yuming_time_end_seconds - $nowtime)/86400" |bc`
zhengshu_time=`echo "($zhengshu_time_end_seconds - $nowtime)/86400" |bc`

echo "域名还剩: ${yuming_time} 天过期"
echo "证书还剩: ${zhengshu_time} 天过期"
[root@lb01 ~]# bash /server/scripts/check_yuming_and_zhengshu.sh
域名还剩: 308 天过期
证书还剩: 89 天过期

自建证书

shell 复制代码
#创建私钥 私钥server.key
openssl genrsa -idea -out server.key 2048

#根据私钥创建 证书 server.crt .pem证书
openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt

http认证流程

动态网站架构

网络架构 特点 说明
动态资源 服务端处理与加工,设计动态语言php,java,python,golang,rust...(后台,后端) 一般需要数据库(URI带有?或&就是动态请求)
静态资源 服务端发送,客户端解析(html,css,js)前端 功能简单,业务逻辑(URI是.html/png...结尾的就是静态请求)
混合 静态(前端开发),动态(后端) 全栈开发(前+后)
  • 上面部署的小鸟飞飞静态网站
常见的动态网站架构 说明
lnmp Linux系统,nginx(web服务),mysql(数据库,postgresql),php环境(动态语言)
lnmt Linux系统,nginx(web服务),mysql(数据库,postgresql),tomcat(java)
lnm? Linux系统,nginx(web),mysql(数据库,postgresql),什么语言(python,golang)

Keepalived+Nginx 主备高可用负载均衡架构(基于wordpress)

nginx处理用户请求

用户访问网站请求(静态、动态)流程

  • 用户发送请求前,先通过 DNS 解析获取 Nginx 代理服务器的 IP,基于该 IP,用户与 Nginx 通过 TCP 三次握手建立连接,开始传输请求数据
  • Nginx会根据用户的请求进行Location规则匹配
  • Location如果匹配的请求是静态,则由Nginx读取本地挂载的/app/code/blog/wp-content/uploads/直接返回
  • Location如果匹配的请求是动态,则由Nginx将请求转发给Fastcgi协议
  • Fastcgi收到后会将请求交给php-fpm,php读取php代码后进行解析,如果有查询数据库操作,则有php连接数据库(用户 密码 IP)发起查询的操作
  • MySQL 执行查询后,将结果返回给 PHP-FPM。
  • 结果经 PHP-FPM 传递给 FastCGI,再由 FastCGI 转发至 Nginx。
  • Nginx 将数据封装为 HTTP 响应,最终返回给用户

LNMT

Nginx负载均衡

负载均衡指令

upstream中server中指令 说明
weight=number 权重,默认为1
max_fails=number 对后端服务器连续监测失败多少次就标记为不可用,默认为1次 当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
max_conns=number 给当前server设置最大活动链接数,默认为0表示没有限制
fail_timeout 默认是10秒,失败后10s后再次测试
backup 设置为备份服务器,当所有服务器不可用时将重新启用次服务器
down 标记为down状态
resolve 当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx

负载均衡配置参数

shell 复制代码
proxy_pass; 
#用来设置将客户端请求转发给的后端服务器的主机
#可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式
#也可以代理到预先设置的主机群组

proxy_hide_header field;
#用于nginx作为反向代理的时候,在返回给客户端http响应时,隐藏后端服务器相应头部的信息,可以设置
#在http,server或location块,


proxy_set_header;
#可更改或添加客户端的请求头部信息内容并转发至后端服务器
#比如在后端服务器想要获取客户端的真实IP的时候,就要更改每一个报文的头部
#示例
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


proxy_set_header X-Real-IP  $remote_addr;
#添加HOST到报文头部,如果客户端为NAT上网那么其值为客户端的共用的公网IP地址
#常用于在日志中记录客户端的真实IP地址。
 
 
proxy_http_version 1.0;
#用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0



proxy_connect_timeout time;
#配置nginx服务器与后端服务器尝试建立连接的超时时间,默认为60秒,用法如下:
proxy_connect_timeout 6s; 
#60s为自定义nginx与后端服务器建立连接的超时时间,超时会返回客户端504响应码


proxy_read_timeout time;
#配置nginx服务器向后端服务器或服务器组发起read请求后,等待的超时时间,默认60s

proxy_send_timeout time; 
#配置nginx项后端服务器或服务器组发起write请求后,等待的超时 时间,默认60s

proxy_http_version 1.0; 
#用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0


proxy_ignore_client_abort off; 
#当客户端网络中断请求时,nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启,则服务器
#会忽略客户端中断并一直等着代理服务执行返回,如果设置为off,则客户端中断后Nginx也会中断客户端请
#求并立即记录499日志,默认为off。

proxy_headers_hash_bucket_size 128;
#当配置了 proxy_hide_header和proxy_set_header的时候,用于设置nginx保存HTTP报文头的hash
#表的上限

proxy_headers_hash_max_size 512; 
#设置proxy_headers_hash_bucket_size的最大可用空间

server_namse_hash_bucket_size 512; 
#server_name hash表申请空间大小

server_names_hash_max_size  512; 
#设置服务器名称hash表的上限大小

负载均衡轮询算法

轮询算法:如何把请求发送到后端节点

算法 说明 应用
轮询 rr 轮询 nginx 默认算法
加权轮询 wrr 轮询 增加了权重;修改权重让服务器增加或减少请求。修改权重进行更新测试.
ip 哈希ip_hash ip_hash 对客户端 ip 地址进行 hash 计算,只要 ip 地址一样,相同的 web 处理. 容易导致负载不均,可以解决会话保持 (登录保持) 问题. 只是临时的缓解手段.
url 哈希url_hash hash $request_uri; 对客户端请求的 url 进行哈希,访问相同的 url 就访问相同的缓存服务器.缓存的节点.
最小连接数 least_conn 动态算法,根据连接情况转发.
最小连接时间 least_time 动态算法,根据连接情况转发.
一致性哈希算法 hash $remote_addr consistent; ip_hash 的加强版,智能版本.

(1)加权轮询

web01/02节点设置

shell 复制代码
server {
	listen 80;
	server_name lb.csq.xyz;
	client_max_body_size 10M;
	access_log /var/log/nginx/access-blog.chenshiquan.xyz main;
	error_log /var/log/nginx/error-blog.chenshiquan.xyz notice;
	root /app/code/lb/;
	location / {
		index index.html;
	}
}
#创建站点目录
mkdir -p /app/code/lb/
#创建首页文件
echo `hostname` > /app/code/lb/index.html

负载均衡节点设置

shell 复制代码
upstream web01_web02_lb01{
        server 10.0.0.103:80 weight=1;
        server 10.0.0.104:80 weight=2;
}
server {
        listen 80;
        error_log /var/log/nginx/error-lb.log notice;
        access_log /var/log/nginx/access-lb.log main;
        server_name lb.csq.xyz;
        location / {
                #定义反向代理的目标服务器(或服务器组),即客户端的请求会被转发到该地址
                proxy_pass http://web01_web02_lb01;
                #向后端服务器传递客户端请求的原始Host头(即客户端访问的域名 / IP)
                proxy_set_header Host $host;
                #添加客户端IP和反向代理服务器IP到请求报文头部
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                #只添加客户端IP到请求报文头部,转发至后端服务器
                proxy_set_header X-Real-Ip $remote_addr;
        }
}
[root@lb01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 /etc/nginx/conf.d]# systemctl reload nginx

windows做hosts解析,浏览器访问,请求3次2次请求到web02,1次请求到web01

ip_hash

对客户端 ip 地址进行 hash 计算,只要 ip 地址一样,相同的 web 处理.

shell 复制代码
upstream web01_web02_lb01{
        ip_hash;
        server 10.0.0.103:80 weight=1;
        server 10.0.0.104:80 weight=2;
}

一致性hash

shell 复制代码
upstream web01_web02_lb01{
        hash $remote_addr consistent;
        server 10.0.0.103:80 weight=1;
        server 10.0.0.104:80 weight=2;
}

一致性哈希环,4个节点9条数据

新增node5节点,不影响其他节点

如果删除node5,相邻的5条数据会传到node4

节点数较少时,数据分布不均匀=>引入虚拟节点

实现FastCGI

Nginx基于模块ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理,其配置指令如下

shell 复制代码
fastcgi_pass address:port;
#转发请求到后端服务器,address为后端的fastcgi server的地址,可用位置:location, if in location

fastcgi_index name;
#fastcgi默认的主页资源,示例:fastcgi_index index.php;

fastcgi_param parameter value [if_not_empty];
#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义key

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 name

#Nginx默认配置示例:
   location ~ \.php$ {
     root           /scripts;
     fastcgi_pass   127.0.0.1:9000;
     fastcgi_index index.php;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #默认脚本路径
     include       fastcgi_params;    #此文件默认系统已提供,存放的相对路径为prefix/conf
}

FastCGI实战案例 : Nginx与php-fpm在同一服务器

shell 复制代码
server {
        listen 80;
        server_name myblog.csq.xyz;
        client_max_body_size 10M;
        access_log /var/log/nginx/access-myblog.csq.xyz main;
        error_log /var/log/nginx/error-myblog.csq.xyz notice;
        root /app/code/blog/;
        location / {
                index index.php index.html;
        }
        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;
        }
}

会话保持/会话共享方案

特点 cookie session
共同点 存放用户信息 存放用户信息
位置 浏览器中 (客户端) 文件,数据库.redis (服务端)
怎么来的 响应报文中包含与设置 登录后创建
搭配 可以只用 cookie 记录登录信息.使用 cookie+session 搭配记录登录信息.cookie 钥匙 锁头.
方案 说明
直接使用cookie 类似于wordpress
ip_hash或一致性hash 登陆固定节点
使用会话保持服务 redis存放用户的会话信息
使用Oauth认证 不需要存放会话信息,生成令牌

Nginx Rewrite

Nginx 的 rewrite 功能由 ngx_http_rewrite_module 模块实现,核心是实现 URL 重写。其重要作用包括:网站结构变更时,无需客户端或其他网站修改原有链接即可正常访问;同时能在一定程度上提升网站安全性

nginx_http_rewrite_module模块指令

nginx-rewrite模块 说明 应用场景
rewrite 实现跳转功能,正则,更加灵活跳转 URI改变加工处理
return 实现跳转功能,变量,简单 301,302,http/https,新旧域名
if 判断与nginx变量 单分支判断 简单判断使用if即可,过于复杂请求的处理交给lua模块(openresty自带lua模块)
set 创建/修改变量

伪静态:动态资源/页面伪装为静态.搜索引擎喜欢缓存(收入)

shell 复制代码
伪静态地址:
myblog.csq.xyz/csq-1.html
rewrite 还原动态地址交给网站处理
myblog.csq.xyz/csq/1.php

return指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置

shell 复制代码
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; #返回给客户端的URL地址

实现http临时跳转https

shell 复制代码
server {
    listen 80;
    server_name ssl.chenshiquan.xyz;
    return 302 https://ssl.chenshiquanx.xyz$request_uri;
}
server {
    listen 443 ssl;
    server_name ssl.chenshiquan.xyz  ;
    ssl_certificate     /etc/nginx/keys/ssl.chenshiquan.xyz.pem;
    ssl_certificate_key /etc/nginx/keys/ssl.chenshiquan.xyz.key;
    root /app/code/ssl;
    location / {
        index index.html;
    }
}

if指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

shell 复制代码
if (条件匹配) {
  action
}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接

shell 复制代码
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=  #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)

范例1:网站只支持GET/POST/HEAD请求方法,其他方法都拒绝405

shell 复制代码
server {
	listen 80;
	server_name test.csq.xyz;
	root /app/code/test;
	if ( $request_method !~ "GET|POST" ){
		return 405;
	}
	location / {
		index index.html
	}
}
#测试
curl -I -H Host:test.csq.xyz http://10.0.0.104
HTTP/1.1 405 Not Allowed
Server: nginx/1.28.0
Date: Sun, 02 Nov 2025 01:49:43 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive

set指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合

范例2:网站维护中显示503

shell 复制代码
server {
        listen 80;
        server_name test.csq.xyz;
        root /app/code/test;
        set $file "/etc/nginx/csq.txt";
        if ( -f $file ){
                return 503;
        }
        if ( $request_method !~ "GET|POST" ){
                return 405;
        }
        location / {
                index index.html;
        }
}
#测试
#创建文件
touch /etc/nginx/csq.txt
#访问
curl -I -H Host:test.csq.xyz http://10.0.0.104
HTTP/1.1 503 Service Temporarily Unavailable
Server: nginx/1.28.0
Date: Sun, 02 Nov 2025 01:55:43 GMT
Content-Type: text/html
Content-Length: 197
Connection: keep-alive

break指令

Nginx 的 break 指令可在 server、location、if 块中使用,作用是中断当前作用域中后续的 ngx_http_rewrite_module 模块指令(同一作用域中其前面的配置生效),但不影响其他模块指令;遇到该指令后,Nginx 会回到上一层作用域继续处理配置。

注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行

nginx 复制代码
server {
        listen 80;
        server_name test.csq.xyz;
        root /app/code/test;
        set $file "/etc/nginx/csq.txt";
        if ( -f $file ){
                break;     #在此处添加break
                return 503;
        }
        if ( $request_method !~ "GET|POST" ){
                return 405;
        }
        location / {
                index index.html;
        }
}

#测试
#创建文件
touch /etc/nginx/csq.txt
#访问
curl -I -H Host:test.csq.xyz http://10.0.0.104
HTTP/1.1 200 OK
Server: nginx/1.28.0
Date: Sun, 02 Nov 2025 02:12:50 GMT
Content-Type: text/html
Content-Length: 6
Last-Modified: Sun, 02 Nov 2025 01:43:48 GMT
Connection: keep-alive
ETag: "6906b754-6"
Accept-Ranges: bytes

rewrite指令

https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

rewrite可以配置在 server、location、if

Nginx 的 rewrite 指令通过正则表达式匹配用户请求的 URI,匹配时替换为新 URI;同一级配置块中多个 rewrite 规则自下而上逐个检查,替换后会重新循环检查(最多 10 次,超次返回 500),flag 可控制该循环;若替换后的 URL 以 http:// 或 https:// 开头,会直接返回 301 永久重定向。

shell 复制代码
. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W  #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^magedu] #匹配除了magedu 这几个字母以外的任意字符

雪崩

雪崩:某个(些)机器挂了,导致其他机器也挂了

Nginx,haproxy,lvs区别

四层负载均衡七层负载均衡

负载均衡 四层负载均衡 七层负载均衡
区别 4层传输层 7层应用层
详细区别 端口转发 处理http,https请求,UA,Host,URL,域名

区别

软件 nginx haproxy lvs
区别 4层/7层 4层/7层 4层
原理 反向代理 反向代理 负载均衡
功能 简单易上手 性能OK,负载均衡检查模块(商业版本才有) 开源版本需要添加第3方upstream_check才有 nginx动态加载(热加载)功能,修改配置立刻生效 配置不难,支持监控检查功能 动态热加功能 性能最高 配置与维护负载

Nginx反向代理和负载均衡的区别

网站无法访问排查流程

shell 复制代码
1. 服务启动
   看提示
   看日志
   看systemctl status 服务名
   看journalctl -xe -u xxx
2.直接显示状态码 403(权限,首页文件),404,500,502(请求通过ngx进行转发,后面没有人接
着.),504,xxxxx    
	根据状态码分析,可能原因  
	看日志错误日志,访问日志.
	找出对应的日志进行分析

3.浏览器页面有些错误提示,不是状态提示. 
	浏览器是否加上https
	根据浏览器提示翻译与分析  
	ERR_CONNNECTION_REFUSED连接拒绝. 
		windows curl/ping/telnet 

4.无法访问,没有提示.类似于白屏. 
	F12开启调试模式,查看页面对应的状态码. 	
		windows curl/ping   
		linux curl 检查  
	根据ngx处理用户请求流程检查.   
5.网站访问慢,比较复杂
相关推荐
前端大卫几秒前
Vue3 + Element-Plus 自定义虚拟表格滚动实现方案【附源码】
前端
却尘16 分钟前
Next.js 请求最佳实践 - vercel 2026一月发布指南
前端·react.js·next.js
ccnocare17 分钟前
浅浅看一下设计模式
前端
Lee川21 分钟前
🎬 从标签到屏幕:揭秘现代网页构建与适配之道
前端·面试
Ticnix1 小时前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人1 小时前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
twl1 小时前
OpenClaw 深度技术解析
前端
崔庆才丨静觅1 小时前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人1 小时前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼1 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端