热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nginx安装配置及使用方法

文章目录基本概念1.Nginx介绍2.无代理3.正向代理4.反向代理4.1负载均衡4.2动静分离4.3高可用(HA)集群Nginx安装1.安装编译工具及库文件2.安装NginxNg


文章目录

        • 基本概念
          • 1. Nginx介绍
          • 2. 无代理
          • 3. 正向代理
          • 4. 反向代理
            • 4.1 负载均衡
            • 4.2 动静分离
            • 4.3 高可用(HA)集群
        • Nginx安装
            • 1. 安装编译工具及库文件
            • 2.安装Nginx
        • Nginx常用命令
        • Nginx配置文件说明
          • 1. 负载均衡配置
            • 1.1 轮询&加权轮询
            • 1.2least_conn
            • 1.3 ip_hash
            • 1.4 fair
            • 1.5 url_hash
          • 2. 动静分离
          • 3. 高可用(HA)集群
            • 3.1 准备工作
            • 3.2 配置keepalived


基本概念


1. Nginx介绍

​ Nginx是转为性能优化而开发的,它是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,特点是占有 内存少,并发处理能力强,以高性能低资源消耗而闻名,有大量网站都在使用Nginx


2. 无代理

不使用代理时,我们所发送的请求都是通过网络直接传达给目标服务器的



3. 正向代理

​ 正向代理是由客户端设置的,是指将请求发送给代理服务器,再由代理服务器转发给目标服务器,举个栗子:我们在玩游戏时,尤其是 大型网络游戏,都会选择迅游或UU游戏加速器,其实开启加速器就是在本地设置正向代理



4. 反向代理

​ 反向代理是由目标服务器端设置的,指我们将请求发送给目标服务器时,请求会先到达代理服务器,再将其转发给目标服务器,因为不 是我们主动配置,这个过程我们是无从感知的,这种代理配置是最常见的功能之一,我们使用百度、京东、淘宝等,其实都有使用反向 代理,只是我们不知道而已



4.1 负载均衡

负载均衡相关概念可以看一下此文章

Nginx提供了四种负载均衡策略,默认轮询算法,除此之外还有第三方的策略:fair、url_hash

4.1.1 轮询

​ 假设有10个请求,负载均衡采用默认方式(即轮询),请求结果会出现如下图所示的情况,每个请求按时间顺序逐一分配到不同的服 务器,若服务器宕掉,会自动剔除

4.1.2 加权轮询

​ 假设有10个请求,负载均衡采用的是加权轮询方式,请求结果会出现如下图所示的情况,需要给每台服务器配置权重,权重和访 问比率成正比,一般用于服务器性能不均的情况,权重越大越容易被访问,权重数值只是代表机率,下图示例中并非指访问6次必 定有3次请求是由②号服务器处理

4.1.3 least_conn

​ 把请求转发给连接数较少的服务器,轮询策略把请求平均的转发给各个服务器,使它们的负载大致相同,但是,有些请求占用的时间 较长,会导致其所在的服务器负载较高,这种情况下,least_conn策略就可以达到更好的负载均衡效果,如下图所示新请求会分给不 太繁忙的服务器

4.1.4 ip_hash

​ 假如有5个请求,负载均衡采用的是ip_hash方式,请求结果会出现如下图所示的情况,每个请求按访问IP的hash值进行分配,这 样每个访客固定访问一个服务器,可以解决Session不共享的问题,但是服务器重启后,hash值会重新计算,不过这种策略已经很 少用了,现在基本都是使用Redis做Session共享

4.1.5 fair(第三方)

​ fair策略是扩展策略,默认不被编译进nginx内核,使用需先进行编译安装,它根据后端服务器的响应时间判断负载情况,从中选出负 载最轻的机器进行分流,这种策略具有很强的自适应性,但实际网络环境往往没那么简单

4.1.6 url_hash(第三方)

​ 和ip_hash策略相似,按访问url的hash值进行分配,使每个url定向到同一个服务器,要配合缓存命中来使用,使用url_hash可以使 同一个请求到达同一台服务器,一旦缓存了资源,再此收到请求后就会直接从缓存中读取


4.2 动静分离

​ 指动态请求跟静态请求分开,可以理解成使用 Nginx处理静态页面,Tomcat 处理动态页面。动静分离大致分为两种,一种是完全把静 态文件独立成单独的域名放在独立的服务器上;另一种是动态跟静态文件混在一起发布,通过Nginx进行拆分。 可以通过location指定 不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量,加快网页 解析速度


