当前位置: 首页 > article >正文

Linux中使用NGINX

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地址配额角色
proxyens160: 192.168.4.50|ens192: 192.168.8.501G内存1CPU代理服务器
javasv-Aens160: 192.168.8.1001G内存1CPUweb服务器
javasv-Bens160: 192.168.8.1011G内存1CPUweb服务器
windowsvmnet1: 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


http://www.kler.cn/a/374713.html

相关文章:

  • 啊手动阀示范点
  • Spring Boot中解决BeanDefinitionStoreException问题的实战分享
  • Failed to install Visual Studio Code update
  • 【Redis】浅析Redis大Key
  • [OceanBase-不止于记录]:揭秘双引擎战略,共探AI时代数据架构未来
  • 每日读则推(十四)——Meta Movie Gen: the most advanced media foundation models to-date
  • 第9章 JDBC编程
  • Golang | Leetcode Golang题解之第517题超级洗衣机
  • #渗透测试#SRC漏洞挖掘# 信息收集-Shodan之搜索语法进阶
  • 5G基站开通与调测
  • 重塑重工起重行业未来:网关与云平台携手共创价值新篇章
  • 基于单片机的库房环境监测控制系统设计
  • 浅析国产晶体管输出光耦合器
  • 【隐私计算篇】全同态加密应用场景案例(隐私云计算中的大模型推理、生物识别等)
  • 【题解】【分治】——Secret Cow Code S
  • 深入探讨 HTTP 与 HTTPS
  • 高效 TCP 代理服务器的实战解析:Go 语言编写的高性能代理实例20241028
  • LeetCode题练习与总结:设计推特--355
  • 浅谈人工智能之基于LLaMA-Factory进行Qwen2微调:医疗大模型
  • Verilog实现的莫尔斯电码发生器
  • 群控系统服务端开发模式-应用开发-上传配置功能开发
  • 计算机毕业设计 | springboot+vue电影院会员管理系统 影院后台管理(附源码)
  • Python 实现深度学习模型预测控制--预测模型构建
  • ISO 26262与ISO 21434:汽车安全领域的双重保障与交汇探索
  • 开启TikTok直播的全攻略:从网络条件到设备准备
  • API接口开放与安全管控 - 原理与实践