Nginx
配置文件
可以使用nginx -V
查看配置文件路径。
root@57def6feed6c:/etc/nginx# nginx -V
nginx version: nginx/1.18.0 (Ubuntu)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-lUTckl/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-lUTckl/nginx-1.18.0/debian/modules/http-auth-pam --add-dynamic-module=/build/nginx-lUTckl/nginx-1.18.0/debian/modules/http-dav-ext --add-dynamic-module=/build/nginx-lUTckl/nginx-1.18.0/debian/modules/http-echo --add-dynamic-module=/build/nginx-lUTckl/nginx-1.18.0/debian/modules/http-upstream-fair --add-dynamic-module=/build/nginx-lUTckl/nginx-1.18.0/debian/modules/http-subs-filter --add-dynamic-module=/build/nginx-lUTckl/nginx-1.18.0/debian/modules/http-geoip2
--conf-path=/etc/nginx/nginx.conf
配置文件路径,关于nginx的配置文件都在这。
负载均衡和反向代理
可以使用nginx -T查看配置文件。
在http
中配置负载均衡,使用upstream
来配置。
upstream backend{
ip_hash; # 负载均衡策略,默认是轮询,也可以使用ip_hash哈希散列模式
server 127.0.0.1:8000;
server 127.0.0.1:8080;
}
然后在server
中配置反向代理。
location /app{
proxy_pass http://backend/;
}
location /app/{
proxy_pass http://backend/;
}
这里有个坑,如果使用proxy_pass http://backend/app;
,那么反向代理后,请求的路径会变成http://127.0.0.1:8080/app
,导致无法访问。
在询问了ChatGPT4后,给出的回答是:
在你提供的配置片段中,定义了一个名为 backend 的 upstream 块,这个块中包含了两个后端服务器地址:127.0.0.1:8080 和 127.0.0.1:8000。同时,在 location /app 块中,使用了 proxy_pass 指令将请求代理到了 backend 这个上游服务器组
这段配置的含义是,当有请求到达路径 /app 时,Nginx 将会把这些请求按照定义的负载均衡策略(默认是轮询)转发到两个上游服务器之一。也就是说,一个请求可能会被转发到 127.0.0.1:8080,另一个请求可能会被转发到 127.0.0.1:8000。
然而,你提到的情况,即请求 127.0.0.1/app 时,请求被转发到了 127.0.0.1:8080/app 和 127.0.0.1:8000/app,这是因为 proxy_pass 指令将原始请求的 URI 部分 /app 附加到了上游服务器地址后面。这是 Nginx 的默认行为:当 proxy_pass 指令使用在 location 块中,并且没有使用 URI 重写规则时,Nginx 会把 location 匹配到的部分 URI 传递给上游服务器。
如果你想要请求 127.0.0.1/app 时,上游服务器接收到的是 / 而不是 /app,你需要在 proxy_pass 指令中使用一个斜杠(/)结尾的 URL,如下所示:
location /app/ { proxy_pass http://backend/; }
使用这个配置,当请求 127.0.0.1/app 时,Nginx 会将请求转发到 http://backend 上游,并且会剥离掉 /app/ 部分,所以上游服务器会收到请求路径为 /。注意,这里的 location /app/ 和 proxy_pass http://backend/; 都使用了斜杠(/)结尾,这样 Nginx 就知道需要进行 URI 的重写。
如果你不希望转发任何 URI 路径,你可以在 proxy_pass 指令中指定一个没有路径的 URL,例如:
location /app { proxy_pass http://backend; }
在这种情况下,Nginx 会将请求转发到上游服务器的根路径 /。如果你的上游服务器需要在根路径 / 上接收请求,这可能是你想要的配置。
还有就是/app/和/app的区别,/app/是匹配到/app/后面的路径,而/app是匹配到/app后面的路径。
如果在配置文件写 /app 那么请求/app/,时是无法访问的。
chatGPT给的答案,是location /app{
和location /app/{
的区别。
你遇到的问题可能是由于 Nginx 在处理没有以斜杠(/)结尾的请求时执行了一个隐式的重定向。当你访问 127.0.0.1:8001/app(没有斜杠结尾)时,如果 location 块是以斜杠结尾定义的(如 location /app/),Nginx 会认为这是一个对目录的请求,并尝试将请求重定向到以斜杠结尾的 URI,即 127.0.0.1:8001/app/。
这通常是为了保持 URL 的规范性和避免潜在的相对路径问题。例如,如果你的应用在 /app 路径下返回 HTML,并且其中包含相对路径的资源引用,没有结尾的斜杠可能会导致资源加载错误。
要避免这种隐式重定向,你可以确保 location 块与你的请求 URI 结尾保持一致。如果你希望 /app(没有斜杠结尾)也能正确处理,你可以添加一个没有斜杠结尾的 location 块,如下所示:
server { listen 8001; location /app/ { proxy_pass http://backend/; } location /app { proxy_pass http://backend/; } }
在上面的配置中,两个 location 块都会将请求代理到上游的 backend,但是第一个是针对以斜杠结尾的请求,第二个则是针对没有斜杠结尾的请求。这样,你就可以使用 127.0.0.1:8001/app(没有斜杠结尾)或者 127.0.0.1:8001/app/(有斜杠结尾)来访问你的应用,而不会发生重定向。
确保在你的 Nginx 配置中包含了上述两个 location 块,并且重新加载了 Nginx 的配置(通常使用命令 nginx -s reload),然后再次尝试访问你的应用。
虚拟主机
在 http 模块中新建一个 server,或者在 http 模块使用 include 去包含进来。
server{
listen 8010; //监听端口,也就是访问的端口
server_name localhost; //写自己的域名,这里是本地就写本地的
location /{ //根目录
root /tmp; //指向网站根目录
index index.html; //指定首页
}
}
标签:http,nginx,--,app,module,Nginx,location
From: https://www.cnblogs.com/qianyuzz/p/17908405.html