4.3 高可用(HA)集群

​ 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,指通过设计减少系统的停工时间。为防止Nginx失效,需要建立一个备用Nginx,主Nginx和备用Nginx上都要运行HA监控程序,通过传送诸如“I am alive”的信息来监控对方的运行状况,当 备用Nginx不能在一定的时间内收到这样的信息时,它就接管主Nginx的服务IP并继续提供服务;当备用Nginx又从主Nginx收到“I am alive”的信息时,它就释放服务IP地址,由主Nginx接管工作并继续提供服务




Nginx安装


1. 安装编译工具及库文件

dnf install make gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y

Nginx安装需要进行编译,编译依赖gcc环境

Nginx的http模块使用pcre来解析正则表达式,pcre-devel是pcre的一个二次开发库

Nginx使用zlib对http包的内容进行gzip

Nginx支持http,也支持https(即在SSL协议上传输http),openssl包括SSL协议库、应用程序以及密码算法库


2.安装Nginx

Nginx下载地址:点击进入下载页

本次安装稳定版nginx-1.18.0,可以下载包后上传到服务器安装,亦可直接在线安装

2.1 下载安装包

wget http://nginx.org/download/nginx-1.18.0.tar.gz

2.2 解压

tar -zxvf nginx-1.18.0.tar.gz

2.3 配置

# 先切到nginx-1.18.0目录下
cd nginx-1.18.0
# 在Nginx根目录下执行以下命令
./configure
make
make install

2.4 启动Nginx

先查看Nginx安装路径,在sbin目录下启动Nginx

# 查看路径
whereis nginx
# 进入Nginx安装目录下的sbin目录
cd /usr/local/nginx/sbin
# 启动Nginx
./nginx

Nginx启动后无任何反馈,通过浏览器访问IP:80,进行验证



Nginx常用命令

# 在sbin目录下执行,或者在命令前加上路径
cd /usr/local/nginx/sbin
# 启动
./nginx
# 查看配置文件是否正确
./nginx -t
# 重新加载配置文件
./nginx -s reload
# 查看nginx进程
ps aux|grep nginx
# 安全退出
./nginx -s quit
# 停止Nginx
./nginx -s stop

当执行命令出现如下报错,

nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

首先判断Nginx是否已启动,ps -ef | grep nginx查看进程,若是Nginx未启动,启动后通常会恢复正常;若问题依然存在,则使用nginx -c参数指定nginx.conf文件的位置,执行以下命名即可解决

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf


Nginx配置文件说明

配置文件是在conf目录下nginx.conf文件

举例:在三台服务器上分别启动一个项目


访问三个项目如下


在192.166.66.21上安装并运行Nginx

Nginx的配置文件核心区域

全局配置 # 作用域是全局
events # Nginx工作事件配置
http # HTTP配置upstream # 负载均衡服务配置server # 主机配置location # URL匹配

全局配置:Nginx服务器整体运行的配置

主要包括配置运行Nginx服务器的用户(组)、worker process数,进程PID及日志存放路径,还有类型以及配置文件的引入等

events:Nginx服务器与用户的网络连接

主要包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process可以同时支持的最大连接数等

http:主要包括代理、缓存和日志定义等大部分功能以及第三方模块的配置

​ upstream:负责均衡策略、服务器地址及权重配置等

​ server:配置虚拟主机的相关参数,一个http中可以有多个server

​ location:配置请求的路由,对特定的请求进行配置

编辑/usr/local/nginx/conf/nginx.conf文件


1. 负载均衡配置

1.1 轮询&加权轮询

在http配置中添加如下配置

# upstream是配置负载均衡的,名称是自定义的,server是指服务地址
# weight是指权重,默认轮询策略的值是相同的,让weight值出现差异就是在配置加权轮询upstream dyd{server 192.166.66.21:8080 weight=1;server 192.166.66.22:8081 weight=6;server 192.166.66.23:8082 weight=3;}
# 修改server配置,添加proxy_pass地址,地址是负载均衡名称server {listen 80;server_name localhost;location / {root html;index index.html index.htm;proxy_pass http://dyd;}}
# 因为是三台服务,需要新增两个server,如果三台服务器的名称不一样,则需要修改server_nameserver {listen 80;server_name localhost;location / {root html;index index.html index.htm;proxy_pass http://dyd;}}server {listen 80;server_name localhost;location / {root html;index index.html index.htm;proxy_pass http://dyd;}}

