万字详解Nginx技术

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性:在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品. 这里为你揭开它的神秘面纱......

一、介绍

简介

Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性:在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品:Nginx 在美国是做虚拟主机生 意的老板们经常选择的软件平台之一。

作用

搭建虚拟主机
服务的反向代理
在反向代理中配置集群的负载均衡
http 协议代理
对应本文的第五部分

负载均衡策略介绍

  • 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,后端服务器分配的请求数基本一致,如果后端服务器“down 掉”,能自动剔除。

  • 加权轮询

根据权重来进行轮询,权重高的服务器分配的请求更多,主要适应于后端服务器性能不均的情况,如新老服务器混用。

  • ip_hash

每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,主要用于解决 session 的问题,如购物车类的应用。

  • fair

按后端服务器的响应时间来分配请求,响应时间短的优先分配,能够最大化地平衡各后端服务器的压力,可以适用于后端服务器性能不均衡的情况,也可以防止某台后端服务器性能不足的情况下还继续接收同样多的请求从而造成雪崩效应。

  • url_hash

按访问 URL 的 hash 结果来分配请求,每个 URL 定向到同一个后端服务器,适用于后端服务器能够将 URL 的响应结果缓存的情况。

二、代理方式

正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然 后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

区别

位置不同
正向代理,架设在客户机和目标主机之间;
反向代理,架设在服务器端;
代理对象不同
正向代理,代理客户端,服务端不知道实际发起请求的客户端;
反向代理,代理服务端,客户端不知道实际提供服务的服务端;

在这里插入图片描述

三、安装Nginx

上传1

通过相关软件或者拖拽(部分支持)的形式将其放入虚拟机中,其中一种软件FileZila可以自行下载,使用安装都非常简单

配置安装环境

相关命令

在Linux命令行下输入无需下载
1、  yum install gcc-c++
2、  yum install -y pcre pcre-devel 
3、  yum install -y zlib zlib-devel 
4、  yum install -y openssl openssl-devel 

命令解释

1、安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,,需要安装 gcc
2、PCRE(Perl Compatible Regular Expressions)是一个 Perl 库,包括 perl 兼容的正则表 达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库。pcre-devel 是使用 pcre 开发的一个二次开发库。nginx 也需要此库。
3、zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip, 所以需要在 linux 上安装 zlib 库。 zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip, 所以需要在 linux 上安装 zlib 库。
4、OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥 和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。 nginx 不仅支持 http 协议,还支持 https(即在 ssl 协议上传输 http),所以需要在 linux 安装 openssl 库。

编译安装

1、解压: tar -zxvf nginx-1.8.0.tar.gz
2、创建nginx安装目录 , mkdir /usr/local/nginx
3、 在var 下创建相关目录,是nginx正常能够启动 mkdir /var/temp/nginx/client
4、创建运行目录 : 打开nginx-1.8.0的根目录,直接复制输入如下代码块代码( 配置安装参数)并回车
5、编译(nginx安装包,nginx根目录下): make
6、编译安装( 执行这些操作后, /usr/local/nginx目录下才有东西) make install

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

四、操作Nginx

启动

cd /usr/local/nginx/sbin/ 
./nginx 

//注意:执行./nginx 启动 nginx,这里可以-c 指定加载的 nginx 配置文件,如下:


./nginx -c /usr/local/nginx/conf/nginx.conf 
//此文件的地址也可以在编译安装 nginx 时指定./configure 的参数 -c (--/conf-path= 指向配置文件(nginx.conf))
//如果想指定要加载的自定义文件使用
//如果不指定-c,nginx 在启动时默认加载 conf/nginx.conf 文件,

停止

快速停止

cd /usr/local/nginx/sbin 
./nginx -s stop 
//此方式相当于先查出 nginx 进程 id 再使用 kill 命令强制杀掉进程

完整停止(建议使用)

cd /usr/local/nginx/sbin 
./nginx -s quit 
//此方式停止步骤是待 nginx 进程处理任务完毕进行停止。 

重启

./nginx -s quit 
./nginx 
//先停止,在启动

测试

nginx 安装成功,启动 nginx,即可访问虚拟机上的 nginx ,在浏览器上直接输入虚拟机的ip地址即可

在这里插入图片描述

