window 常用nginx命令: (在nginx.exe目录下执行)
start nginx //启动
./nginx -s reload // 重启
./nginx -s quit // 优雅关闭服务
./nginx -s stop // 快速关闭服务
root与 alias 区别
root 指令指定的是一个根目录,这个根目录将被附加到 URI 路径的前面。
alias 指令指定的是一个确切的路径,它会替换掉 location 块中的路径。
location /images/ {
root /var/www;
}
当客户端请求 /images/example.png 时,Nginx 将查找文件 /var/www/images/example.png
location /images/ {
alias /var/www/media/;
}
当客户端请求 /images/example.png 时,Nginx 将查找文件 /var/www/media/example.png。
(注:window环境root写法为: root D:\\fe\\myProject)
负载均衡
http {
#设置负载均衡
upstream hot_list {
server localhost:3000 weight=6 max_fails=2 fail_timeout=5s;
server localhost:5000 weight=4 max_fails=2 fail_timeout=5s;
}
server {
listen 80;
location /api/ {
proxy_pass http://hot_list; # 使用定义的负载均衡模块
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
weight=4: 这个服务器的权重是4。权重越大,Nginx 分配到此服务器的请求越多。在此配置中,相对权重表示此服务器将处理总请求的 40%(4/(6+4))。max_fails=2: 定义在fail_timeout时间段内,最多允许失败的次数。如果在这个时间段内失败次数超过此值,Nginx 将临时将此服务器标记为不可用。fail_timeout=5s: 如果一个服务器被标记为不可用,在 5 秒后,Nginx 将重新尝试使用此服务器。这个参数还定义了max_fails参数的时间窗口。
负载均衡策略
1. 轮询(Round Robin)
这是 Nginx 的默认负载均衡策略。Nginx 依次将请求分配给每个后端服务器。每个服务器按顺序接收请求,不考虑服务器的负载和响应时间。
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
2. 最少连接(Least Connections)
这种策略将请求分配给当前处理连接最少的服务器,适用于长连接请求,如 WebSocket。
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
3. IP 哈希(IP Hash)
基于客户端 IP 地址的哈希值来分配请求。同一客户端的请求将始终被分配到同一服务器。这对于需要会话粘性的应用程序很有用。
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
4. 哈希(Hash)
基于指定的键(例如 URI、请求参数)进行哈希来分配请求。这对于某些需要会话粘性的应用程序也是有用的。
upstream backend {
hash $request_uri;
server backend1.example.com;
server backend2.example.com;
}
详细负载均衡可以看: samwho.dev/load-balanc…
翻译地址: juejin.cn/post/728275…
nginx基本配置
server {
#指定服务器监听的端口和地址。
listen 80;
#定义虚拟主机的域名。
server_name example.com www.example.com;
# 默认的location块,用于处理根目录请求
location / {
#指定请求文件的根目录。
root /var/www/html;
#设置默认文件
index index.html index.htm; 。
}
location /api {
#指定代理请求的后端服务器
proxy_pass http://backend;
#设置传递给后端服务器的请求头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 用于处理重定向
location /old-path/ {
# 永久重定向到新的路径
rewrite ^/old-path/(.*)$ /new-path/$1 permanent;
}
# 用于处理静态文件(图片、CSS、JS等)
location /static/ {
# 指定静态文件的根目录
alias /var/www/static/;
# 禁止日志记录
access_log off;
# 缓存静态文件 expires 30d;
}
error_page 404 /404.html; #定义错误页面
gzip on; #启用 gzip 压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; #指定要压缩的 MIME 类型。
access_log /var/log/nginx/access.log; #设置访问日志文件路径
error_log /var/log/nginx/error.log warn; #设置错误日志文件路径和级别
}
不带斜杠的 proxy_pass http://backend; 请求 http://example.com/api/foo/bar 会被转发为 http://backend/api/foo/bar。
带斜杠的 proxy_pass http://backend/; 请求 http://example.com/api/foo/bar 会被转发为 http://backend/foo/bar
nginx 内置变量
通用变量
$arg_name:如果请求 URI 中没有参数name,则变量为空字符串。$args:如果请求 URI 中没有参数,则变量为空字符串。$binary_remote_addr:表示客户端 IP 地址的二进制形式,通常没有默认值。$body_bytes_sent:传送给客户端的字节数,响应头不计算在内,默认值为0。$content_length:Content-Length请求头的值,如果没有提供,则变量为空字符串。$content_type:Content-Type请求头的值,如果没有提供,则变量为空字符串。$cookie_name:cookiename的值,如果没有提供该 cookie,则变量为空字符串。$document_root:当前请求在 root 指令中指定的值,没有请求时为空字符串。$host:请求主机头字段,或者服务器名称。如果请求中没有Host头字段,则为服务器的第一个server_name指令的值。$hostname:服务器的主机名,通常由操作系统配置。$http_name:HTTP 请求头name的值,如果没有提供该请求头,则变量为空字符串。$https:如果使用 SSL 安全连接,则值为 “on”,否则为空字符串。$is_args:如果请求 URI 包含参数,则值为?,否则为空字符串。$limit_rate:用于设置响应的传输速率,默认情况下没有限制。$query_string:与$args相同。$remote_addr:客户端的 IP 地址,没有请求时为空字符串。$remote_port:客户端的端口,没有请求时为空字符串。$remote_user:已通过 Auth Basic 模块认证的用户名,如果没有认证,则变量为空字符串。$request:包含请求类型、URI 和 HTTP 版本的信息,没有请求时为空字符串。$request_body:请求体的内容,没有请求体时为空字符串。$request_body_file:客户端请求体的临时文件名,如果请求体不大或者没有请求体,则变量为空字符串。$request_completion:如果请求完成,值为OK,否则为空字符串。$request_filename:当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成,没有请求时为空字符串。$request_length:请求的总长度(包括请求行、请求头和请求体),没有请求时为空字符串。$request_method:HTTP 请求方法,如 “GET” 或 “POST”,没有请求时为空字符串。$request_time:从接收请求到完成响应的时间,没有请求时为空字符串。$request_uri:带参数的原始请求 URI,不包含主机名,没有请求时为空字符串。$scheme:请求使用的协议,http或https,没有请求时为空字符串。$server_addr:服务器的地址,默认是监听地址,可以通过 listen 指令绑定。$server_name:服务器名称,默认为匹配请求的server_name指令的值。$server_port:请求到达的服务器端口,默认为监听端口。$server_protocol:请求使用的协议版本,如HTTP/1.1,没有请求时为空字符串。$status:响应的状态码,没有请求时为空字符串。$time_iso8601:ISO 8601 标准格式的时间,没有请求时为空字符串。$time_local:本地时间,格式:%d/%b/%Y:%H:%M:%S %z,没有请求时为空字符串。
特定模块的变量
$args:在请求 URI 中的参数部分(参数字符串),没有请求时为空字符串。$binary_remote_addr:客户端地址的二进制表示,没有请求时为空字符串。$body_bytes_sent:发送给客户端的主体字节数,默认值为0。$connection:连接序列号,默认值为0。$connection_requests:当前通过一个连接到来的请求数量,默认值为1。$content_length:Content-Length请求头的值,如果没有提供,则变量为空字符串。$content_type:Content-Type请求头的值,如果没有提供,则变量为空字符串。$cookie_name:请求中的 cookiename的值,如果没有提供该 cookie,则变量为空字符串。$document_root:当前请求的文档根目录或 alias 指定的路径,没有请求时为空字符串。$http_name:请求头name的值,如果没有提供该请求头,则变量为空字符串。$https:如果连接使用 SSL 安全连接则值为 "on",否则为空字符串。$is_args:如果请求 URI 包含参数则值为 "?",否则为空字符串。$limit_rate:用于限制响应速率,默认情况下没有限制。$msec:当前时间的毫秒数。$nginx_version:nginx 的版本。$pid:工作进程的 PID。$pipe:如果请求来自管道连接(pipe)则值为 "p",否则为空字符串。$proxy_add_x_forwarded_for:客户端地址列表,代理服务器地址。$realpath_root:当前请求的真实根目录。$request_completion:如果请求完成则值为 "OK",否则为空字符串。$request_id:请求的唯一标识符。$sent_http_name:响应头name的值,如果没有该响应头,则变量为空字符串。$ssl_cipher:SSL 连接使用的加密套件,如果没有使用 SSL 则为空字符串。$ssl_protocol:SSL 连接使用的协议,如果没有使用 SSL 则为空字符串。$ssl_session_id:SSL 会话的唯一标识符,如果没有使用 SSL 则为空字符串。$uid_got:UID 从 cookie,如果没有提供该 cookie 则为空字符串。$uid_reset:UID 从 cookie 被重置,如果没有提供该 cookie 则为空字符串。