nginx 反向代理 配置请求路由
nginx | 反向代理 | 配置请求路由
nginx简介
Nginx(发音为“Engine-X”)是一款高性能、开源的 Web 服务器
和反向代理服务器
,同时也支持邮件代理和负载均衡等功能。它由俄罗斯程序员伊戈尔·西索夫(Igor Sysoev)于 2004 年首次发布,如今已成为全球最受欢迎的 Web 服务器之一。
Nginx 的主要用途和功能
1. Web 服务器
- 静态内容服务:Nginx 非常擅长处理静态文件(如 HTML、CSS、JavaScript、图片等)。它可以快速地从磁盘读取这些文件并将其发送给客户端。
- 动态内容处理:虽然 Nginx 本身不直接处理动态内容(如 PHP、Python 等),但它可以通过反向代理或 FastCGI 等方式与后端应用服务器(如 PHP-FPM、Gunicorn 等)配合,实现动态内容的处理。
2. 反向代理服务器
- 请求转发:Nginx 可以作为中间层,将客户端的请求转发到后端服务器(如 Web 应用服务器、API 服务器等),并将后端服务器的响应返回给客户端。
- 负载均衡:通过
upstream
模块,Nginx 可以将请求分发到多个后端服务器,实现负载均衡,提高系统的可用性和扩展性。 - 缓存:Nginx 可以缓存后端服务器的响应,减少对后端服务器的请求压力,提高响应速度。
1.nginx配置步骤
参考博客https://blog.csdn.net/epitomizelu/article/details/140988778
https://blog.csdn.net/epitomizelu/article/details/140990964
1 创建nginx容器
1.1 创建nginx文件夹
在/mydata下创建nginx文件夹,没有/mydata目录需要先创建。
cd /mydata
mkdir nginx
1.2 创建nginx容器获取nginx配置
注意,这个nginx容器不是最终我们需要的nginx容器,仅仅是为了获取nginx配置文件的模板而创建的。
docker run -p 80:80 --name nginx -d nginx:1.10
执行这个命令时,虽然我们没有提前下载镜像,docker会自动检测,若没有镜像,会先下载镜像。
1.3 复制nginx容器配置文件
复制nginx容器配置文件到前面创建的文件夹/mydata/下。
docker container cp nginx:/etc/nginx .
1.4 删除临时的nginx容器
执行下面命令,先停止nginx容器,后删除容器。
docker stop nginx
docker rm nginx
1.5 创建新的nginx容器
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /mydata/nginx/conf.d:/etc/nginx/conf.d \
-d nginx
拓展:如何将虚拟机目录挂载到nginx的配置文件目录,详细参考我的往期博客:[报错:nginx emerg] open() etcnginxnginx.conf failed (2 No such file or directory)_failed (2: no such file or directory)-CSDN博客
2 配置nginx配置文件
2.1 切换到nginx的目录
cd /mydata/nginx/
在nignx.conf下添加如下内容:
upstream gulimall{
server 192.168.182.1:88
}
含义:
upstream gulimall
:upstream
是 Nginx 中的一个指令,用于定义一个后端服务器组。gulimall
是这个后端服务器组的名称。你可以通过这个名称在其他地方引用这个服务器组。
server 192.168.182.1:88
:- 这是
upstream
块中的一个server
指令,用于指定一个后端服务器。 192.168.182.1
是后端服务器的 IP 地址。88
是后端服务器监听的端口号。
- 这是
2.2 切换到nginx的配置文件conf.d目录下
cd /mydata/nginx/conf.d
里边会看到default.conf
文件。
2.3 根据default.conf赋值一份名为gulimall.conf
这里命名随意,打开该文件,做如下修改。
cp default.conf gulimall.conf
这段Nginx配置定义了一个server块,用于处理特定的虚拟主机请求。
-
server { ... }
:定义了一个server块的开始和结束,所有在这对大括号之间的配置都是针对这个server块的。 -
listen 80;
:这一行指定了Nginx监听的端口号,这里是80端口,这是HTTP服务的默认端口。 -
server_name gulimall.com;
:这一行设置了这个server块所对应的域名,这里是gulimall.com。当有请求到达Nginx,并且请求中的Host头部与gulimall.com匹配时,Nginx就会使用这个server块的配置来处理请求。 -
location / { ... }
:定义了一个location块,它匹配所有以根路径/开始的请求。location块是server块的子块,用于进一步细化请求的处理规则。 -
proxy_set_header Host $host;
:这是location块内的指令,指定了请求的处理方式。proxy_set_header
是一个指令,用于在将请求转发到后端服务器时,设置请求头(HTTP Header)。默认情况下,Nginx 会将Host
头设置为后端服务器的地址(例如upstream
中定义的地址)。如果需要保留客户端请求的原始Host
头,需要显性设置proxy_set_header Host$host
;。在这里,如果需要再次利用后端服务的网关转发请求
,就需要保留客户端请求的原始 Host 头
,这里的$host
就是gulimall.com。 -
proxy_pass http://gulimall
:这是location块内的指令,指定了请求的处理方式。proxy_pass http://gulimall; 指令会将请求转发到upstream
gulimall 中定义的服务器组。 Nginx 会根据 upstream 中的配置(例如轮询、权重等)选择一个后端服务器来处理请求,当然这里只设置了一个后端服务器,就不需要考虑这些了。
拓展
1.nginx配置文件解析
全局块
:配置影响nginx全局的指令。如:用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
event块
:配置影响nginx服务器或与用户的网络连接。如:每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网络连接,开启多个网络连接序列化等。
http块
:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
http全局块
:如upstream,错误页面,连接超时等。server块
:配置虚拟主机的相关参数,一个http中可以有多个server。location
:配置请求的路由,以及各种页面的处理情况。location
:…- …
2.nginx和default.conf的内容:
2.1nginx.conf:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream gulimall{
server 192.168.182.1:88;
}
include /etc/nginx/conf.d/*.conf;
}
2.2default.conf:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}