配置完成后,保存退出,重新加载配置./nginx -s reload

最后我们只访问192.166.66.21,便可访问到另外两个项目,每次刷新页面,根据权重不同Nginx会轮询访问三个项目。这就是我们每次发出请求,Nginx根据权重去访问了不同的服务而得到的结果


# 若服务器名称相同,重新加载配置文件时会出现如下警告,这个不影响项目运行,可以忽略,或者修改hostname
[root@localhost sbin]# ./nginx -s reload
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored

1.2least_conn

# least_conn策略配置upstream dyd{least_conn;server 192.166.66.21:8080;server 192.166.66.22:8081;}

least_conn策略可以实现在某些请求耗时较长才能完成的情况下,更公平地控制应用程序实例上的负载


1.3 ip_hash

# ip_hash策略配置upstream dyd{ip_hash;server 192.166.66.22:8081;server 192.166.66.23:8082;}

配置后只能访问到一个项目,因为一旦有服务接收到并处理了请求后,之后所有的请求都将由它负责,不会再分给其它服务器,除非服务重启


1.4 fair

# fair策略配置upstream dyd{fair;server 192.166.66.22:8081;server 192.166.66.23:8082;}

按照服务器端的响应时间来分配请求,根据服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流


1.5 url_hash

# url_hash策略配置upstream dyd{hash $request_URL;server 192.166.66.22:8081;server 192.166.66.23:8082;}

同ip_hash相似,按访问url的hash值进行分配,使每个url定向到同一个服务器,需配合缓存命中来使用,url_hash配置后只能访问一台服务器,因为一旦在服务器中缓存了资源,再次收到来自此URL的请求后就会直接从缓存中读取


2. 动静分离

在系统中创建两个目录,路径及名称请自定义,如下图,在根目录创建test目录,并在test目录下分别创建images、dynamic目录,在images中放置几张图片,在dynamic目录中放置一个html文件


Nginx配置文件/usr/local/nginx/conf/nginx.conf修改为如下信息,请根据自建文件目录做适当修改

#配置主机端口及地址,server_name可以是主机名也可以是IP地址server{listen 80;server_name localhost;
# 配置静态文件请求路径location /images/ {root /test/;index index.html index.htm;# 设置目录浏览autoindex on;}
# 配置动态文件请求路径location /dynamic/ {root /test/;index index.html index.htm;}

配置Nginx文件后会启动Nginx,通过浏览器访问静态文件,如下图,可以成功访问到


通过浏览器访问html文件,如下图也可以成功访问到



3. 高可用(HA)集群

高可用集群解决的是保障应用程序持续对外提供服务的能力,高可用集群并不是保护用户的业务数据,而是保护用户的业务程序对外不间断提供服务的能力,使用高可用集群的目的是把因软件、硬件、人为因素等造成的故障对业务的影响降低到最低程度


3.1 准备工作

  1. 准备两台服务器

  2. 两台服务器都需要安装上Nginx

  3. 两台服务器都要安装Keepalived,安装命令dnf install keepalived -y

    安装keepalived后会在/etc/keepalived目录下生成一个配置keepalived.conf

    在两个服务器上各启动一个项目



配置负载均衡,方法就不再具体介绍了,根据上文介绍稍作修改即可,两个服务器都需要配置

