nginx的配置与使用
这篇文章限于window下对nginx配置与应用
在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动、停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍
1.启动
start nginx
如果需要特殊设置nginx的配置文件路径,可以这样执行start nginx -c conf/nginx.conf
2.停止
nginx -s stop
3.重新载入Nginx
nginx -s reload
4.nginx的日志,一般有两个文件 logs/access.log 和 logs/error.log
5.root和alias的区别
在Nginx配置文件中,root
和 alias
指令有着不同的用途和行为。它们主要用于指定静态文件和服务的根目录位置
(1)root的配置
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
当用户访问 http://example.com/index.html
时,Nginx会在 /var/www/html/index.html
寻找文件
如果将 location / 修改 location /v,即按照如下的配置,需要路径的访问会发生本质的变化
server {
listen 80;
server_name example.com;
location /v/ {
root /var/www/html;
}
}
当用户访问 http://example.com/v/picture.jpg
时,Nginx 会进行如下操作,根据 location /v/
块中的 root /var/www/html;
指令,Nginx 将会去 /var/www/html/v/picture.jpg
这个路径下寻找文件
(2)alias的配置
server {
listen 80;
server_name example.com;
root /var/www/html;
location /v/ {
alias /usr/share/nginx/images/;
}
}
在这个配置示例中,当用户访问 http://example.com/v/picture.jpg
时,Nginx 将会去 /usr/share/nginx/images/picture.jpg
路径下寻找文件。这是因为您在 location /v/
块中使用了 alias
指令来指定 /usr/share/nginx/images/
作为根目录
关键区别
-
路径解析:
root
: 当你使用root
指令时,Nginx会将请求的URI与root
路径拼接起来寻找文件。alias
: 当你使用alias
指令时,Nginx会将请求的URI直接匹配到文件系统中的路径。
6.location常见配置
(1)匹配规则
类型 | 含义 | 匹配方式 | 优先级 | 样式 |
=/路径 | 精确匹配 | 前缀 | 1 | location =/image {} |
^~ | 优先匹配 | 前缀 | 2 | location ^~ /page {} |
~ | 普通正则-大小写敏感 | 正则符号 | 3 | location ~ .(jpe?g)$ {} |
~* | 普通正则-大小写不敏感 | 正则符号 | 3 | location ~* .(jpe?g)$ {} |
空 / | 通用匹配 | 前缀 | 4 | location / {} |
空 <路径> | 前缀匹配 | 前缀 | * | location /index {} |
(2)匹配优先级
优先级: 精确匹配 > location 完整路径 > 优先匹配 > 正则匹配 >location 部分路径 > 通用匹配
(3)匹配示例
location =/ {} # 精确规则
location =/login {} # 精确规则
location ^~ /static/ {} # 优先匹配
location ~ \.(gif|jpg|png|js|css)$ {} # 正则规则
location ~* \.png$ {} # 正则规则
location / {} # 通过规则
7.location临时跳转
在 Nginx 中,return
指令可以用来发送一个 HTTP 重定向响应给客户端。如果您想使用 location
块来执行一个 302 临时重定向,可以使用 return
指令配合适当的 HTTP 状态码。
假设您希望所有访问 /oldpath
的请求都被重定向到 /newpath
,并且使用 302 临时重定向,可以在 location
块中使用 return
如下
server {
listen 80;
server_name example.com;
location /oldpath {
return 302 /newpath;
}
location /newpath {
# 处理新路径的逻辑
}
}
在这个例子中,当用户访问 http://example.com/oldpath
时,Nginx 将发送一个 302 重定向响应,告诉浏览器跳转到 http://example.com/newpath
。
详细说明
-
return
指令:return
指令用于立即终止处理请求,并发送一个固定的响应。- 在上面的例子中,
return 302 /newpath;
表示返回一个 302 重定向,并将新的 URL 设置为/newpath
。
-
HTTP 状态码:
302
表示“临时重定向”,表示请求的资源已经被临时移动到了另一个位置。- 其他可用的状态码包括
301
(永久重定向)、303
(查看其他)、307
(临时重定向,保持请求方法不变)等。
-
重定向路径:
- 重定向的目标路径可以是绝对路径(例如,
http://example.com/newpath
),也可以是相对路径(例如,/newpath
)。 - 如果使用相对路径,Nginx 会基于原始请求的 URL 来构建重定向后的 URL。
- 重定向的目标路径可以是绝对路径(例如,
使用 302 重定向不会被大多数浏览器缓存,除非显式设置了缓存控制头
8.反向代理
Nginx 作为一款高性能的 Web 服务器和反向代理服务器,可以非常有效地实现反向代理功能。反向代理是一种网络架构模式,在这种模式中,客户端并不直接连接到最终的服务端,而是通过一个中间层(即反向代理服务器)来转发请求和响应
假设您有以下 Nginx 配置,它将所有以 /api
开头的请求转发到 http://backend.example.com
server {
listen 80;
server_name example.com;
location /api {
proxy_pass http://backend.example.com;
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;
}
}
注意事项
-
路径处理:
proxy_pass
指令中的 URL 不包含路径部分,Nginx 会将请求的路径附加到目标 URL 上。例如,如果请求 URL 是http://example.com/api/users/123
,则实际转发的 URL 将是http://backend.example.com/api/users/123
。
-
请求头传递:
- 使用
proxy_set_header
指令来传递必要的请求头,例如Host
、X-Real-IP
、X-Forwarded-For
和X-Forwarded-Proto
,这对于确保后端服务器能够正确识别客户端信息非常重要。
- 使用
-
性能优化:
- 考虑使用
proxy_cache
指令来缓存响应,减轻后端服务器的负担。 - 使用
proxy_read_timeout
和proxy_send_timeout
来调整超时设置。
- 考虑使用
-
安全性:
- 如果后端服务器支持 HTTPS,考虑使用
https://
来加密数据传输。 - 使用
proxy_set_header
来传递客户端的原始信息,例如 IP 地址和请求协议。
- 如果后端服务器支持 HTTPS,考虑使用
-
负载均衡:
- 使用
upstream
指令来定义一组后端服务器,并在proxy_pass
中引用它们来进行负载均衡。
- 使用
-
故障转移:
- 可以配置多个后端服务器,并在其中一个不可用时自动切换到另一个。
为了优化上述 Nginx 配置,我们可以添加一些额外的功能,如缓存、安全性和性能方面的改进。下面是一个经过优化的示例配置,包括了缓存、安全性以及性能优化等方面的内容:
server {
listen 80;
server_name example.com;
# 缓存相关设置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 60m;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
# SSL 相关设置
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# HTTP/2 支持
listen [::]:443 ssl http2;
listen 443 ssl http2;
# 日志格式
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;
# 错误日志
error_log /var/log/nginx/error.log;
# 主页静态文件
root /var/www/html;
# 默认首页
index index.html;
# 处理 API 请求
location /api {
proxy_pass http://backend.example.com;
# 设置代理头
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;
# 安全性
proxy_ssl_server_name on;
proxy_ssl_session_reuse on;
proxy_ssl_session_cache shared:SSL:10m;
proxy_ssl_session_tickets off;
# 性能
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 缓存设置
proxy_cache my_cache;
proxy_cache_bypass $http_pragma;
proxy_cache_lock on;
proxy_cache_min_uses 2;
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_cache_methods GET HEAD;
# 缓存状态页面
add_header X-Cache-Status $upstream_cache_status;
}
# 其他 location 块,例如处理静态文件
location / {
try_files $uri $uri/ =404;
}
}
解释配置中的主要更改点:
-
缓存:
proxy_cache_path
: 定义缓存存储的位置。proxy_cache_key
: 定义用于区分缓存条目的键。proxy_cache_valid
: 定义缓存的有效时间。proxy_cache_use_stale
: 在后端服务器出现问题时使用陈旧的缓存数据。
-
安全性:
- SSL/TLS 设置: 配置 SSL 证书和密钥,启用 HTTPS。
proxy_ssl_server_name
: 允许使用 SNI。proxy_ssl_session_reuse
: 重用 SSL 会话以提高性能。proxy_ssl_session_cache
: SSL 会话缓存设置。proxy_ssl_session_tickets
: 禁用 SSL 会话票证,增加安全性。
-
性能:
proxy_buffer_size
: 代理缓冲区的大小。proxy_buffers
: 缓冲区的数量和大小。proxy_busy_buffers_size
: 忙时缓冲区的大小。proxy_temp_file_write_size
: 写入临时文件的大小阈值。proxy_connect_timeout
: 连接后端服务器的超时时间。proxy_send_timeout
: 发送数据到后端服务器的超时时间。proxy_read_timeout
: 读取后端服务器数据的超时时间。
-
日志管理:
log_format
: 自定义日志格式。access_log
: 访问日志文件位置。error_log
: 错误日志文件位置。
-
其他:
- HTTP/2 支持: 启用 HTTP/2 提高性能。
add_header X-Cache-Status
: 添加响应头以显示缓存状态。