五、Nginx的使用

虚拟主机的介绍

虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供 www 服务,这样就可以实现一台主机对外提供多个 web 服务,每个虚拟主机之间是独立的,互不影响的。
虚拟主机技术是互联网服务器采用的节省服务器硬件成本的技术,虚拟主机技术主要应用于 HTTP(Hypertext Transfer Protocol,超文本传输协议)服务,将一台服务器的某项或 者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬 件资源。

配置虚拟主机

需求:
为当前虚拟机绑定两个动态IP

为当前虚拟机动态IP改为静态IP

cd /etc/sysconfig/network-scripts

在这里插入图片描述

为当前虚拟机再绑定一个IP地址

将/etc/sysconfig/network-scripts/ifcfg-eth0 文件复制一份,命名为 ifcfg-eth0:1 修改其中内容如上图

重启虚拟机

重启后需要重新启动nginx,可以通过ping你配置好的IP地址来查看绑定的Ip地址是否成功

Nginx 的虚拟主机配置方式

基于IP的虚拟主机配置方式

需求:
一台 Linux 服务器绑定两个 ip:192.168.179.131、192.168.179.162 访问不同的 ip 请求不同的 html 目录,即:
访问 http://192.168.179.131 将访问“html131”目录下的 html 网页
访问 http://192.168.179.162 将访问“html162”目录下的 html 网页

1、复制nginx的根目录下的html文件夹
在这里插入图片描述
**2、修改每个文件夹内的里面的index.html,使其具有辨识度
3、修改Nginx的配置文件nginx.conf , 根据情况修改server_name,以及访问虚拟主机的web目录**

cd /usr/local/nginx/conf/nginx.conf
#基于 IP 的虚拟主机配置方式 
    server {
          listen       80;
        #为虚拟机指定域名
        server_name  192.168.179.131;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html131;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
            
            
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
            }
        }
     server {
          listen       80;
        #为虚拟机指定域名
        server_name  192.168.179.162;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html162;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
        }
     
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }

4、重启nginx并用浏览器访问

./sbin/nginx -s quit
./sbin/nginx

在这里插入图片描述
在这里插入图片描述

基于端口的虚拟主机配置方式

需求
Nginx 对 8080 与 9090 两个端口的进行监听 (192.168.179.162)
请求 8080 端口则访问 html8080 目录下的 index.html
请求 9090 端口则访问 html9090 目录下的 index.html

**1、复制nginx的根目录下的html文件夹
2、修改每个文件夹内的里面的index.html,使其具有辨识度**
在这里插入图片描述
3、修改Nginx的配置文件nginx.conf

#基于端口的虚拟主机配置方式 
    server {
          listen       8080;
        #为虚拟机指定域名
        server_name  192.168.179.162;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html8080;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
        }
     
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }
    server {
          listen       9090;
        #为虚拟机指定域名
        server_name  192.168.179.162;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html9090;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
        }
     
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }

4、重启nginx并用浏览器访问

./sbin/nginx -s quit
./sbin/nginx

在这里插入图片描述
在这里插入图片描述

基于域名的虚拟主机配置方式

需求:
两个域名指向同一个 nginx 服务器,用户访问不同的域名时显示不同的内容。
域名规划:
1, www.chy.com 2, www.imepause.cn

0、修改本机电脑的host文件,添加ip地址映射

在这里插入图片描述
在这里插入图片描述
1、复制nginx的根目录下的html文件夹
在这里插入图片描述
**2、修改每个文件夹内的里面的index.html,使其具有辨识度
3、修改Nginx的配置文件nginx.conf**

#基于域名的虚拟主机配置方式 ,修改server_name
    server {
          listen       80;
        #为虚拟机指定域名
        server_name  www.chy.com;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html-chy;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
            
            
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
            }
        }
        server {
          listen       80;
        #为虚拟机指定域名
        server_name  www.timepause.cn;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html-timepause;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
            
            
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
            }
        }

4、重启nginx并用浏览器访问

./sbin/nginx -s quit
./sbin/nginx

在这里插入图片描述
在这里插入图片描述

注意:

1、如果页面显示中文乱码,则需要在相关的index.xml的头部加上如下图的一行代码**
在这里插入图片描述

