Nginx是什么?
Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。
特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
Nginx安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
为什么用Nginx
项目刚上线时,用户量和并发量都很小。此时,一台应用服务器足够处理用户请求,服务器直接返回内容给用户。然而,随着用户数量的增加和并发量的上升,单台服务器无法满足需求。为了解决这个问题,采取了横向扩展的方式,增加了多台服务器。现在,多个项目运行在不同的服务器上。为了让用户访问这些服务器,引入了一个代理服务器。代理服务器的作用是接收用户的请求,并根据一定的规则将请求转发到不同的服务器节点上。这个过程对用户来说是无感知的,用户并不知道最终返回结果的服务器是哪一台。同时,希望代理服务器能够根据服务器的性能提供不同的权重选择,以保证最佳的用户体验。
Nginx的作用
- HTTP代理和反向代理:Nginx常被用作Web服务器,其中最常见的功能是充当HTTP代理或反向代理。作为代理服务器,它可以接收客户端的请求并将其转发给后端服务器,然后将响应返回给客户端。这种方式可以隐藏后端服务器的真实IP地址,提供负载均衡、缓存和安全性等优势。
- 负载均衡:Nginx提供负载均衡功能,可以将请求分发给多个后端服务器,以实现更好的性能和可靠性。它支持多种负载均衡策略,包括轮询、加权轮询和IP哈希等。
- 动静分离:在动态网站中,有些资源是静态的(如CSS、HTML、图片等),不需要经过后端处理,而有些资源是动态生成的,需要后端服务器处理。Nginx可以根据规则将动态资源和静态资源分离,将静态资源进行缓存,以提高响应速度和减轻后端服务器的负载。
4、Nginx服务搭建和使用
Nginx官网:https://nginx.org/
本次使用华为云服务器(ubuntu22) + docker搭建nginx服务
拉取nginx镜像
docker pull nginx:latest
启动nginx容器并且复制默认配置文件到宿主机
docker run -d <image-id>
# 将容器中的nginx配置文件复制到 /docker/nginx下
# 包括默认配置文件、html、conf.d
docker cp nginx:/etc/nginx/nginx.conf /docker/nginx/conf/nginx.conf
docker cp nginx:/etc/nginx/conf.d /docker/nginx/conf/conf.d
docker cp nginx:/usr/share/nginx/html /docker/nginx/html/
# 接下来删除刚才运行的容器
挂载nginx配置、html、日志文件的方式重新启动容器
# 默认使用80端口
# 指定时区为Asia/Shanghai,配置打印日志的时区
# 挂载nginx的日志,方便查看
docker run -d -p 80:80 --name nginx \
-v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /docker/nginx/log:/var/log/nginx \
-v /docker/nginx/html:/usr/share/nginx/html \
-v /root/www:/www \
-e TZ=Asia/Shanghai \
container-id
容器启动成功实例
测试服务启动状态(成功启动)
5、nginx配置结构
- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- location块:配置请求的路由,以及各种页面的处理情况
... #全局块
events { #events块
...
}
http #http块
{
upstream servername{ #负载均衡
...
}
...
server #server块
{
...
location #location块
{
...
}
}
}
6、nginx配置实战
6.1 使用nginx代理静态文件
代理静态文件的nginx配置
# 代理静态文件的配置我们放到conf.d目录下,.conf后缀
# 我们启动服务的时候将宿主机的/root/www目录映射到容器的/www目录下
# 希望通过访问 http://host:port/static/filename 获取静态文件
server {
listen 80;
server_name 127.0.0.1;
location /static {
alias /www/;
index index.html index.htm;
try_files $uri $uri/ =404;
}
}
代理效果展示
在宿主机的/root/www目录下放一个test.jpg文件以测试效果
6.2 代理web服务
应用正以5001端口正常启动
代理web服务5001端口的nginx配置
# 这里没有使用域名 flask项目运行在5001端口
server {
listen 80 default_server;
server_name <私有IP>;
access_log /var/log/nginx/myflask.access.log combined;
error_log /var/log/nginx/myflask.error.log notice;
#error_page 404 /404.html;
#location = /404.html {
# root /usr/share/nginx/html
#}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location / {
proxy_pass http://<私有IP>:5001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# enable server push for resources
http2_push_preload on;
}
}
代理效果展示
7、总结
Nginx 是一个功能强大、高性能的服务器软件,适用于各种规模的网络应用和服务,可以提供高效、可靠的服务支持。具体用法和配置我们可以参考官网的文档和资源,利用其强大的功能构建高性能、可靠的网络应用和服务。