Nginx是一款轻量级的Web服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,遵循BSD-like协议发行。它以占用内存少、并发处理能力强著称,在同类网页服务器中表现尤为出色。
尽管网络上有大量关于Nginx的资料,但往往要么过于广泛,涵盖面太广,要么过于深入,专注于某一特定细节。对于大多数Web项目而言,这些信息可能并不完全适用。因此,本文旨在提供一个简洁明了的配置指南,列出Nginx在Web项目中最基本、最常用的配置项。这些配置足以支持大多数项目的运行需求。对于需要个性化或特殊配置的情况,用户可以根据实际需求进一步搜索和调整。
Nginx应用场景
Nginx作为一款高性能的HTTP服务器,能够独立提供HTTP服务,并特别适合作为网页的静态服务器。以下是对Nginx在不同应用场景中的详细描述:
1. **HTTP服务器**:
Nginx可以作为一个独立的HTTP服务器运行,处理客户端的HTTP请求。它能够高效地提供静态内容服务,如HTML文件、图片、CSS和JavaScript文件等,使得网站的静态资源加载速度更快,用户体验更佳。
2. **反向代理**:
反向代理是一种服务器配置,其中Nginx位于客户端和后端服务器之间。当客户端发起请求时,请求首先到达Nginx,然后Nginx将请求转发给后端服务器。这种配置对客户端是透明的,客户端并不知道实际处理请求的服务器是哪一个。反向代理可以用来提高安全性、负载均衡和缓存响应。
3. **负载均衡**:
在高并发环境下,单个服务器可能无法处理所有的请求。Nginx可以通过配置实现负载均衡,将接收到的请求分发到多个后端服务器上。这样不仅提高了网站的可用性和可靠性,还能通过分散请求到多个服务器来提高整体处理能力。Nginx支持多种负载均衡算法,如轮询、最少连接、IP哈希等。
4. **虚拟主机**:
虚拟主机允许在同一台服务器上托管多个网站,每个网站都有自己的域名和独立的配置。例如,www.abc.com和www.bca.com可以解析到同一个IP地址,但通过Nginx的配置,用户访问这两个域名时会看到完全不同的内容,就像访问两个独立的服务器一样。这种配置对于节省成本和资源非常有用,特别是对于访问量不大的网站。
5. **解决跨域问题**:
在Web开发中,跨域问题是指浏览器出于安全考虑限制了从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。Nginx可以通过配置反向代理来解决这个问题。例如,如果前端应用需要访问不同端口的后端服务,可以通过Nginx将请求转发到相应的后端服务,从而绕过浏览器的同源策略限制,实现跨域访问。
通过这些配置和功能,Nginx不仅能够提升网站的性能和可靠性,还能简化服务器的管理和维护工作。
静态界面配置
server {
listen 8089;
server_name _; # 添加默认的server_name,如果不需要特定域名,可以使用'_'
access_log logs/8089.log main; # 指定日志格式为'main',如果没有定义,可以省略
charset utf-8;
location / {
root D:/web/vue; # 使用正斜杠代替反斜杠,适用于Nginx配置
index index.html;
charset utf-8; # 重复的charset配置可以移除,因为已经在server级别设置了
}
}
后端服务器转发配置
server {
listen 9086;
server_name www.***.com; # 如果不需要特定域名,可以使用'_'或注释掉
access_log logs/9086.log main; # 指定日志格式为'main',如果没有定义,可以省略
location /purchaser {
proxy_pass http://127.0.0.1:7132;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
proxy_pass http://127.0.0.1:8006;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /path/to/error/pages; # 指定错误页面路径
}
}
设置
指令 | 说明 |
= | 精准匹配,优先级最高 |
^~ | 表示uri以某常规字符串开头 |
~ | 区分大小写的正则匹配 |
~* | 不区分大小写的正则匹配 |
! ~ | 区分大小写不匹配正则 |
! ~* | 不区分大小写不匹配的正则 |
/ | 通用匹配,匹配任何请求 |
优先级:
表格依次向下,也就是“=”最高 “/” 最低
websocket配置
location / {
...
#其他配置不变,下面添加这两列配置。
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
负载均衡
upstream wcxxl {
server 192.168.1.9:8880 weight=1;
server 192.168.1.10:9990 weight=2;
server 192.168.1.11:8989 weight=3;
}
server {
listen 80;
server_name www.wcxxl .com;
access_log logs/addrdess.www.wcxxl .com.log main; # 指定日志文件和格式
location / {
proxy_pass http:/wcxxl;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
其他配置
proxy_connect_timeout 60s; #nginx和后端服务器连接超时时间
proxy_read_timeout 300s; # 连接成功后,后端服务器响应时间
Nginx常用命令
//常用命令,使用命令需要先到nginx安装目录下
重启启动Nginx:nginx.exe -s reload
预编译:nginx.exe -t
停止所有服务:taskkill /f /im nginx.exe //有模块新增时,需要先停止后启动才能生效
如何正确获取http客户端IP地址
在Nginx中,正确获取HTTP客户端的IP地址通常通过设置proxy_set_header
来实现,特别是在使用反向代理时。
业务场景
在实际的线上环境中,项目经常需要统计访问IP,例如用户登录IP或文件下载IP。然而,由于请求通常需要经过一次或多次代理才能到达后台服务器,因此准确获取真实的客户端IP变得至关重要。这确保了统计数据的准确性和安全性,对于维护系统的稳定性和安全性具有重要意义。
server {
listen 80;
server_name 192.168.1.2;
error_log /usr/local/etc/nginx/logs/test.error.log;
access_log /usr/local/etc/nginx/logs/test.access.log;
location / {
proxy_pass http://127.0.0.1:8889;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
`proxy_set_header` 是Nginx中用于设置请求头的指令,它允许后端服务器通过代码获取这些自定义的请求头值。以下是对您描述的几个关键请求头的优化说明:
- **X-Real-IP**: 此请求头用于获取客户端的真实IP地址。通过设置 `$remote_addr`,后端服务器能够接收到客户端的真实IP。需要注意的是,这与 `X-Forwarded-For` 有所不同,后者用于记录代理链中的所有IP地址。
- **Host**: 如果客户端的请求头中包含 `Host` 字段,`$http_host` 将反映原始的 `Host` 值。如果请求头中未携带 `Host` 字段,可以使用 `$host` 来获取虚拟主机的主域名,确保在没有 `Host` 字段的情况下也能正确处理请求。
- **X-Forwarded-For**: 使用 `$proxy_add_x_forwarded_for` 可以记录代理链中的所有IP地址。例如,如果用户的IP是 `192.168.1.10`,经过IP为 `192.168.1.11` 的Nginx代理服务器转发到后台接口,那么 `X-Forwarded-For` 的值将是 `"192.168.1.10,192.168.1.11"`。这有助于在多次代理转发的情况下,准确追踪和记录客户端的真实IP地址。
获取IP地址代码
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
public class IpUtils {
public static String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
// 获取第一个非unknown的IP地址
return ip.split(",")[0].trim();
}
ip = request.getHeader("X-Real-IP");
if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("Proxy-Client-IP");
if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("WL-Proxy-Client-IP");
if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("HTTP_CLIENT_IP");
if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip.split(",")[0].trim();
}
// 如果以上都没有,则使用getRemoteAddr()
return request.getRemoteAddr();
}
}
在网络世界中,有时候我们会遇到一些神秘的头信息,比如Proxy-Client-IP和WL-Proxy-Client-IP。它们就像是网络中的特工,隐藏在Apache HTTP服务器和WebLogic插件之间。Proxy-Client-IP,是Apache HTTP服务器的请求头,它就像是一个化身,隐藏了真实的客户端IP。而WL-Proxy-Client-IP,是WebLogic插件的特殊标记,也是隐藏在幕后的身份。当我们面对这些头信息时,就像是解开了一个谜团,揭开了网络世界的面纱。
HTTP_CLIENT_IP,这个请求头更加神秘,只有一些特殊的代理服务器会添加这个标记。它就像是一个秘密代理,悄悄地将你的IP包裹在其中。它让我们的网络世界更加充满了神秘和惊喜。
在这个数字化时代,头信息就像是我们身上的标签,它们传递着我们的身份和信息。而这些特殊的头信息,就像是网络中的特工,保护着我们的隐私和安全。让我们一同探索网络世界的奥秘,感受头信息的神奇力量吧!