2、至此,nginx.conf修改后的文件如下(可直接复制,只需要根据注释修改即可):

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    #基于 IP 的虚拟主机配置方式 
    server {
          listen       80;
        #为虚拟机指定域名
        server_name  192.168.179.131;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html131;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
            
            
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
            }
        }
     server {
          listen       80;
        #为虚拟机指定域名
        server_name  192.168.179.162;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html162;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
        }
     
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }
    
    #基于端口的虚拟主机配置方式 
    server {
          listen       8080;
        #为虚拟机指定域名
        server_name  192.168.179.162;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html8080;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
        }
     
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }
    server {
          listen       9090;
        #为虚拟机指定域名
        server_name  192.168.179.162;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html9090;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
        }
     
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }
    
    #基于域名的虚拟主机配置方式 ,修改server_name
    server {
          listen       80;
        #为虚拟机指定域名
        server_name  www.chy.com;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html-chy;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
            
            
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
            }
        }
        server {
          listen       80;
        #为虚拟机指定域名
        server_name  www.timepause.cn;
    
        #主要配置路由访问信息
        location / {
            #用于指定访问根目录时,访问的虚拟主机的web目录
            root   html-timepause;
            #在不指定访问具体的资源时,默认的展示资源的列表
            index  index.html index.htm;
            
            
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
            }
        }

}

3、nginx.conf的结构介绍

在这里插入图片描述

  1. 如何在Linux中绑定多IP?
  2. 将原有的ip改为静态ip
  3. 复制一份ifconfig-eth0,改名为ifconfig-eth0:1
  4. 修改eth0:1中的IP地址,删除uuid
  5. 重启系统

Nginx中配置服务的反向代理

需求

安装两个 tomcat 服务,通过 nginx 反向代理。
本案例中使用两台虚拟机演示。 tomcat 安装到 192.168.179.128 环境中。
端口为 8080 与 9090 Nginx 安装在 192.168.179.128 环境中 , 需要有jdk的支持!!!
当访问第一个域名时,跳转到第一个tomcat
当访问第二个域名时,跳转到第二个tomcat

安装环境

安装tomcat

在这里插入图片描述
n表示用nginx做反向代理

配置tomcat

1、修改第二个tomcat的所有端口(启动、关闭、运行),使两个tomcat能够同时运行

在这里插入图片描述
2、修改两个tomcat的访问页面,使其具有辨识度
在这里插入图片描述
3、修改nginx.conf配置文件
在这里插入图片描述
在这里插入图片描述
测试
在这里插入图片描述
在这里插入图片描述

在反向代理中配置负载均衡

负载均衡,英文名称为 Load Balance, 其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

步骤

  1. 修改nginx配置文件

在这里插入图片描述

  1. 修改host文件

在这里插入图片描述
3 .重启nginx ,测试

轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后 端服务器 down 掉,能自动剔除

指定权重

指定轮询几率,weight 和访问比率成正比,用于后端服务器 性能不均的情况。

upstream backserver {  
server 192.168.179.128 weight=10;  
server 192.168.179.128 weight=10;  
} 

IP 绑定 ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访 问一个后端服务器,可以解决 session 的问题。
upstream backserver {
ip_hash; server 192.168.0.14:88;
server 192.168.0.15:80;
}
### 需求

nginx 作为负载均衡服务器,用户请求先到达 nginx,再由 nginx 根据负载配置 将请求转发至 tomcat 服务器。 nginx 负载均衡服务器:192.168.179.131
tomcat1 服务器:192.168.179.128:8080
tomcat2 服务器:192.168.179.128:9090
访问配置好的 www.chy.com,并刷新,随机出现这两个服务器的欢迎界面

在这里插入图片描述
在这里插入图片描述
## http协议代理:

由于 ftp 服务器是基于 ftp 协议处理的。那么现在我想在外部访问该图片,是没有办法访问的。他是不能处理 http 协议的。所以我们需要拥有一个能够处理 http 协议代理服务器。 其实就是使用了 Nginx 的虚拟主机的方式。
### 需求
使用 Nginx 的基于域名的虚拟主机的方式来完成在 KindEditor 中添加图片时的图片回 显处理。
nginx:192.168.179.131
VSFTPD:192.168.179.131
注意:nginx 与 VSFTPD 必须安装到同一个环境中。

