NGINX简介
- Nginx(engine x)
- 是俄罗斯人编写的十分轻量级的HTTP服务器
- 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器
- 官方网站:http://nginx.org/
NGINX概述
- Nginx默认配置文件:/etc/nginx/nginx.conf
- Nginx调用配置文件:/etc/nginx/conf.d/*.conf
- Nginx默认使用端口:80
实验架构
安装Nginx
虚拟机A操作
[root@javasv-A ~]# dnf -y install nginx #安装nginx服务
[root@javasv-A ~]# rpm -q nginx #查看是否安装成功
Nginx配置文件解析
[root@javasv-A ~]# cat /etc/nginx/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx; #worker进程归属用户
worker_processes auto; #启动工作进程数量(通常与CPU核心数一致)
error_log /var/log/nginx/error.log; #错误日志
pid /run/nginx.pid; #pid文件位置
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf; #引入动态模块相关配置
#事件模型相关配置
events {
worker_connections 1024; #单个worker进程可接受的最大并发量
}
#web服务块
http {
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; #合并请求后统一发送给客户端
tcp_nodelay on; #不延时发送
keepalive_timeout 65; #会话保持事件
types_hash_max_size 2048; #哈希表大小
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf; #子配置文件路径
#虚拟主机块
server {
listen 80 default_server; #监听ipv4端口
listen [::]:80 default_server; #监听ipv6端口
server_name _; #虚拟主机名
root /usr/share/nginx/html; #网站根目录
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / { #匹配路径
}
error_page 404 /404.html; #错误页面
location = /40x.html {
}
error_page 500 502 503 504 /50x.html; #错误页面
location = /50x.html {
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
Nginx服务测试
[root@javasv-A ~]# systemctl start nginx #启动nginx服务
[root@javasv-A ~]# systemctl enable nginx #将nginx服务设置为开机自启
[root@javasv-A ~]# ss -nutlp | grep :80 #查看80端口
打开浏览器访问:自己的ip地址
Nginx虚拟web主机
- 虚拟主机:一个Nginx服务上运行多个网站
- 类型:
- 基于域名的虚拟主机
- 基于端口的虚拟主机
- 基于IP地址的虚拟主机
##部署基于域名的虚拟主机
#编写虚拟主机配置文件(采用子配置文件的方式)
[root@javasv-A ~]# vim /etc/nginx/conf.d/site1.conf
[root@javasv-A ~]# cat /etc/nginx/conf.d/site1.conf
server {
listen 80;
server_name site1.tedu.cn;
location / {
root "/usr/share/nginx/html/site1/";
index index.html index.htm;
}
}
[root@javasv-A ~]# vim /etc/nginx/conf.d/site2.conf
[root@javasv-A ~]# cat /etc/nginx/conf.d/site2.conf
server {
listen 80;
server_name site2.tedu.cn;
location / {
root "/usr/share/nginx/html/site2/";
index index.html index.htm;
}
}
[root@javasv-A ~]#
#创建虚拟主机网站根目录及测试页面
[root@javasv-A ~]# mkdir /usr/share/nginx/html/site1
[root@javasv-A ~]# mkdir /usr/share/nginx/html/site2
[root@javasv-A ~]# vim /usr/share/nginx/html/site1/index.html
[root@javasv-A ~]# vim /usr/share/nginx/html/site2/index.html
[root@javasv-A ~]# cat /usr/share/nginx/html/site1/index.html
site1
[root@javasv-A ~]# cat /usr/share/nginx/html/site2/index.html
site2
[root@javasv-A ~]#
#重启服务
[root@javasv-A ~]# systemctl restart nginx
#修改hosts文件并访问测试
[root@javasv-A ~]# vim /etc/hosts
[root@javasv-A ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 site1.tedu.cn site2.tedu.cn
[root@javasv-A ~]# curl http://site1.tedu.cn/
site1
[root@javasv-A ~]# curl http://site2.tedu.cn/
site2
[root@javasv-A ~]#
#清理测试配置
[root@javasv-A ~]# rm -rf /etc/nginx/conf.d/site1.conf /etc/nginx/conf.d/site2.conf
[root@javasv-A ~]# rm -rf /usr/share/nginx/html/site1/
[root@javasv-A ~]# rm -rf /usr/share/nginx/html/site2/
[root@javasv-A ~]# systemctl restart nginx
Nginx动静分离
什么是动静分离
- 动静分离是一种常见的架构设计模式
- 用于将处理静态内容和动态内容的工作分开
- 以提高网站性能和可伸缩性
Nginx动静分离
- 动静分离的主要思想是让 Nginx 专注于处理静态内容(如 HTML、CSS、JavaScript、图片等)
- 而将动态内容(如 PHP、JSP、ASP.NET 等)交给后端应用服务器(如 Apache、Tomcat、IIS 等)来处理
Nginx动静分离处理方法
- 静态资源由 Nginx 直接处理:
- Nginx 作为前端服务器直接处理静态内容的请求,例如 HTML、CSS、JavaScript 文件和图片等
- 由于 Nginx 是轻量级的高性能 Web 服务器,它能够快速地响应对这些静态资源的请求
- 动态内容交由后端应用服务器处理:
- 对于动态内容的请求,比如 PHP、JSP、ASP.NET 等页面,Nginx 通过反向代理将这部分请求转发给后端的应用服务器处理
- 后端应用服务器负责执行动态内容的逻辑,并将结果返回给 Nginx,再由 Nginx 返回给客户端
- 负载均衡:
- 如果有多个后端应用服务器,Nginx 可以作为负载均衡器,将动态请求分发到不同的后端服务器上
- 以提高整体的并发处理能力和可靠性
Nginx动静分离测试
安装java环境: java-1.8.0-openjdk
[root@javasv-A ~]# dnf -y install java-1.8.0-openjdk #安装jdk
[root@javasv-A ~]# java -version #查看版本
部署jsp测试页面
[root@javasv-A ~]# vim /usr/share/nginx/html/time.jsp
<html>
<head>
<meta charset='utf-8'>
</head>
<body>
<center>
Now time is: <%=new java.util.Date()%> <!--通过基类调用系统时间-->
</center>
</body>
</html>
[root@javasv-A ~]#
#访问测试,结果为curl返回页面源代码,浏览器访问直接下载页面
[root@javasv-A ~]# curl http://localhost/time.jsp
<html>
<head>
<meta charset='utf-8'>
</head>
<body>
<center>
Now time is: <%=new java.util.Date()%> <!--通过基类调用系统时间-->
</center>
</body>
</html>[root@javasv-A ~]#
部署Java应用Tomcat
- 将2024-AI大模型Java全链路工程师环境资料/第四模块/apache-tomcat-9.0.6.tar.gz上传至虚拟机A的/root
- 使用WindTerm的上传/下载功能,需要提前在虚拟机中安装lrzsz软件
[root@javasv-A ~]# dnf -y install lrzsz
安装tomcat服务
[root@javasv-A ~]# tar -xf apache-tomcat-9.0.6.tar.gz #解压缩tomcat源码
[root@javasv-A ~]# mv apache-tomcat-9.0.6 /usr/local/tomcat #移动安装目录并改名
停止/启动服务(最后将服务启动)
[root@javasv-A ~]# /usr/local/tomcat/bin/startup.sh #启动服务
[root@javasv-A ~]# /usr/local/tomcat/bin/shutdown.sh #停止服务
[root@javasv-A ~]# /usr/local/tomcat/bin/startup.sh #启动服务
[root@javasv-A ~]# ss -nutlp | grep java #查看端口(8080、8005、8009)
部署jsp页面至tomcat服务
[root@javasv-A ~]# cp /usr/share/nginx/html/time.jsp /usr/local/tomcat/webapps/ROOT/
[root@javasv-A ~]# curl http://192.168.8.100:8080/time.jsp #访问测试
<html>
<head>
<meta charset='utf-8'>
</head>
<body>
<center>
Now time is: Mon May 06 18:34:54 CST 2024 <!--通过基类调用系统时间-->
</center>
</body>
</html>
[root@javasv-A ~]#
配置Nginx动静分离
[root@javasv-A ~]# vim /etc/nginx/nginx.conf
...原有配置不动...
50 location ~ \.jsp$ {
51 proxy_pass http://127.0.0.1:8080;
52 }
...原有配置不动
#重启nginx服务并测试
[root@javasv-A ~]# systemctl restart nginx
[root@javasv-A ~]# curl http://192.168.8.100/time.jsp #访问测试
<html>
<head>
<meta charset='utf-8'>
</head>
<body>
<center>
Now time is: Mon May 06 19:37:09 CST 2024 <!--通过基类调用系统时间-->
</center>
</body>
</html>
Nginx代理服务
- 代理服务是一种网络服务,允许客户端通过中间服务器(即代理服务器)与目标服务器进行通信。代理服务器接收来自客户端的请求,然后将这些请求转发给目标服务器,再将目标服务器的响应返回给客户端。
- Nginx作为代理服务器的优势
- 高性能:Nginx采用了异步非阻塞的事件驱动模型,能够处理大量的并发连接和请求,具有出色的性能和可扩展性。
- 稳定性:Nginx经过严格的测试和优化,具有极高的稳定性和可靠性,能够在各种复杂的网络环境中稳定运行。
- 易用性:Nginx的配置文件简洁明了,易于学习和使用。同时,Nginx提供了丰富的模块和指令,可以满足各种复杂的代理需求。
- 灵活性:Nginx可以作为正向代理服务器、反向代理服务器或负载均衡器使用,支持多种协议和扩展模块,具有极高的灵活性。
实验架构
主机名 | IP地址 | 配额 | 角色 |
---|---|---|---|
proxy | ens160: 192.168.4.50|ens192: 192.168.8.50 | 1G内存1CPU | 代理服务器 |
javasv-A | ens160: 192.168.8.100 | 1G内存1CPU | web服务器 |
javasv-B | ens160: 192.168.8.101 | 1G内存1CPU | web服务器 |
windows | vmnet1: 192.168.4.254 | --- | 客户端 |
- 使用模板机重新克隆虚拟机A、虚拟机B、虚拟机proxy
- 克隆后的机器是有配置好的yum仓库以及关闭了防火墙和SElinux
- 配置完毕后使用WindTerm将虚拟机远程连接
虚拟机A操作
[root@template ~]# hostnamectl set-hostname javasv-A 修改主机名
[root@javasv-A ~]# nmcli connection show #查看网卡名
#配置入网参数
~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.8.100/24 ipv4.gateway 192.168.8.254 ipv4.dns 192.168.8.254 connection.autoconnect yes
[root@javasv-A ~]# nmcli connection up ens160 #激活网卡
[root@javasv-A ~]# dnf clean all
[root@javasv-A ~]# dnf repolist -v #查看yum仓库是否可用
虚拟机B操作(注意网卡名不要照抄,以自己的为准)
[root@template ~]# hostnamectl set-hostname javasv-B 修改主机名
[root@javasv-B ~]# nmcli connection show #查看网卡名
#配置入网参数
~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.8.101/24 ipv4.gateway 192.168.8.254 ipv4.dns 192.168.8.254 connection.autoconnect yes
[root@javasv-B ~]# nmcli connection up ens160 #激活网卡
[root@javasv-B ~]# dnf clean all
[root@javasv-B ~]# dnf repolist -v #查看yum仓库是否可用
配置虚拟机proxy,添加一块网卡
Windows将虚拟网卡vmnet1的IP地址配置为:192.168.4.254/24
[root@template ~]# hostnamectl set-hostname proxy #修改主机名
[root@proxy ~]# nmcli connection show #查看网卡连接名
[root@proxy ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.4.50/24 connection.autoconnect yes #配置IP地址
[root@proxy ~]# nmcli connection up ens160 #激活网卡
添加第二块网卡
[root@proxy ~]# nmcli device status #查看网卡设备(以查看到的为准)
DEVICE TYPE STATE CONNECTION
ens160 ethernet 已连接 ens160
virbr0 bridge 连接(外部) virbr0
ens192 ethernet 已断开 --
lo loopback 未托管 --
~]# nmcli connection add ifname ens192 con-name ens192 type ethernet
[root@proxy ~]# nmcli connection modify ens192 ipv4.method manual ipv4.addresses 192.168.8.50/24 ipv4.gateway 192.168.8.254 ipv4.dns 192.168.8.254 connection.autoconnect yes #配置入网参数
[root@proxy ~]# nmcli connection up ens192 #激活网卡
部署后端web服务器集群
- 配置后端web服务器,部署Nginx服务,编写测试页面
虚拟机A操作
[root@javasv-A ~]# dnf -y install nginx #安装nginx
[root@javasv-A ~]# echo AAA > /usr/share/nginx/html/index.html #编写测试页面
[root@javasv-A ~]# systemctl restart nginx #重启nginx服务
[root@javasv-A ~]# systemctl enable nginx #将服务设置为开机自启
[root@javasv-A ~]# ss -nutlp | grep :80 #查看端口
[root@javasv-A ~]# curl 192.168.8.100
虚拟机B操作
[root@javasv-B ~]# dnf -y install nginx #安装nginx
[root@javasv-B ~]# echo BBB > /usr/share/nginx/html/index.html #编写测试页面
[root@javasv-B ~]# systemctl restart nginx #重启nginx服务
[root@javasv-B ~]# systemctl enable nginx #将服务设置为开机自启
[root@javasv-B ~]# ss -nutlp | grep :80 #查看端口
[root@javasv-B ~]# curl 192.168.8.101 #访问测试
部署proxy代理服务器
配置Nginx服务器,添加服务器池,实现反向代理功能,
- 使用upstream定义后端服务器集群,集群名称任意(如backend)
- 使用server定义集群中的具体服务器和端口
[root@proxy ~]# dnf -y install nginx #安装nginx
[root@proxy ~]# vim /etc/nginx/nginx.conf #修改代理服务配置文件
37 upstream backend { #定义集群
38 server 192.168.8.100:80; #声明集群成员
39 server 192.168.8.101:80; #声明集群成员
40 }
41 server {
42 listen 80 default_server;
43 listen [::]:80 default_server;
44 server_name _;
45 root /usr/share/nginx/html;
46
47 # Load configuration files for the default server block.
48 include /etc/nginx/default.d/*.conf;
49
50 location / {
51 proxy_pass http://backend/; #调用集群
52 }
[root@proxy ~]# systemctl restart nginx #重启nginx
[root@proxy ~]# systemctl enable nginx #将服务设置为开机自启
访问测试
- 客户端可以使用命令行访问代理服务器,也可以使用真机浏览器访问代理服务器,不过要注意缓存
[root@proxy ~]# curl 192.168.4.50
AAA
[root@proxy ~]# curl 192.168.4.50
BBB
[root@proxy ~]# curl 192.168.4.50
AAA
[root@proxy ~]# curl 192.168.4.50
BBB
集群健康检查
集群成员可以设置如下属性,用于更加合理的针对不同环境完成更加合理的负载均衡
- weight设置服务器权重值,默认值为1
- max_fails设置最大失败次数,测试服务器几次才确认服务器失败
- fail_timeout设置失败超时时间,单位为秒
- down标记服务器已关机,不参与集群调度
[root@proxy ~]# vim /etc/nginx/nginx.conf
……
upstream backend {
server 192.168.8.100:80 weight=2 max_fails=2 fail_timeout=30;
server 192.168.8.101:80 weight=1;
}
访问测试
[root@proxy ~]# curl 192.168.4.50
AAA
[root@proxy ~]# curl 192.168.4.50
AAA
[root@proxy ~]# curl 192.168.4.50
BBB