错误日志级
- debug:记录大量的调试信息,用于开发和调试时使用。
- info:记录关键信息,如请求处理的重要事件、配置文件的加载等。
- notice:记录正常的操作消息,如启动、停止、重新加载配置文件等。
- warn:记录可能的问题或警告信息,但不会影响Nginx的正常运行。
- error:记录错误信息,这些错误可能会导致请求处理失败或系统性能下降。
- crit:记录严重错误,这些错误通常会导致Nginx服务崩溃或无法继续运行。
- alert:记录需要立即处理的严重错误,通常涉及到系统安全性或数据完整性问题。
- 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 指令。下面是一些示例配置和说明。
- 安装和启动后端应用程序服务器(例如,FastCGI、uWSGI 或应用程序服务器)。
在配置 Nginx 之前,确保已经安装并成功启动了后端应用程序服务器,并且它正在监听某个地址和端口上。
- 配置 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)。将 端口号 替换为后端应用程序服务器监听的端口号。
- 重新加载或重启 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 地址。
配置缓存
HTTP缓存,它是一种网络协议缓存机制,用于存储网页、图片、脚本、样式表等资源的副本,以便在后续请求时可以直接从缓存中获取,而不需要再次从服务器下载。HTTP缓存可以显著提高网站性能和用户体验,因为它减少了网络延迟和服务器的负载。
在Nginx中设置缓存主要有两种方式:
- 浏览器缓存(客户端缓存):
- 通过设置
expires
指令,Nginx告诉浏览器资源的过期时间。在这个时间之前,浏览器会直接从本地缓存中读取资源,而不会向服务器发送请求。 - 例如,
expires 1d;
意味着资源将在1天后过期,浏览器在这1天内会使用本地缓存的资源。
- 通过设置
- 代理缓存(服务器端缓存):
- 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
规则的小结:
- 基本匹配:
location /
:匹配所有请求。location /path/
:匹配以/path/
开头的请求。
- 正则表达式匹配:
location ~ regex
:区分大小写的正则表达式匹配。location ~* regex
:不区分大小写的正则表达式匹配。
- 精确匹配:
location = /path/
:精确匹配/path/
,不进行正则表达式匹配。
- 特殊字符:
- 在正则表达式中,特殊字符(如
*
、.
、?
、[
等)需要使用反斜杠\
进行转义。
- 在正则表达式中,特殊字符(如
- 优先级:
- Nginx会按照配置文件中的顺序,从上到下匹配
location
指令。 - 精确匹配(
=
)的优先级最高,其次是正则表达式匹配(~
和~*
),最后是前缀匹配(无修饰符)。
- Nginx会按照配置文件中的顺序,从上到下匹配
- 变量使用:
- 在
location
中可以使用变量,例如location $request_uri
。
- 在
- 通配符匹配:
location /images/
:匹配以/images/
开头的请求。location /images/*
:匹配以/images/
开头,后面跟着任意字符的请求。
- 命名location:
location @name
:这是一个特殊的location,用于命名一个location,可以在error_page指令中引用。
- 嵌套location:
location
块可以嵌套在另一个location
块内部,但需要注意优先级和匹配顺序。
- 使用场景:
- 用于定义不同的请求处理规则,如静态文件服务、代理设置、重定向、日志记录等。
- 配置示例:
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为例)通常涉及以下步骤:
- 下载新版本的Nginx:
下载新版本的Nginx源码包,例如nginx-1.20.1.tar.gz
,并解压。
tar zxvf nginx-1.20.1.tar.gz
- 配置和编译新版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
- 备份旧版Nginx二进制文件:
在进行升级前,确保备份旧版的Nginx二进制文件和配置文件。
cp -f objs/nginx /usr/sbin/nginx
- 拷贝新版Nginx二进制文件:
将编译好的新版Nginx二进制文件拷贝到原位置,覆盖旧版文件。
cp -f objs/nginx /usr/sbin/nginx
- 拷贝编译生成的库文件:
如果新版Nginx编译生成了新的库文件,也需要将它们拷贝到相应的目录下。
cp objs/*.so /usr/lib/nginx/modules/
- 检查Nginx版本:
使用nginx -V
命令检查Nginx版本是否已更新。
nginx -V
- 测试新版Nginx配置文件:
使用nginx -t
命令测试新版Nginx的配置文件是否正确。
nginx -t
- 平滑升级:
发送USR2信号给Nginx主进程,启动新版本的工作进程,同时旧进程继续处理当前请求直到完成。
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
- 优雅关闭旧进程:
发送WINCH信号给旧Nginx主进程,使其逐步关闭旗下的工作进程。
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid`
- 确认升级成功:
确认所有请求都已平滑过渡到新的工作进程,并且旧的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 状态码。