步骤

1、在本机配置相关域名的映射,以便访问该域名时,自动跳转到虚拟机上相应的地址

在这里插入图片描述
2、在192.168.179.131的虚拟机上的nginx中配置nginx.conf
在这里插入图片描述

user  root; worker_processes  1; 
#error_log  logs/error.log;
#error_log  logs/error.log  notice; 
#error_log  logs/error.log  info; 
#pid        logs/nginx.pid; 
 
 
events {    
 worker_connections  1024;
 } 
 
 
http {     
    include       mime.types;  
    default_type  application/octet-stream; 
    sendfile        on;    
    keepalive_timeout  65; 
    
    #http域名解析
    server {         
    listen       80; 
        #为虚拟机指定 IP 或者是域名        
        server_name  img.chy.com; 
     
         #主要配置路由访问信息         
         location / {      
         #用于指定访问根目录时,访问虚拟主机的 web 目录           
         root  /home/ftpuser/; 
     
         #在不指定访问具体资源时,默认的展示资源的列表             
         index  index.html index.htm;   
         
         } 
     
         error_page   500 502 503 504  /50x.html;      
         location = /50x.html { 
         root   html;            
        } 
 
    } 
}
 

3、在/home/ftpuser/2019/07/22中上传一张图片(2019/07/22目录自己创建的),可以看到,通过域名+目录名即可完成图片的访问,大功告成!!!
在这里插入图片描述

链接:https://pan.baidu.com/s/1-0pgrJ1GQ3T1fkNqZ5CYGw
提取码:wpiy
复制这段内容后打开百度网盘手机App,操作更方便哦


  1. nginx软件分享
相关文章
|
6月前
|
缓存 前端开发 JavaScript
tomcat核心技术+Nginx性能调优技术
而Tomcat的基本配置,每个配置项也基本上对应了Tomcat的组件结构,如果要用一张图来形象展现一下Tomcat组成的话
119 1
|
6月前
|
缓存 负载均衡 应用服务中间件
高性能网络编程技术 Nginx 的概念与实践
Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器,它在网络编程技术领域中被广泛应用。本文将详细介绍Nginx的概念和实践,包括其核心原理、功能特点、优势和应用场景等方面。同时,还将深入探讨如何使用Nginx进行高性能网络编程,结合实际案例进行分析。
|
5月前
|
Ubuntu 前端开发 JavaScript
技术笔记:Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
技术笔记:Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
|
2月前
|
负载均衡 前端开发 应用服务中间件
前后端分离技术与NGINX的简单使用
前后端分离技术与NGINX的简单使用
|
1月前
|
缓存 负载均衡 应用服务中间件
解决Nginx常见问题的技术指南
解决Nginx常见问题的技术指南
141 0
|
5月前
|
缓存 负载均衡 应用服务中间件
技术笔记:Nginx配置详解
技术笔记:Nginx配置详解
31 0
|
5月前
|
负载均衡 前端开发 应用服务中间件
技术好文共享:超详细的Nginx简易教程
技术好文共享:超详细的Nginx简易教程
|
5月前
|
负载均衡 应用服务中间件 开发工具
技术笔记:nginx和keeplive实现负载均衡高可用
技术笔记:nginx和keeplive实现负载均衡高可用
|
6月前
|
Java 应用服务中间件 数据库连接
太厉害!Redis+Nginx+设计模式+Spring全家桶+Dubbo技术精选合集
最近花了很长的时间去搜罗Java核心技术好文,我把每个Java核心技术的优选文章都整理成了一个又一个的文档。昨天也是终于全部整理好了,今天就把这些东西分享给老铁们,也能为老铁们省去不少麻烦,想学什么技能了,遇到哪方面的问题了 直接打开文档学一学就好了。不多bb了,直接上干货!
|
6月前
|
缓存 负载均衡 应用服务中间件
高性能网络编程技术 Nginx 的概念与实践
在当今互联网时代,高性能网络编程技术越来越受到重视。Nginx 作为一款高性能、高可靠性的 Web 服务器,拥有广泛的应用和优异的性能表现。本文将介绍 Nginx 的基本概念、架构以及实践技巧,帮助读者更好地理解和使用这一工具。