当我拥有了一个网站,并成功在服务器上运行起来了后,我是否还需要Nginx呢?
如果你只有一台服务器,而且上面只运行了这一个网站,并且也配置好了域名和端口(甚至也不需要域名),那么基本上来说是不需要使用Nginx的。
如果你有像我一样的需求:
- 有多个域名
- 只有一台服务器,服务器上运行多个网站
- 一个域名对应这台服务器上的一个网站
那么你需要Nginx,这也叫做Nginx的反向代理(访问网站通过Nginx,但不知道是谁为我提供的服务)
— 上图纯粹是省钱做法,毕竟现在没有什么访问量,又想多做点事情,也就尽量多压榨服务器的能力了 🙂
言归正传
什么是Nginx
Nginx(发音为“engine-x”)是一个高性能的 HTTP 和反向代理服务器,也是一个电子邮件(IMAP、POP3、SMTP)代理服务器。它最初被设计为解决高并发下的网络服务问题,因此它特别适合处理大量的并发连接,这使得 Nginx 成为构建高性能网站和应用的理想选择。
Nginx 的主要特点包括:
- 高稳定性:Nginx 以其稳定性和可靠性而闻名,即使在负载很高的情况下也能保持稳定。
- 高并发处理能力:Nginx 使用异步非阻塞的方式处理请求,这使得它能够在有限的内存和 CPU 资源下处理大量的并发连接。
- 事件驱动:Nginx 基于事件驱动架构,这使得它能够更有效地处理请求。
- 配置简单:Nginx 的配置文件简洁易懂,使得它容易配置和维护。
- 模块化设计:Nginx 支持模块化设计,可以通过安装各种模块来扩展其功能。
- 负载均衡:Nginx 可以作为反向代理服务器,实现负载均衡,将请求分发到多个后端服务器。
- 静态资源处理:Nginx 非常擅长处理静态资源,如图片、CSS 和 JavaScript 文件。
- 安全性:Nginx 提供了一些安全特性,如防止 DDoS 攻击、限制请求速率等。
- 可扩展性:Nginx 可以通过编写或使用现有的第三方模块来扩展其功能。
- 跨平台:Nginx 可以在多种操作系统上运行,包括 Linux、BSD、Mac OS X、Solaris 和 Windows。
Nginx 的常见用途:
- Web 服务器:Nginx 可以直接作为 Web 服务器,提供静态文件的托管和分发。
- 反向代理:Nginx 可以作为反向代理,将客户端请求转发到后端的一个或多个服务器。
- 负载均衡器:Nginx 可以在多个服务器之间分配请求,以平衡负载。
- 缓存服务器:Nginx 可以缓存静态内容,减少后端服务器的负载。
- SSL 终止:Nginx 可以处理 SSL/TLS 加密,减轻后端服务器的加密负担。
- 压缩:Nginx 可以对响应内容进行压缩,节省带宽。
- API 网关:Nginx 可以作为 API 网关,管理对后端服务的访问。
- 邮件代理:Nginx 可以作为邮件代理服务器,支持 IMAP、POP3 和 SMTP 协议。
总之,Nginx很强大,很好用(稳定),自从我09年听说了Nginx这个单词之后,在这么长的时间里,似乎没有什么软件能够代替Nginx的地位。
安装步骤
在现在这个时代里,使用容器安装Nginx是一个更简单、更优雅的选择,如果你正在使用docker,那么我强烈推荐你使用docker安装Nginx,如果你还不知道在Linux上如何安装docker,那么可以参考这篇文章《在AWS和阿里云Linux上安装Docker和Docker Compose》
- 拉取镜像
docker pull nginx
如果拉取的镜像没有加tag,那么默认会拉取tag为latest的镜像,但是请注意的是latest不一定就是“最新的”镜像,这个“最新的”是由镜像维护者标定的,人为的。
我推荐大家在拉取镜像的时候指定版本, 不同版本的Nginx在使用过程中会有差异,对于初学者来说,相当多的问题是版本问题。对于使用者来说,如果不知道软件的版本,那么解决问题的过程就像瞎猫撞死耗子,看运气了。
当前Nginx官方容器的版本是stable-alpine3.20-perl,所以拉取镜像的命令可以是:
docker pull nginx:stable-alpine3.20-perl
另一个拉取镜像的方法也可以通过Docker Compose,如果在Docker Compose配置文件中定义了容器的镜像,但是本地又没有该镜像,那么通过Docker Compose启动容器的第一件事就是去下载镜像。
因为我习惯使用Docker Compose,那么接下来介绍一下Nginx的Docker Compose配置文件,以及启动容器的办法。
2. 使用Docker Compose启动Nginx容器
要使用 Docker Compose 启动 Nginx 容器,你需要创建一个 docker-compose.yml
文件,该文件定义了如何构建和运行 Nginx 服务。以下是该文件的示例:
services:
nginx:
image: nginx:stable-alpine3.20-perl # 指定镜像
ports:
- "80:80" # 将主机的80端口映射到容器的80端口
- "443:443" # 如果需要的话,也可以映射443端口
volumes:
- ~/nginx:/etc/nginx/conf.d:ro # 自定义 Nginx 配置文件
配置文件写好后,运行一下命令就可以启动Nginx容器了:
docker-compose up -d
很简单,是吧。以下是配置文件说明:
- services:定义服务列表的开始。在这个配置文件中,只定义了一个名为
nginx
的服务。 - nginx: 指定服务的名称为
nginx
。 - image: 指定使用的 Docker 镜像。这里使用的是
nginx:stable-alpine3.20-perl
,表示这个容器将基于 Nginx 的稳定版,使用 Alpine Linux 3.20 作为底层操作系统,并且包含 Perl 支持的镜像。 - ports: 定义端口映射,格式为 “主机端口:容器端口”。
"80:80"
:将 Docker 宿主机的 80 端口映射到容器内部的 80 端口,这样可以通过宿主机的 80 端口访问 Nginx 服务器。"443:443"
:将 Docker 宿主机的 443 端口映射到容器内部的 443 端口,通常用于 HTTPS 服务。如果你需要提供 HTTPS 服务,可以映射这个端口。
- volumes: 定义卷挂载,将宿主机的文件或目录挂载到容器内部,格式为 “宿主机路径:容器内部路径:模式”。
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-accent-3-color"><strong>~/nginx:/etc/nginx/conf.d:ro</strong></mark>
:将宿主机上的~/nginx
目录挂载到容器内的/etc/nginx/conf.d
目录。ro
表示以只读模式挂载。这意味着 Nginx 将使用你提供的自定义配置文件启动。
这个配置文件的其它部分很好理解,ports和volumes的部分可能不太好理解。简单的说,就是:
你的容器也是一台”服务器“(虚拟的),寄宿在你的真实服务器(宿主机)上。两台“
服务器”上都有“端口”,也有“文件”。
用户访问Nginx容器上的服务首先是先访问宿主机,然后才是访问Nginx容器,那么容器上的端口如果不与宿主机上的端口进行映射的话,外面的用户是访问不到Nginx提供的服务的。这就是ports部分的作用,它把宿主机的80端口与容器的80端口映射起来了。
这种映射关系这对两台“服务器”上的文件也是一样。
那么对于volumes的部分,不定义其实也不影响Nginx容器的启动。之所以要定义它,是因为Nginx是通过配置文件来决定它的运行状态、策略的,在我们使用的过程中,肯定需要根据系统运行的状态或者需求而对配置文件进行调整。配置文件是可以在容器里面进行调整的,调整完后在容器里重启Nginx服务,新配置一样生效。但是容器是一个容易被销毁的东西,当容器被销毁后,你在容器里辛辛苦苦修改好的配置文件就消失了,再也找不到了。为了避免这种惨剧,我们需要在宿主机上调整我们的配置文件,在容器启动的时候“挂载”(映射)到容器里,告诉容器:“去映射的这个地址找配置文件”,这样我们就不怕配置文件丢失了,容器只是提供一个服务而已。
说了这么多,其实到这里,Nginx就已经能正常启动啦,当你宿主机的网络策略没有问题的话,在浏览器里输入机器的ip,其实就能看到正常的启动页面,比如:
那么为了实现本文第一张图的需求,我们需要对Nginx的配置进行调整
3. 调整Nginx配置
场景:我有两个域名:www.abc.com,www.xyz.com,一台服务器,ip是192.168.1.8,这台服务器上有两个Web服务,分别占用3000与3001端口,我想访问www.abc.com使用3000端口的服务,访问www.xyz.com使用3001端口的服务
首先,在宿主机的~/nginx目录下创建一个配置文件,比如名字叫mynginx.conf,然后写入如下内容:
server {
listen 80;
server_name www.abc.com;
location / {
proxy_pass http://192.168.1.8:3000;
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;
}
}
server {
listen 80;
server_name www.xyz.com;
location / {
proxy_pass http://192.168.1.8:3001;
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 服务器的配置,定义了如何处理对两个不同域名的 HTTP 请求,并将这些请求转发到运行在服务器上的不同 Web 服务。以下是配置文件的解释:
第一个 server 块(处理 www.abc.com)
server {
listen 80;
server_name www.abc.com;
location / {
proxy_pass http://192.168.1.8:3000;
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;
}
}
listen 80;
:指定 Nginx 监听 80 端口,这是 HTTP 服务的默认端口。server_name www.abc.com;
:指定这个 server 块用于处理指向www.abc.com
的请求。location / { ... }
:定义了当请求的 URI 匹配/
时的处理规则。proxy_pass http://192.168.1.8:3000;
:将请求转发到 IP 地址为192.168.1.8
的服务器的 3000 端口。proxy_set_header
指令用于设置发送到后端服务器的请求头:Host $host;
:将Host
头设置为请求中的原始Host
。X-Real-IP $remote_addr;
:传递原始请求的 IP 地址。X-Forwarded-For $proxy_add_x_forwarded_for;
:添加客户端的 IP 地址,可能包括之前经过的所有代理服务器的 IP 地址。X-Forwarded-Proto $scheme;
:传递用于建立连接的协议(如 http 或 https)。
第二个 server 块(处理 www.xyz.com)
server {
listen 80;
server_name www.xyz.com;
location / {
proxy_pass http://192.168.1.8:3001;
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;
}
}
- 这个
server
块的配置与第一个类似,但它用于处理指向www.xyz.com
的请求。 proxy_pass http://192.168.1.8:3001;
:将请求转发到 IP 地址为192.168.1.8
的服务器的 3001 端口。
这个配置文件使得 Nginx 能够作为反向代理服务器,根据访问的域名(www.abc.com
或 www.xyz.com
)将请求转发到不同的后端服务(分别在端口 3000 和 3001 上运行)。这样,用户访问 www.abc.com
时,实际上访问的是运行在服务器的 3000 端口上的服务;而访问 www.xyz.com
时,实际上是访问的运行在服务器的 3001 端口上的服务。
其注意,配置文件的更改需要重启Nginx容器:
docker-compose down; docker-compose up -d
至此,Nginx的安装及使用就介绍完毕啦~~
发表回复