在Ubuntu上安装Nginx并配置使其生效是相对简单的过程。以下是一步一步的指南:
打开终端,并执行以下命令来安装 Nginx:
bashsudo apt update sudo apt install nginx
安装完成后,Nginx 已经自动启动了。你可以通过以下命令检查 Nginx 服务的状态:
bashsudo systemctl status nginx
如果状态显示为"active (running)",表示 Nginx 已经成功启动。
没有启动可以用
bashsudo systemctl start nginx
对于 SysVinit,你可以使用 service 命令来管理服务。尝试使用以下命令来检查 Nginx 服务状态:
bashsudo service nginx status
如果 Nginx 没有启动,你可以使用以下命令启动它:
bashsudo service nginx start
Nginx 的主要配置文件是 /etc/nginx/nginx.conf
,但是推荐的做法是在 /etc/nginx/sites-available/
目录下创建一个新的配置文件,并在 /etc/nginx/sites-enabled/
目录下创建该配置文件的符号链接。这样做可以更好地组织和管理配置文件。
下面是一个简单的示例配置文件 mywebsite
:
nginxupstream backend { server 127.0.0.1:7885; server 127.0.0.1:7886; } server { listen 7860; client_max_body_size 100M; location / { proxy_pass http://backend; 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_http_version 1.1; proxy_set_header Upgrade \$http_upgrade; proxy_set_header Connection \"upgrade\"; proxy_connect_timeout 300s; proxy_read_timeout 300s; } }
将上述配置内容保存为一个文件,例如 mywebsite
,并将其放置在 /etc/nginx/sites-available/
目录下。
在 /etc/nginx/sites-enabled/
目录下创建一个指向 /etc/nginx/sites-available/mywebsite
的符号链接,使用以下命令:
bashsudo ln -s /etc/nginx/sites-available/mywebsite /etc/nginx/sites-enabled/
执行以下命令检查 Nginx 配置是否正确:
bashsudo nginx -t
自己也要先确保自己写的服务是打开了的,我这里这web接口服务都是打开了的:
server 127.0.0.1:7885; server 127.0.0.1:7886;
如果输出中没有错误,表示配置文件有效。
最后,重启 Nginx 以使新的配置生效:
bashsudo systemctl restart nginx
或者这个指令:
bashsudo service nginx restart
现在,你可以通过在浏览器中输入你的域名来访问你的网站了。
以上是在 Ubuntu 上安装 Nginx 并配置使其生效的基本步骤。根据你的实际需求,你可能需要进一步调整配置文件,以满足你的特定要求。
bash 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;
这些指令是在 Nginx 中用于设置代理请求头部信息的。它们的作用如下:
proxy_set_header Host $host;
:设置代理请求的 Host 头部字段为客户端请求的 Host 头部。这个指令确保了向后端服务器发送的请求中包含了客户端请求的目标主机信息。
proxy_set_header X-Real-IP $remote_addr;
:设置代理请求的 X-Real-IP 头部字段为客户端的真实 IP 地址。当 Nginx 作为反向代理时,它接收到的请求的远程 IP 地址是客户端连接的 IP 地址,而不是最初请求的客户端的真实 IP 地址。这个指令将客户端的真实 IP 地址传递给后端服务器,方便后端服务器获取客户端的真实 IP 地址。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
:设置代理请求的 X-Forwarded-For 头部字段为客户端 IP 地址和原始的 X-Forwarded-For 头部字段值。X-Forwarded-For 头部用于标识请求经过的代理服务器列表,这个指令将客户端的 IP 地址添加到已有的 X-Forwarded-For 头部字段值中。
proxy_set_header X-Forwarded-Proto $scheme;
:设置代理请求的 X-Forwarded-Proto 头部字段为客户端请求的协议(HTTP 或 HTTPS)。这个指令用于传递客户端请求的协议信息给后端服务器,通常用于处理 HTTPS 反向代理时的重定向和链接生成。
这些指令通常在 Nginx 配置中用于反向代理和负载均衡场景,以确保后端服务器能够正确获取客户端的真实 IP 地址和其他相关信息。
要实现将当前服务器的8000到8050端口请求转发到另一台服务器(IP 为 101.150.72.28
)的相应端口,你需要使用 ngx_http_map_module
或 ngx_http_split_clients_module
这样的模块来处理端口映射,但通常我们可以通过编写一个通配的 location
配置来匹配所有这些端口请求并正确地转发它们。
你可以参考以下 nginx
配置:
nginxserver { listen 8000-8050; # 监听当前服务器的 8000 到 8050 端口 client_max_body_size 100M; # 使用正则表达式来捕获端口号,并将其动态传递到目标服务器的相应端口 location / { set $target_port $server_port; # 将请求的端口保存在 $target_port 变量中 proxy_pass http://101.150.72.28:$target_port; # 转发到目标服务器的相应端口 # 保持客户端的请求头信息 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_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_connect_timeout 300s; proxy_read_timeout 300s; } }
listen 8000-8050;
:监听当前服务器的8000到8050端口。set $target_port $server_port;
:将当前请求的端口(即 server_port
)赋值给变量 target_port
。proxy_pass http://10.150.72.28:$target_port;
:根据请求的端口,转发到 10.150.72.28
的相应端口。这样,每当访问当前服务器的8000到8050端口时,nginx
会将这些请求转发到 10.150.72.28
的相应端口。
手册说明:https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
NGINX Open Source 支持四种负载均衡方法,而 NGINX Plus 添加了两种额外的方法:
nginxupstream backend { # 没有指定负载均衡方法,采用轮询 server backend1.example.com; server backend2.example.com; }
nginxupstream backend { least_conn; server backend1.example.com; server backend2.example.com; }
nginxupstream backend { ip_hash; server backend1.example.com; server backend2.example.com; }
如果需要暂时从负载均衡轮转中移除某个服务器,可以使用 down 参数,以保留客户端 IP 地址的当前哈希值。对该服务器的请求将自动发送到组中的下一个服务器:
nginxupstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com down; }
nginxupstream backend { hash $request_uri consistent; server backend1.example.com; server backend2.example.com; }
哈希指令的可选 consistent 参数启用了 ketama 一致性哈希负载均衡。根据用户定义的哈希键值,请求被均匀地分配到所有上游服务器上。如果向上游组中添加或删除了一台服务器,则只会重新映射一些键,从而在负载均衡缓存服务器或其他积累状态的应用程序的情况下最小化缓存未命中。
header:从服务器接收第一个字节的时间
last_byte:从服务器接收完整响应的时间
last_byte inflight:从服务器接收完整响应的时间,考虑到未完成的请求
nginxupstream backend { least_time header; server backend1.example.com; server backend2.example.com; }
least_conn:最少活动连接数
least_time=header(NGINX Plus):从服务器接收响应头的最短平均时间($upstream_header_time)
least_time=last_byte(NGINX Plus):从服务器接收完整响应的最短平均时间($upstream_response_time)
nginxupstream backend { random two least_time=last_byte; server backend1.example.com; server backend2.example.com; server backend3.example.com; server backend4.example.com; }
应该将除轮询之外的任何方法配置在 upstream {} 块中的服务器指令列表之前。
NGINX 在代理过程中可以生成日志。通过配置 NGINX 的日志功能,你可以记录代理请求的详细信息,包括请求的来源、目标服务器、响应时间等等。
通常情况下,NGINX 的日志文件位于 /var/log/nginx/
目录下,你可以在配置文件中指定日志格式和日志文件的路径。下面是一个示例配置,用于配置 NGINX 的访问日志:
nginxhttp { log_format custom_format '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$request_time'; access_log /var/log/nginx/access.log custom_format; }
在上面的示例中,我们定义了一个名为 custom_format
的日志格式,然后将访问日志写入到 /var/log/nginx/access.log
文件中,并使用我们定义的 custom_format
格式来记录日志。
如果你想记录更多的细节信息,你可以调整日志格式,以包含更多的变量。在NGINX的官方文档中,有详细介绍了可以在日志格式中使用的变量,你可以根据自己的需求进行调整。
除了访问日志外,NGINX 还可以生成错误日志,用于记录 NGINX 服务器运行时的错误信息。默认情况下,错误日志会记录在 /var/log/nginx/error.log
文件中。
如果你没有对 NGINX 进行任何配置,那么 NGINX 默认的日志将会在系统默认的日志路径中。通常情况下,在 Debian 和 Ubuntu 等系统中,NGINX 的错误日志默认会被记录在 /var/log/nginx/error.log 文件中,而访问日志则默认记录在 /var/log/nginx/access.log 文件中。
Dockerize 是一个简单的工具,用于等待容器中的某个服务启动完成后,执行其他操作,比如启动应用程序或者进行日志转发。
使用 Dockerize 来实现 NGINX 日志的实时输出到 Docker 日志中的步骤如下:
在 NGINX 的配置文件中,将日志输出到标准输出和标准错误输出:
nginxerror_log /dev/stderr; access_log /dev/stdout;
在 Dockerfile 中,安装 Dockerize,并将 NGINX 配置文件和 Dockerize 复制到容器中:
DockerfileFROM nginx:latest # 安装 Dockerize RUN apt-get update && apt-get install -y dockerize # 将 NGINX 配置文件复制到容器中 COPY nginx.conf /etc/nginx/nginx.conf # 将 Dockerize 复制到容器中 COPY dockerize /usr/local/bin/ CMD ["dockerize", "-stdout", "/usr/sbin/nginx", "-g", "daemon off;"]
构建 Docker 镜像并运行容器:
bashdocker build -t my-nginx . docker run -d my-nginx
Logspout 是一个用 Go 编写的轻量级容器日志路由器,它可以捕获容器的标准输出和标准错误输出,并将日志发送到各种目的地,比如本地文件、远程服务器等。
使用 Logspout 来实现 NGINX 日志的实时输出到 Docker 日志中的步骤如下:
在 Docker 容器中运行 Logspout:
bashdocker run -d --name="logspout" --volume=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout
在 NGINX 的容器中,将日志输出到标准输出和标准错误输出:
nginxerror_log /dev/stderr; access_log /dev/stdout;
Fluentd 是一个开源的数据收集器,它可以将日志从各种来源收集起来,并将它们发送到各种目的地,比如文件、数据库、消息队列等。
使用 Fluentd 来实现 NGINX 日志的实时输出到 Docker 日志中的步骤如下:
在 NGINX 的容器中,将日志输出到 Fluentd 的 TCP 或 UDP 输入插件:
nginxaccess_log fluentd.example.com:24224;
在 Fluentd 的配置文件中,配置输入插件和输出插件,将接收到的日志输出到 Docker 的日志中。
这些是使用 Dockerize、Logspout 和 Fluentd 这三种工具实现 NGINX 日志实时输出到 Docker 日志中的基本步骤。你可以根据自己的需求和环境选择合适的工具来实现日志转发。
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!