upstream dyd{server 192.166.66.21:8080;server 192.166.66.22:8081;}server {listen 80;server_name localhost;location / {root html;index index.html index.htm;proxy_pass http://dyd;}}server {listen 80;server_name localhost;location / {root html;index index.html index.htm;proxy_pass http://dyd;}}

配置完成使用浏览器进行验证,直接通过192.166.66.21192.166.66.22都应该能够访问到两个项目,每次刷新页面项目会变更



3.2 配置keepalived

  1. 配置keepalived.conf文件,修改为以下内容

    ! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.loc
    # 当前服务IP地址smtp_server 192.166.66.21smtp_connect_timeout 30
    # 需要在/etc/hosts中添加本地解析127.0.0.1 duanrouter_id duan
    }vrrp_script chk_http_port {
    # 脚本路径scrip "/usr/local/src/nginx_check.sh"
    # 检查脚本执行间隔时间(s)和权重interval 2weight 2
    }vrrp_instance VI_1 {
    # 备用服务器上需要将MASTER改为BACKUPstate MASTER
    # 网卡名interface ens33
    # 主、备服务器的virtual_router_id必须相同 virtual_router_id 51
    # 主、备服务器要有不同的优先级,主服务器的值应该大于备用服务器的值priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {
    # VIP(即虚拟IP地址),需要与当前网络的网段保持一致192.166.66.100}
    }

    主、备服务器的脚本内容如下,脚本信息是负责监控主、备服务器是否正常,以便及时切换服务

    #! /bin/bash
    A=`ps -C nginx -no-header | WC -l`
    if [ $A -eq 0 ];then/usr/local/nginx/sbin/nginxsleep 2if [ `ps -C nginx --noheader | WC -l` -eq 0 ];thenkillall keepalivedfi
    fi

  2. 脚本文件配置后,依次启动nginx和keepalived,两台服务都要启动

    # 启动nginx
    cd /usr/local/nginx/sbin
    ./nginx
    # 启动keepalived
    systemctl start keepalived

  3. 验证

    启动主、备服务器后通过192.166.66.21192.166.66.22以及192.166.66.100应该都能访问到项目,即使任一服务器上的Nginx和keepalived停止运行了,通过VIP地址192.166.66.100始终都可以访问到项目

    当项目在主服务器192.166.66.21上启动后ip中会出现虚拟IP地址,下图是主服务器192.168.66.21上的IP信息

    当把主服务器192.166.66.21上的Nginx和keepalived停止后虚拟IP会消失,下图是停止Nginx和keepalived后的主服务器192.168.66.21上的IP信息

    查看备用服务器192.166.66.22上出现了虚拟IP,这是因为已成功切换为备用服务器,当启动主服务器上的Nginx和keepalived后IP又会从备用服务器192.166.66.22上消失,在主服务器上显示,下图是备用服务器192.168.66.22上的IP信息

    如果有些迷糊,实操一遍肯定就会理解啦!

    总之,任一Nginx停止运行,另外一个都会自动接管虚拟IP地址(VIP),所以不管哪台服务器上的Nginx停止运行,我们都可以通过虚拟IP(VIP)访问到项目


推荐阅读
  • 字节跳动深圳研发中心安全业务团队正在火热招募人才! ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • 在Python编程中,探讨了并发与并行的概念及其区别。并发指的是系统同时处理多个任务的能力,而并行则指在同一时间点上并行执行多个任务。文章详细解析了阻塞与非阻塞操作、同步与异步编程模型,以及IO多路复用技术的应用。通过模拟socket发送HTTP请求的过程,展示了如何创建连接、发送数据和接收响应,并强调了默认情况下socket的阻塞特性。此外,还介绍了如何利用这些技术优化网络通信性能和提高程序效率。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 《软件测试精要》深度解析与实战经验分享
    《软件测试精要》深度解析与实战经验分享,系统梳理了软件测试的核心概念与关键原则,结合实际项目中的测试经验和教训,详细探讨了测试分类、测试权衡要素、测试效率、测试覆盖率以及测试框架的引入和用例设计等内容,为读者提供了全面而实用的指导。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 浅析PHP中$_SERVER[
    在PHP后端开发中,`$_SERVER["HTTP_REFERER"]` 是一个非常有用的超级全局变量,它可以获取用户访问当前页面之前的URL。本文将详细介绍该变量的使用方法及其在不同场景下的应用,如页面跳转跟踪、安全验证和用户行为分析等。通过实例解析,帮助开发者更好地理解和利用这一功能。 ... [详细]
  • 优化后的标题:PHP分布式高并发秒杀系统设计与实现
    PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
    本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • PHP高性能并发处理技术深入解析
    在《PHP高性能并发处理技术深入解析》一文中,探讨了提升PHP应用性能的多种策略。首先,通过将应用程序与静态资源(如JavaScript、CSS文件及图像)分离并部署于专门的服务器上,有效减轻了主服务器的负载。其次,文章强调了页面缓存的重要性,通过缓存由应用程序生成的页面内容,不仅显著减少了CPU的使用率,还提升了用户的访问速度。对于需要动态更新的部分页面,文章也提出了相应的优化建议,确保在保持内容时效性的同时,不影响整体性能表现。 ... [详细]
author-avatar
哚菟菟_336
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有