Nginx

错误日志级

  1. debug:记录大量的调试信息,用于开发和调试时使用。
  2. info:记录关键信息,如请求处理的重要事件、配置文件的加载等。
  3. notice:记录正常的操作消息,如启动、停止、重新加载配置文件等。
  4. warn:记录可能的问题或警告信息,但不会影响Nginx的正常运行。
  5. error:记录错误信息,这些错误可能会导致请求处理失败或系统性能下降。
  6. crit:记录严重错误,这些错误通常会导致Nginx服务崩溃或无法继续运行。
  7. alert:记录需要立即处理的严重错误,通常涉及到系统安全性或数据完整性问题。
  8. emerg:记录紧急错误,这些错误会导致Nginx立即停止运行。

nginx.conf

这是 Nginx 的主配置文件,包含了全局的配置和对其他配置文件的引用。

nginx -t 命令,用于测试 Nginx 配置文件的语法正确性。

nginx -s reload重新加载nginx配置

user  nginx;								# 指定 Nginx 进程运行的用户。
worker_processes  auto;						# 指定工作进程的数量,auto 表示自动检测 CPU 核心数。

error_log  /var/log/nginx/error.log notice;	# 指定错误日志文件和日志级别。
pid        /var/run/nginx.pid;				# 指定 Nginx 主进程 PID 文件的位置。


events {
    worker_connections  1024;				# 定义了事件模块的配置,这里设置了每个工作进程可以同时处理的最大连接数。
}


http {										# 定义了 HTTP 服务器的配置。
    include       /etc/nginx/mime.types;			# 这个文件制定了nginx可以识别的文件类型
    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;			# 包含 /etc/nginx/conf.d/ 目录下的所有 .conf 文件,这些文件通常包含额外的服务器块配置。
}

default.conf

这个文件是 Nginx 的一个服务器块(server block)配置文件,通常用于定义如何处理特定的域名或IP地址的请求。

