一、启动、停止和重新加载配置
前提:先要启动nginx
在Windows上启动nginx的步骤如下:
1. 下载并安装nginx。可以从nginx官网下载适合自己操作系统的版本,一般是zip压缩包,解压到指定目录中。
2. 进入nginx的安装目录,找到nginx.exe文件。
3. 双击nginx.exe文件,启动nginx服务。
4. 启动完成后,可以通过输入http://localhost来访问nginx默认页面,如果看到“Welcome to nginx”字样,说明nginx已经成功启动。
如果想要停止nginx的运行,可以使用命令nginx -s stop。如果需要重启nginx,可以使用命令nginx -s reload。
接下来:
实践如下:
现在端口号是81,我改下配置,改成82。
然后执行 nginx -s reload 重新加载
此时,由于更改了配置,原先的端口就不能用了
需要更改位82端口
好的,这就完成了nginx配置的重加载。
原理
二、提供静态功能
准备:
新建一个 data/www 目录(用来放置自己的html页面)
新建一个 data/images 目录 (用来放置自己的图片)
往images里放张图片
往ww放个自己的html页面
实践
更改一下nginx.conf 配置文件
①注释掉其中所有的内容。
在注释之前,我讲述一下部分的代码的作用。
② 编写nginx.conf文件
这个location
块指定了 “/
”前缀与来自请求的URI进行比较。 对于匹配请求,URI将添加到 根 指令,也就是说,到/data/www
, 在本地文件系统上形成所请求文件的路径。 如果有几个匹配的location
块,nginx 选择前缀最长的一个。 上面的location
块提供了最短的 前缀,长度为1, #36825;,如果所有其他的location
块无法提供匹配,将使用此块。
http {
server {
location / {
root /data/www;
}
}
}
接下来,添加第二个location
块:
它将匹配以/images/
开头的请求 (location /
虽然也匹配这样的请求, 但它是较短的前缀)。
http {
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
③重新加载一下配置文件 nginx -s reload
但是报错了???说没有配置事件,那就给它配置一个。
顺便配置一下它监听的端口(ps:因为我的80端口被占用。默认是localhost:80)
events {
# worker_connections 1024;
}
http {
server {
listen 82;
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
现在就可以了。
你试一下,是不是发现还不行!!!因为root配错了
/data 在windows下指的是 D:/data .........
"D:/data/www/index.html" is not found (3: The system cannot find the path specified), client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "localhost:82"
因此换成相对路径
events {
# worker_connections 1024;
}
http {
server {
listen 82;
location / {
# 等价于下面 root D:/nginx/nginx-1.22.0-copy/nginx-1.22.0/data/ww ;
root data/ww ;
}
location /images/ {
# root D:/nginx/nginx-1.22.0-copy/nginx-1.22.0/data/images/
# 这个要认真辨别一下, 当 访问 /images/ , 此时以 data为父路径,data/images/ 。
# http://localhost:82/images/1.jpg 意味着访问 data/images/1.jpg
root data;
}
}
}
三、设置简单代理服务器
1. 准备一个springboot应用、修改nginx.conf
events {
# worker_connections 1024;
}
http {
server {
listen 82;
location / {
# 等价于下面 root D:/nginx/nginx-1.22.0-copy/nginx-1.22.0/data/ww ;
root data/ww ;
}
location /images/ {
# root D:/nginx/nginx-1.22.0-copy/nginx-1.22.0/data/images/
# 这个要认真辨别一下, 当 访问 /images/ , 此时以 data为父路径,data/images/ 。
# http://localhost:82/images/1.jpg 意味着访问 data/images/1.jpg
root data;
}
# 配置反向代理
location /api/ {
proxy_pass http://localhost:8080/ ;
}
}
}
2. 访问 http://localhost:82/api/hello
很明显,当访问这个地址时,我们被 代理到了 http://localhost:8080/hello
3. 介绍一下正则表达式(跟本章关系不大...)
四、关于一些配置文件的讲解
1. worker_processes
2. 为什么要使用 keepalive ?
3. 关于location的多种匹配方式
4. rewrite
它主要用于实现URL重写(rewriting)和重定向(redirecting)。以下是详细讲解如何使用rewrite
指令:
基本语法
它主要用于实现URL重写(rewriting)和重定向(redirecting)。以下是详细讲解如何使用rewrite
指令:
rewrite regex replacement [flag];
regex
: 正则表达式,用于匹配请求的URI。如果URI与正则表达式匹配,Nginx将执行重写操作。replacement
: 替换字符串,用于替换正则表达式匹配到的部分。可以使用反向引用(如$1
,$2
, ...) 引用正则表达式中捕获的组。[flag]
: 可选的重写标志(flag),用于控制重写行为。常见的标志有:last
: 结束当前重写阶段,继续执行后续的location处理。break
: 结束当前重写阶段,不再执行后续的rewrite
指令,但继续在当前location内处理请求。redirect
: 返回302临时重定向,将浏览器重定向到新的URL。permanent
: 返回301永久重定向,将浏览器重定向到新的URL。
4.1 域名跳转
rewrite ^(.*) http://www.hm.com$1 permanent;
是一个Nginx的rewrite
指令,用于执行URL重写操作。该指令的具体含义如下:
-
^(.*)
:这部分是正则表达式模式,匹配请求的URI(不包括主机名和查询字符串)。^
表示匹配URI的开始,(.*)
表示匹配任意数量的任意字符,并将其捕获为一个正则组(用括号包围)。在本例中,(.*)
将匹配整个URI。 -
http://www.hm.com
:这是重写的目标URL。当匹配到正则表达式时,Nginx将把请求重定向到这个新的URL。 -
$1
:在目标URL中,$1
是一个反向引用,表示引用前面正则表达式中捕获的第一个组(即(.*?)
)。在这里,它将被替换为实际匹配到的URI部分。 -
permanent
:这是一个修饰符,表示这次重写应该以HTTP状态码301(Moved Permanently,永久重定向)进行响应。浏览器收到这样的响应后,不仅会立即跳转到新的URL,还会记住这个重定向关系,以后再访问相同的原始URL时,会自动使用重定向后的URL。
综合上述解释,rewrite ^(.*) http://www.hm.com$1 permanent;
这个指令的意思是:
对于所有请求的URI,Nginx将把它们永久重定向到 http://www.hm.com
加上前缀与原始请求URI相同的部分。换句话说,该指令将把所有对当前服务器的请求,以http://www.hm.com
为基址,保持原有的路径和查询字符串不变,进行重定向。
例如,如果客户端请求 http://yourserver.com/some/path?query=param
,这个指令会使Nginx返回一个301状态码的响应,告诉客户端应该访问 http://www.hm.com/some/path?query=param
。请求的路径/some/path
和查询字符串?query=param
都被保留并附加到新的域名www.hm.com
之后。
五、nginx实现正向代理
其中 $host 这个字段很有趣
举个例子:客户端A,代理服务器B,目标服务器C
A设置自己的代理服务器为B, 然后A给目标服务器C发送请求。此时代理服务器B就会代替A向C发送请求。
因此,引入$host , 这个是C对应的主机。 代理服务器可以通过$host获取到C的IP。
六、nginx实现反向代理
1. proxy_pass 加不加 /
举个简单的例子:
请求 http://example.com/api/some-resource
将被转发到 http://backend.example.com/some-resource
因为加 / ,所以 /api/some-resource 中 /api被省略掉了。
千万要注意,/some-resource可不会被省略掉
在Nginx配置中,location
与 proxy_pass
指令一起使用时,location
匹配的路径部分(如 /api
)是否会被追加到 proxy_pass
指令指定的目标URL后面,取决于 proxy_pass
指令中目标URL末尾是否包含斜杠 (/
) 以及 location
匹配规则的写法。以下是不同情况下 location /api
路径是否会被追加到 proxy_pass
后面的规则:
-
proxy_pass
目标URL末尾有斜杠 (/
):- 当
proxy_pass
后面的URL以/
结尾时,location
匹配的路径(如/api
)不会被追加到proxy_pass
后面。Nginx会将请求转发到指定的完整URL,而忽略location
匹配的部分。
示例:
location /api { proxy_pass http://backend.example.com/; }
- 当
-
请求
http://example.com/api/some-resource
将被转发到http://backend.example.com/some-resource
。 -
proxy_pass
目标URL末尾没有斜杠 (/
):- 当
proxy_pass
后面的URL不以/
结尾时,location
匹配的路径(如/api
)会被自动追加到proxy_pass
后面。这意味着Nginx会拼接location
中的匹配路径和请求的实际路径,形成完整的转发URL。
示例:
- 当
-
location /api { proxy_pass http://backend.example.com; }
-
请求
http://example.com/api/some-resource
将被转发到http://backend.example.com/api/some-resource
。
总结来说,location /api
路径是否会追加到 proxy_pass
后面,关键在于观察 proxy_pass
指令中目标URL的末尾是否有斜杠 /
。有斜杠时,不会追加;无斜杠时,则会追加。这有助于控制请求在被Nginx代理到后端服务器时如何精确地重写URL路径。
2.
七、利用nginx配置https
ssl_certificate: 为当前这个虚拟主机指定一个带有 PEM 格式证书的证书。
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/nginx/ssl/your_certificate.crt;
ssl_certificate_key /etc/nginx/ssl/your_private_key.key;
# 可选:SSL 优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
# 可选:SSL 会话缓存配置
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 可选:HSTS 配置
add_header Strict-Transport-Security "max-age=31536000" always;
# 可选:SSL OCSP Stapling 配置
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
location / {
# 这里配置你的代理或者静态文件服务等
}
}