Nginx常用基础配置详解
介绍
Nginx 是一个高性能的开源 Web 服务器,它不仅可以作为 HTTP 服务器使用,还可以用作反向代理服务器、负载均衡器、缓存服务器等。在实际应用中,正确配置 Nginx 是确保网站稳定性和性能的重要步骤。本文将详细介绍一些常用的 Nginx 基础配置,包括虚拟主机配置、HTTP 重定向、反向代理等内容,并提供详细的示例说明。
虚拟主机配置
虚拟主机是 Nginx 中非常重要的概念,它允许您在一台服务器上托管多个网站。下面是一个简单的虚拟主机配置示例:
1 | server { |
- **
listen 80;**:指定Nginx监听的端口号。 - **
server_name example.com www.example.com;**:指定虚拟主机的域名。 - **
root /var/www/example;**:指定网站的根目录。 - **
index index.html index.htm;**:指定默认的索引文件。 - **
location /**:配置请求的URL路径。 - **
try_files $uri $uri/ /index.html;**:尝试寻找与请求URI匹配的文件,如果找不到则返回index.html。
HTTP 重定向
HTTP 重定向是将一个 URL 请求重定向到另一个 URL 的过程。下面是一个简单的 HTTP 重定向配置示例:
1 | server { |
这个配置会将所有访问 www.example.com 的请求重定向到 example.com,保证网站的访问统一性。
反向代理
Nginx 反向代理是将客户端的请求转发给后端服务器的过程,常用于负载均衡和隐藏后端服务器。下面是一个简单的反向代理配置示例:
1 | server { |
- **
proxy_pass http://backend_server;**:指定后端服务器的地址。 - **
proxy_set_header**:设置代理请求的头部信息,如Host、X-Real-IP、X-Forwarded-For等。
SSL/TLS 配置
SSL/TLS 是保护网站安全的重要手段,Nginx 提供了丰富的 SSL/TLS 配置选项。下面是一个简单的 SSL/TLS 配置示例:
1 | server { |
- **
listen 443 ssl;**:指定监听的端口号,并开启 SSL。 - **
ssl_certificate 和 ssl_certificate_key**:指定 SSL 证书和私钥的路径。 - **
ssl_protocols**:指定允许的 SSL/TLS 协议版本。 - **
ssl_prefer_server_ciphers on;**:优先使用服务器端的加密算法。 - **
ssl_ciphers**:指定允许的加密算法。
隐藏 Nginx 版本信息
要隐藏 Nginx 版本信息,您可以通过在配置文件中进行相应的设置来实现。具体来说,您需要修改 nginx.conf 文件,使用 server_tokens off; 指令来关闭 Nginx 的版本号显示。以下是如何进行配置的示例:
1 | http { |
将上述配置添加到 nginx.conf 文件的 http 块中即可禁用 Nginx 版本号显示。
禁止 ip 直接访问 80 端口
要禁止直接通过 IP 地址访问 80 端口,您可以通过 Nginx 配置文件进行相应的设置。具体来说,您可以配置一个默认的 server 块,用于捕获所有请求,并返回一个错误页面或者重定向到其他地址。以下是一个示例配置:
1 | server { |
在这个配置中:
- **
listen 80 default_server;**:指定Nginx监听默认的HTTP端口,并将此server块标记为默认服务器。 - **
server_name _;**: 表示该server块将匹配所有请求。 - **
return 444;**: 是一个特殊的Nginx返回指令,它会立即关闭客户端连接,相当于不做任何响应。
通过这样的配置,当有请求通过 IP 地址直接访问 80 端口时,Nginx 将返回一个 444 错误,不会提供任何内容,从而实现了禁止直接访问 80 端口的目的。
启动 web 服务 (react 项目为例)
1 | server { |
在这个配置中:
- **
listen 80;**: 指定 Nginx 监听的端口号。 - **
server_name _;**: 表示该server块将匹配所有请求。 - **
location /**: 配置请求的 · 路径,尝试寻找与请求URI匹配的文件,如果找不到则返回index.html。 - **
add_header X-Frame-Options SAMEORIGIN;**:设置响应的头部信息X-Frame-Options,不允许我们的页面嵌套到第三方网页里面。 - **
root /var/nginx/html;**: 指定网站的根目录,这里是React项目构建后的静态文件目录。 - **
index index.html;**: 指定默认的索引文件。 - **
try_files $uri $uri/ /index.html;**:尝试寻找与请求URI匹配的文件,如果找不到则返回index.html。
一个web服务,配置多个项目 (location 匹配路由区别)
1 | server { |
在上述配置中
- **
location ^~ /user/**:使用^~修饰的location块,匹配以/user/开头的URI。如果请求的URI以/user/开头,则Nginx将立即停止搜索其他location块,而是使用这个location块进行处理,location块里面使用反向代理,指向服务器http://localhost:8001的地址。 - **
location ^~ /product/**:同上,匹配以/product/开头的URI。
PC端和移动端使用不同的项目文件映射
要在 Nginx 中根据用户设备类型(例如PC端和移动端)使用不同的项目文件映射,您可以使用 map 指令创建一个变量,根据用户的 User-Agent 头部信息来判断设备类型,并使用if语句根据变量的值来选择不同的文件映射。以下是一个示例配置:
1 | map $http_user_agent $is_mobile { |
或者
1 | server { |
在这个配置中:
- **
map $http_user_agent $is_mobile**:创建一个变量$is_mobile,根据$http_user_agent中的User-Agent头部信息判断设备类型。如果User-Agent中包含iphone、android、mobile等关键词,则将$is_mobile设置为1,否则设置为0。 - **
location /**:对所有请求进行匹配。 - **
if ($is_mobile)**:使用if语句根据$is_mobile的值判断设备类型。如果是移动设备,则将请求映射到/var/www/mobile/目录;否则映射到/var/www/desktop/目录。 - **
try_files $uri $uri/ /index.html;**:尝试寻找与请求URI匹配的文件,如果找不到则返回/index.html。
需要注意的是,尽管 if 语句在 Nginx 中是有效的,但它可能会导致性能问题,并且在某些情况下可能不起作用。如果您担心性能问题,可以考虑使用更高效的方法,如根据不同的 User-Agent 头部信息设置不同的变量,并使用 map 指令匹配。
配置负载均衡
要在 Nginx 中配置负载均衡,您可以使用 upstream 块定义一组后端服务器,并在 server 块中使用 proxy_pass 指令将请求代理到这组后端服务器。以下是一个示例配置:
1 | http { |
在这个配置中:
- **
upstream backend**:定义了一个名为backend的负载均衡组,其中包含了三个后端服务器:backend1.example.com、backend2.example.com和backend3.example.com。 - **
server块中的location /**:匹配所有请求。 - **
proxy_pass http://backend;**:将请求代理到名为backend的负载均衡组中的服务器。Nginx会自动根据默认的负载均衡算法(轮询)将请求分发到这组后端服务器中的一个。 - **
proxy_set_header**:设置代理请求的头部信息,如真实IP地址、转发者IP地址和主机地址。
您还可以根据需要添加其他负载均衡配置选项,例如设置负载均衡算法、调整权重等。以下是一个更复杂的负载均衡配置示例:
1 | http { |
在这个配置中:
- **
least_conn**:使用最少连接数算法进行负载均衡。 - **
server backend1.example.com weight=3;**:设置backend1.example.com的权重为3,比其他后端服务器更具优先级。 - **
proxy_set_header**:设置代理请求的头部信息,如真实IP地址、转发者IP地址和主机地址。
总结
本文介绍了一些常用的 Nginx 基础配置,包括虚拟主机配置、HTTP 重定向、反向代理、SSL/TLS 配置等内容,并提供了详细的示例说明。正确配置 Nginx 不仅可以提高网站的性能和安全性,还能提升用户体验和搜索引擎排名。希望本文能够帮助您更好地理解和应用 Nginx,在实际项目中发挥其作用。
注意:
配置完成后,保存并关闭文件,然后重新加载Nginx以使配置生效:
1 | sudo systemctl reload nginx |