server {
    listen       80;			# 默认监听端口
    server_name  localhost;		# 当 Nginx 接收到发往 localhost 的 HTTP 请求时,它会使用这个 server 块中定义的规则来处理这些请求。

    #access_log  /var/log/nginx/host.access.log  main; 		记录访问日志到XX中,main格式

    location / {			# 定义了服务器的根位置,即当用户访问根 URL 时的行为
        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
    #
    error_page   500 502 503 504  /50x.html;	# 定义了当 Nginx 遇到 500 系列错误时,将请求重定向到 /50x.html。
    location = /50x.html {						# 定义了如何处理对 /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;			# 如果启用,将会处理以 .php 结尾的请求,并将它们代理到本地的 Apache 服务器或 FastCGI 服务器。
    #}

    # 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 用作负载均衡器或反向代理服务器。当配置了多个上游服务器时,Nginx 可以根据负载均衡算法将请求转发到不同的上游服务器上。

http {
    upstream backend {					# 定义了一个名为 backend 的上游服务器组。这个组包含了一组后端服务器,Nginx 可以将请求代理到这些服务器上。
        server backend1.example.com;	# 将 backend1.example.com 添加到 backend 服务器组中。
        server backend2.example.com;
        server backend3.example.com;
    }
    
    server {
        listen 80;								# 匹配端口号
        server_name example.com;	# 网站域名
          
        location / {							# 匹配路径, 鱼钩
            proxy_pass http://backend;		# 这里是做了代理
        }
        # 改成location /tmp { ... }呢 请求匹配:只有当请求的 URL 路径以 /tmp 开头时,这些请求才会被代理到 backend 上游服务器组。例如,请求 http://example.com/tmp 或 http://example.com/tmp/file1.html 将被匹配并代理。其他路径:对于不以 /tmp 开头的请求,如 http://example.com/home 或 http://example.com/about,这些请求将不会被这个 location 块处理。如果没有其他 location 块匹配这些请求,Nginx 将返回 404 错误。


    }
}

静态文件处理

Nginx 以其高效的静态文件处理而闻名。当请求的 URL 与配置中的静态文件路径匹配时,Nginx 可以直接返回静态文件,而无需将请求转发给后端服务器。

http {
    server {
        listen 80;
        server_name example.com;
        
        location /static {
            alias /var/www/static;
        }
    }
}

请求处理流程总结

1.客户端发送请求到 Nginx 服务器。
2.Nginx 接收到请求并根据配置的监听端口进行处理。
3.根据请求的域名匹配相应的服务器块。
4.如果配置了负载均衡和反向代理,Nginx 将根据算法将请求转发到相应的上游服务器。
5.如果请求匹配了静态文件路径,Nginx 直接返回静态文件。
6.如果请求不匹配静态文件路径,Nginx 将请求转发给后端应用程序服务器进行处理。
7.后端应用程序服务器处理请求并生成响应。
8.Nginx 将后端服务器返回的响应返回给客户端。

配置Nginx来处理动态请求转发

要配置 Nginx 来处理动态请求转发,需要使用 location 块和 proxy_pass 指令。下面是一些示例配置和说明。

  1. 安装和启动后端应用程序服务器(例如,FastCGI、uWSGI 或应用程序服务器)。

在配置 Nginx 之前,确保已经安装并成功启动了后端应用程序服务器,并且它正在监听某个地址和端口上。

  1. 配置 Nginx 的 location 块和 proxy_pass 指令。

打开 Nginx 的配置文件(通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf),并按照以下方式进行配置:

http {
    server {
        listen 80;
        server_name example.com;
        
        location / {
            proxy_pass http://后端服务器地址:端口号;
        }
    }
}

将上述配置中的 example.com 替换为您的域名或服务器 IP 地址。将 后端服务器地址 替换为后端应用程序服务器的实际地址(如 127.0.0.1 或 localhost)。将 端口号 替换为后端应用程序服务器监听的端口号。

  1. 重新加载或重启 Nginx。保存 Nginx 配置文件,并使用以下命令重新加载或重启 Nginx 以使配置生效
# 重新加载配置
sudo nginx -s reload

# 或者重启 Nginx

虚拟主机

Nginx 的配置中,一个 server 块通常对应一个虚拟主机,用于处理特定的域名或 IP 地址的请求。理论上,可以在一个 server 块中配置多个 server_name 指令,每个指令对应一个域名。这样,同一个 server 块就可以处理多个不同域名的请求。

server {
    listen       80;
    server_name  localhost local.example.com example.com www.example.com;

    # 其他配置...
}

通常,每个域名都会有自己的 server 块,这样可以为每个域名提供更精细的配置控制。可以为不同的域名设置不同的 root 目录、不同的 SSL 证书、不同的日志文件等。

本地测试域名

[root@master web]# curl -v -H  "Host:localhost" http://192.168.88.132:8001/index.html
* About to connect() to 192.168.88.132 port 8001 (#0)
*   Trying 192.168.88.132...
* Connected to 192.168.88.132 (192.168.88.132) port 8001 (#0)
> GET /index.html HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> Host:localhost
>
< HTTP/1.1 200 OK
< Server: nginx/1.26.1
< Date: Sun, 24 Nov 2024 12:45:04 GMT
< Content-Type: text/html
< Content-Length: 285
< Last-Modified: Sun, 24 Nov 2024 12:33:12 GMT
< Connection: keep-alive
< ETag: "67431d08-11d"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>首页</title>

</head>

<body>
    <h1>欢迎来到我的网页</h1>

    <p>这是一个简单的 HTML 页面。</p>

</body>

</html>

* Connection #0 to host 192.168.88.132 left intact
指定错误日志目录
server {
    listen 80;
    server_name domain1.com;
    error_log /var/log/nginx/domain1.error_log warn;
    # 其他配置...
}
访问日志
http {
    log_format main {											# 设置日志格式
        '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';
    };

    server {	# 设置了一个默认的访问日志文件和格式。
        access_log /var/log/nginx/access.log main;
        # 其他配置...
    }
}

如果 access_log 指令在 http 块和 server 块中都被指定了,那么 server 块中的配置会覆盖 http 块中的配置。

  • $remote_addr:客户端的 IP 地址。
  • $remote_user:如果请求是通过 HTTP 基础认证发送的,这个变量包含用户名。
  • $time_local:请求处理的时间,格式为本地时间。
  • $request:请求的原始请求行。
  • $status:请求的 HTTP 状态码。
  • $body_bytes_sent:发送给客户端的响应体的字节数。
  • $http_referer:HTTP referer 头部的值,指示链接到当前请求页面的前一个页面的地址。
  • $http_user_agent:HTTP user-agent 头部的值,包含了发出请求的浏览器信息。
  • $http_x_forwarded_for:如果设置了代理,这个变量会包含客户端的 IP 地址,以及在它之前经过的每一个代理服务器的 IP 地址。

更多nginx变量名

配置缓存

HTTP缓存,它是一种网络协议缓存机制,用于存储网页、图片、脚本、样式表等资源的副本,以便在后续请求时可以直接从缓存中获取,而不需要再次从服务器下载。HTTP缓存可以显著提高网站性能和用户体验,因为它减少了网络延迟和服务器的负载。

在Nginx中设置缓存主要有两种方式:

  1. 浏览器缓存(客户端缓存)
    • 通过设置expires指令,Nginx告诉浏览器资源的过期时间。在这个时间之前,浏览器会直接从本地缓存中读取资源,而不会向服务器发送请求。
    • 例如,expires 1d;意味着资源将在1天后过期,浏览器在这1天内会使用本地缓存的资源。
  2. 代理缓存(服务器端缓存)
    • Nginx作为反向代理时,可以缓存后端服务器的响应,并在后续请求中直接提供这些响应,而不需要每次都向后端服务器请求。
    • 这通常通过proxy_cache指令和proxy_cache_path指令来配置。
http {
    # 设置默认的缓存时间为0,即不缓存
    expires -1;

    # 针对.html文件设置缓存时间为1天
    location ~* \.html$ {
        expires 1d;
    }

    # 针对.js文件设置缓存时间为1天
    location ~* \.js$ {
        expires 1d;
    }

    # 针对.css文件设置缓存时间为1天
    location ~* \.css$ {
        expires 1d;
    }

    # 其他配置...
}
location ~* \.(html|js|css)$ {
   expires max;
    #expires 1d;
 }

location规则

在Nginx中,location指令是用来匹配请求的URI,并根据匹配结果执行不同的配置块。以下是一些关于location规则的小结:

  1. 基本匹配
    • location /:匹配所有请求。
    • location /path/:匹配以/path/开头的请求。
  2. 正则表达式匹配
    • location ~ regex:区分大小写的正则表达式匹配。
    • location ~* regex:不区分大小写的正则表达式匹配。
  3. 精确匹配
    • location = /path/:精确匹配/path/,不进行正则表达式匹配。
  4. 特殊字符
    • 在正则表达式中,特殊字符(如*.?[等)需要使用反斜杠\进行转义。
  5. 优先级
    • Nginx会按照配置文件中的顺序,从上到下匹配location指令。
    • 精确匹配(=)的优先级最高,其次是正则表达式匹配(~~*),最后是前缀匹配(无修饰符)。
  6. 变量使用
    • location中可以使用变量,例如location $request_uri
  7. 通配符匹配
    • location /images/:匹配以/images/开头的请求。
    • location /images/*:匹配以/images/开头,后面跟着任意字符的请求。
  8. 命名location
    • location @name:这是一个特殊的location,用于命名一个location,可以在error_page指令中引用。
  9. 嵌套location
    • location块可以嵌套在另一个location块内部,但需要注意优先级和匹配顺序。
  10. 使用场景
    • 用于定义不同的请求处理规则,如静态文件服务、代理设置、重定向、日志记录等。
  11. 配置示例
server {
    listen 80;
    server_name example.com;

    # 精确匹配
    location = / {
        return 200 "Welcome to the homepage";
    }

    # 前缀匹配
    location /images/ {
        root /var/www;
    }

    # 正则表达式匹配
    location ~* \.(js|css|png)$ {
        expires 30d;
    }

    # 通配符匹配
    location /api/ {
        proxy_pass http://backend;
    }

    # 嵌套location
    location /blog/ {
        location ~* \.(html|xml)$ {
            try_files $uri =404;
        }
    }
}

autoindex模块

server {
    listen 80;
    server_name example.com;
    location /download/ {
        root /path/to/files; # 指定文件目录的路径
        autoindex on; # 开启目录浏览
        autoindex_exact_size off; # 以可读的方式显示文件大小
        autoindex_localtime on; # 显示文件的本地时间
        charset utf-8; # 解决中文文件名显示乱码问题
    }
}

配置代理与负载均衡

反向代理

配置文件
web服务器: 192.168.116.144
[root@master1 nginx]# pwd
/etc/nginx
[root@master1 nginx]# tree
.
├── conf.d
│   └── proxy.oldboylinux.cn.conf
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── index.html
├── koi-utf
├── koi-win
├── mime.types
├── mime.types.default
├── nginx.conf
├── nginx.conf.default.bak
├── scgi_params
├── scgi_params.default
├── uwsgi_params
├── uwsgi_params.default
└── win-utf

2 directories, 17 files

nginx.conf

[root@master1 nginx]# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

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



}

proxy.oldboylinux.cn.conf

[root@master1 nginx]# cat conf.d/proxy.oldboylinux.cn.conf
server {
    listen 80;
    server_name proxy.oldboylinux.cn;
    root /app/code/proxy;
    error_log /var/log/nginx/proxy_error.log notice;
    access_log /var/log/nginx/proxy_access.log main;
    location / {
        index index.html;
    }
}

web页面

[root@master1 nginx]# cat /app/code/proxy/index.html
proxy.oldboylinux.cn web01

测试访问: curl -H “Host: proxy.oldboylinux.cn” http://192.168.116.144

代理服务器: 192.168.116.145
[root@node1 nginx]# pwd
/etc/nginx
[root@node1 nginx]# tree
.
├── conf.d
│   └── proxy.conf
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf
├── koi-win
├── mime.types
├── mime.types.default
├── nginx.conf
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├── uwsgi_params
├── uwsgi_params.default
└── win-utf

2 directories, 16 files

nginx.conf

[root@node1 nginx]# cat nginx.conf
user nginx;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

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



}

proxy.conf

[root@node1 nginx]# cat conf.d/proxy.conf
# 代理服务器的 Nginx 配置
server {
    listen 80;
    server_name proxy.oldboylinux.cn;
    error_log /var/log/nginx/proxy-error.log notice;
    access_log /var/log/nginx/proxy-access.log main;

    location / {
        proxy_pass http://192.168.116.144:80;
        proxy_set_header Host $host;				# 设置代理请求的 Host 头部,原始请求中的 Host 头部值。不是代理服务器的
    }
}

测试访问

[root@node1 nginx]#  curl -H "Host: proxy.oldboylinux.cn" http://192.168.116.145
proxy.oldboylinux.cn web01
代理服务器日志
[root@node1 nginx]# cat /var/log/nginx/proxy-access.log
192.168.116.145 - - [27/Nov/2024:14:02:52 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.29.0" "-"
192.168.116.145 - - [27/Nov/2024:14:03:12 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.29.0" "-"
192.168.116.145 - - [27/Nov/2024:14:06:47 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.29.0" "-"
192.168.116.1 - - [27/Nov/2024:14:08:43 +0800] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"
192.168.116.1 - - [27/Nov/2024:14:08:43 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.116.145/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"

192.168.116.1浏览器的ip(虚拟网卡的ip)

web服务器日志
[root@master1 nginx]# cat /var/log/nginx/proxy_access.log
192.168.116.144 - - [27/Nov/2024:12:37:45 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.29.0" "-"
192.168.116.144 - - [27/Nov/2024:12:39:24 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.29.0" "-"
192.168.116.145 - - [27/Nov/2024:14:02:52 +0800] "GET / HTTP/1.0" 200 27 "-" "curl/7.29.0" "-"
192.168.116.145 - - [27/Nov/2024:14:03:12 +0800] "GET / HTTP/1.0" 200 27 "-" "curl/7.29.0" "-"
192.168.116.145 - - [27/Nov/2024:14:06:47 +0800] "GET / HTTP/1.0" 200 27 "-" "curl/7.29.0" "-"
192.168.116.145 - - [27/Nov/2024:14:08:43 +0800] "GET / HTTP/1.0" 200 27 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"
192.168.116.145 - - [27/Nov/2024:14:08:43 +0800] "GET /favicon.ico HTTP/1.0" 404 555 "http://192.168.116.145/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"
web记录真实访问者ip

用户请求经过代理,然后访问web,web服务器没有记录真实的客户端的ip地址,而是记录了代理的ip.

代理服务器添加

proxy_set_header X-Forwarded-For $remote_addr;

[root@node1 nginx]# cat /etc/nginx/conf.d/proxy.conf
# 代理服务器的 Nginx 配置
server {
    listen 80;
    server_name proxy.oldboylinux.cn;
    error_log /var/log/nginx/proxy-error.log notice;
    access_log /var/log/nginx/proxy-access.log main;

    location / {
        proxy_pass http://192.168.116.144:80;
        proxy_set_header X-Forwarded-For $remote_addr;	#  X-Forwarded-For(XFF)头部来记录客户端的真实 IP 地址
        proxy_set_header Host $host;
    }
}

web服务器

192.168.116.145 - - [27/Nov/2024:14:56:42 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "192.168.116.1"
192.168.116.145 - - [27/Nov/2024:14:56:43 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "192.168.116.1"
192.168.116.145 - - [27/Nov/2024:14:56:44 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "192.168.116.1"

负载均衡

代理服务器: 192.168.116.145

upstream模块的upstream指令. 创建1个池塘(分组),存放主机. upstream创建池塘,proxy_pass数据丢向池塘

[root@node1 conf.d]# cat proxy.conf
# 代理服务器的 Nginx 配置
server {
    listen 80;
    server_name proxy.oldboylinux.cn;
    error_log /var/log/nginx/proxy-error.log notice;
    access_log /var/log/nginx/proxy-access.log main;

    location / {
        proxy_pass  http://myapp;						# myapp组
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
    }
}
[root@node1 conf.d]# cat upstream.conf
upstream myapp {

    # 设置每个服务器的最大连接数
    server 192.168.116.144 weight=1  max_fails=1 fail_timeout=30s;
    server 192.168.116.131 weight=1  max_fails=1 fail_timeout=30s;
}
web服务器192.168.116.144/131

访问被分配到不同的节点

Every 2.0s: curl 192.168.116.145                                                                      Wed Nov 27 21:37:35 2024

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0 100    27  100    27    0     0   7525      0
--:--:-- --:--:-- --:--:--  9000
proxy.oldboylinux.cn web01



Every 2.0s: curl 192.168.116.145                                                                      Wed Nov 27 21:37:53 2024

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0 100    27  100    27    0     0   5839      0
--:--:-- --:--:-- --:--:--  6750
proxy.oldboylinux.cn web02

nginx平滑升级

平滑升级Nginx(以Tengine为例)通常涉及以下步骤:

  1. 下载新版本的Nginx
    下载新版本的Nginx源码包,例如nginx-1.20.1.tar.gz,并解压。
tar zxvf nginx-1.20.1.tar.gz
  1. 配置和编译新版Nginx
    进入新版本的Nginx目录,使用./configure命令进行配置,注意不要执行make install操作,以免覆盖原有配置文件。
cd nginx-1.20.1/
./configure --with-cc-opt='...' --with-ld-opt='...' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf ...
make
  1. 备份旧版Nginx二进制文件
    在进行升级前,确保备份旧版的Nginx二进制文件和配置文件。
cp -f objs/nginx /usr/sbin/nginx
  1. 拷贝新版Nginx二进制文件
    将编译好的新版Nginx二进制文件拷贝到原位置,覆盖旧版文件。
cp -f objs/nginx /usr/sbin/nginx
  1. 拷贝编译生成的库文件
    如果新版Nginx编译生成了新的库文件,也需要将它们拷贝到相应的目录下。
cp objs/*.so /usr/lib/nginx/modules/
  1. 检查Nginx版本
    使用nginx -V命令检查Nginx版本是否已更新。
nginx -V
  1. 测试新版Nginx配置文件
    使用nginx -t命令测试新版Nginx的配置文件是否正确。
nginx -t
  1. 平滑升级
    发送USR2信号给Nginx主进程,启动新版本的工作进程,同时旧进程继续处理当前请求直到完成。
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
  1. 优雅关闭旧进程
    发送WINCH信号给旧Nginx主进程,使其逐步关闭旗下的工作进程。
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid`
  1. 确认升级成功
    确认所有请求都已平滑过渡到新的工作进程,并且旧的master进程已经停止。
    如果需要回退,可以发送HUP信号给旧Nginx主进程,重新启动工作进程使用旧版配置文件。

nginx 重定向

Nginx 是一个高性能的 HTTP 和反向代理服务器,它也常用于负载均衡、邮件代理和通用 TCP/UDP 代理服务。重定向是 Nginx 的一个常见功能,允许将用户从一个 URL 重定向到另一个 URL。

  • 重定向(Redirect)和转发(Forward)是两种不同的服务器端处理请求的方法,它们在处理 HTTP 请求时的行为和效果有所不同:

重定向(Redirect)

转发(Forward)

技术实现

重定向是客户端和服务器之间的交互,涉及到多个 HTTP 请求,而转发是服务器内部的行为,只涉及一个 HTTP 请求。选择使用重定向还是转发,取决于你的具体需求和场景。

- **客户端行为**:重定向是 HTTP 协议的一部分,它涉及到客户端和服务器之间的多次请求。当服务器返回一个重定向响应(通常是 301 或 302 状态码)时,浏览器会接收到这个响应,并根据响应中的 `Location` 头部信息自动发起一个新的请求到新的 URL。
- **HTTP 请求**:会产生两个独立的 HTTP 请求,第一个请求是原始请求,第二个请求是浏览器根据重定向响应发起的新请求。
- **可见性**:用户和搜索引擎都能看到 URL 的变化,因为浏览器的地址栏会更新为新的 URL。
- **用途**:适用于永久或临时的资源移动,如网站迁移、URL 结构变更等。
- **SEO 影响**:对于搜索引擎优化(SEO)来说,301 重定向有助于传递权重,而 302 重定向则不会。
- **服务器端行为**:转发是服务器端的行为,它不涉及到客户端。当服务器接收到一个请求后,服务器内部将请求转发给另一个服务器或应用程序,而客户端对此一无所知。
- **HTTP 请求**:只产生一个 HTTP 请求,客户端只与最初的服务器通信,转发发生在服务器内部。
- **可见性**:用户和搜索引擎看不到 URL 的变化,因为浏览器的地址栏不会更新为新的 URL。
- **用途**:适用于服务器内部的请求处理,如负载均衡、请求分发、处理不同后端服务的请求等。
- **SEO 影响**:由于客户端不感知转发,因此转发不会影响 SEO。
- **重定向**:在 Nginx 中可以通过 `return 301/302` 指令实现,在 Apache 中可以通过 `.htaccess` 文件中的 `Redirect` 或 `RedirectMatch` 指令实现。
- **转发**:在 Nginx 中可以通过 `proxy_pass` 指令实现,在 Apache 中可以通过 `mod_proxy` 和 `mod_rewrite` 模块实现。
# 代理服务器的 Nginx 配置
server {
    listen 80;
    server_name proxy.oldboylinux.cn;
    error_log /var/log/nginx/proxy-error.log notice;
    access_log /var/log/nginx/proxy-access.log main;

    location / {
        proxy_pass  http://myapp;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
    }
    location /a {			# 将所有/a请求返回403
        return 403;
    }
    
    `
    `
    `
    `
    [root@node1 conf.d]# curl 192.168.116.145:/a
<html>
<head><title>403 Forbidden</title></head>

<body>
<center><h1>403 Forbidden</h1></center>

<hr><center>nginx/1.20.1</center>

</body>

</html>

1. 简单的重定向(301 永久重定向)

301 重定向用于永久性的 URL 变更,而 302 重定向用于临时性的 URL 变更。在进行网站迁移或结构调整时,选择合适的重定向类型对于维护网站的 SEO 表现至关重要。

server {
    listen 80;
    server_name example.com;

    location / {
        return 301 http://www.example.com$request_uri;
    }
}

这个配置会将所有对 example.com 的请求重定向到 www.example.com

2. 基于正则表达式的重定向

server {
    listen 80;
    server_name example.com;

    location ~* ^/old/(.*)$ {
        rewrite ^/old/(.*)$ /new/$1 permanent;
    }
}

这个配置会将所有以 /old/ 开头的请求重定向到 /new/,并且使用 301 永久重定向。

3. 重定向到 HTTPS

server {
    listen 80;
    server_name example.com;

    location / {
        return 301 https://$host$request_uri;
    }
}

这个配置会将所有 HTTP 请求重定向到 HTTPS。

4. 基于条件的重定向

server {
    listen 80;
    server_name example.com;

    location / {
        if ($http_user_agent ~* MSIE) {
            return 301 http://ie.example.com$request_uri;
        }
        return 301 http://www.example.com$request_uri;
    }
}

这个配置会根据用户代理(User-Agent)来决定重定向的目标。如果用户使用的是 Internet Explorer,请求会被重定向到 ie.example.com,否则重定向到 www.example.com

5. 重定向非 www 到 www

server {
    listen 80;
    server_name example.com;

    location / {
        return 301 http://www.example.com$request_uri;
    }
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        # 处理请求的配置
    }
}

这个配置会将所有非 www 的请求重定向到 www 子域。

请注意,这些只是示例配置,实际使用时需要根据你的具体需求进行调整。在应用任何配置更改之前,确保你已经备份了当前的 Nginx 配置文件,并且在应用新配置后测试以确保一切按预期工作。

6. rewrite

允许在 Nginx 处理请求之前重写请求 URI。这可以用于实现 URL 重定向、URL 重构、去除 URL 中的某些部分、添加特定的路径前缀等。

rewrite ^old-path$ new-path last; # 重写 old-path$开头的URL

location / {					# 如果用户代理包含 MSIE,则重写到 old-browser.html。
    if ($http_user_agent ~* MSIE) {
        rewrite ^ /old-browser.html last;
    }
}

rewrite ^api/(.*)$ http://api.example.com/$1 last; # 令将 /api/something 重写为 http://api.example.com/something。
# 在 rewrite ^/path/to/(.+)/end$ /new-path?param=$1 last; 这个例子中,(.+) 是第一个捕获组,它匹配 /path/to/ 和 /end 之间的任何非空字符串。这个匹配的内容被存储为 $1,

  • ~ 表示区分大小写的正则匹配。
  • ~* 表示不区分大小写的正则匹配。
  • \d:表示任何一个数字,等同于 [0-9]
  • +:表示前面的元素(在这个例子中是 \d)出现一次或多次。
  • (\d+) 这个正则表达式模式会匹配任何一串连续的数字
  • (.*) 匹配任何长度的字符串,包括空字符串。
  • .:表示匹配任何单个字符(除了换行符)。
  • $ 符号表示请求 URI 的结束
在 Nginx 中,`redirect`、`permanent`、`break` 和 `last` 是与 `rewrite` 指令一起使用的标记,它们控制重写行为和请求处理流程。以下是这些标记的具体用法和效果:
redirect
  • 用途:用于发送一个临时的重定向响应(HTTP 302)。
  • 效果:告诉客户端(如浏览器)去访问一个新的 URI,客户端会收到一个 302 状态码和 Location 响应头,指示新的 URI。客户端会根据 Location 头信息重新发起 HTTP 请求。
  • 示例
rewrite ^old-path$ /new-path redirect;

如果用户访问 old-path,Nginx 会发送一个 302 重定向,告诉用户去 new-path

permanent
  • 用途:用于发送一个永久的重定向响应(HTTP 301)。
  • 效果:与 redirect 类似,但是发送的是 301 状态码,表示资源已经永久移动到新的 URI。搜索引擎优化(SEO)中推荐使用 301 重定向,因为它会告诉搜索引擎旧的页面已经被永久替换。
  • 示例
rewrite ^old-path$ /new-path permanent;

如果用户访问 old-path,Nginx 会发送一个 301 重定向,告诉用户去 new-path,并且搜索引擎会更新其索引,指向新的 URI。

break
  • 用途:用于终止重写搜索。
  • 效果:当 Nginx 处理到带有 break 标记的 rewrite 规则时,它会停止进一步的重写搜索,即使后面还有其他 location 规则。
  • 示例
location / {
    rewrite ^/path/to/break$ /new-path break;
}

如果请求匹配 /path/to/break,Nginx 会重写请求到 /new-path 并停止进一步的重写搜索。

last
  • 用途:用于停止当前重写搜索,并重新启动基于新 URI 的重写搜索。
  • 效果:当 Nginx 处理到带有 last 标记的 rewrite 规则时,它会停止当前的重写搜索,并以新的 URI 重新发起内部请求,然后继续匹配 location 规则。
  • 示例
location / {
    rewrite ^/path/to/last$ /new-path last;
}

如果请求匹配 /path/to/last,Nginx 会重写请求到 /new-path 并重新检查 location 规则,以确定如何处理 /new-path 的请求。

开启 rewrite_log

要查看 Nginx 的重写日志,你需要在配置文件中开启 rewrite_log。这通常在 http 块中设置:

http {
    rewrite_log on;
}

开启 rewrite_log 后,Nginx 会记录重写过程中的详细信息,这对于调试重写规则非常有用。

请注意,permanent 标记在 Nginx 1.3.12 之前的版本中实际上是发送 302 状态码,而不是 301。从 Nginx 1.3.12 版本开始,permanent 标记发送 301 状态码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

死磕java的孤行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值