Nginx学习教程(基础篇)

目录

一、Nginx安装

二、Nginx基本使用

2.1、目录结构

conf 

html

logs

sbin

2.2、基本运行原理

2.3、nginx.conf最小配置解析

worker_processes

worker_connections

include mime.types

default_type  application/octet-stream

sendfile on

keepalive_timeout  65

虚拟主机配置

2.4、虚拟主机与域名解析

2.4.1、实现域名解析

2.4.2、实现Nginx不同端口访问不同项目

2.4.3、servername匹配规则

完整匹配

通配符匹配

通配符结束匹配

正则匹配

2.5、反向代理

2.5.1、介绍

2.5.2、实现反向代理

2.6、负载均衡

2.6.1、实现简单的负载均衡

2.6.2、负载均衡策略

轮询

weight(权重)

ip_hash

least_conn

url_hash

fair

2.7、动静分离

2.7.1、介绍

2.7.2、配置动静分离

2.7.3、使用正则配置动静分离

2.7.4、UrlRewrite

2.8、高可用配置

2.8.1、Keepalived

2.8.2、Keepalived配置


一、Nginx安装

请参考我的另一篇文章:Linux系统安装Nginx(保姆级教程)

二、Nginx基本使用

2.1、目录结构

conf 

用来存放配置相关文件。
最重要的就是此文件。

html

用来存放静态文件的默认目录 html、css等。

logs

access.log:用来记录用户访问日志,将时间、地点、人物三要素都记录下来。由于会记录每个人的每次访问,所以此文件会比较大,但放心,在配置文件中配置了,当文件过大,会往另外一个文件中记录。

error.log:顾名思义,就是记录一些错误的日志。

nginx.pid:里面只有一个pid号,当我们启动Nginx时,pid就是此号。

sbin

Nginx的主程序。

2.2、基本运行原理

第一步:用户发起一个请求。

第二步:Nginx启动后共有两个进程,一个是master主进程,另一个worker子进程,主进程不处理业务,只是协调子进程干活。

第三步:worker读取并解析配置文件/conf/nginx.conf,看用户发的请求能不能映射到配置文件中配置的url,能就直接映射。

2.3、nginx.conf最小配置解析

worker_processes

worker_processes  1; # 默认为1,表示开启一个业务进程

worker_connections

# 单个业务进程可接受连接数
events {
    worker_connections  1024;
}

include mime.types

http {
    # 引入http mime类型
    include       mime.types;

default_type  application/octet-stream

http {
    include       mime.types;
    # 如果mime类型没匹配上,默认使用二进制流的方式传输
    default_type  application/octet-stream;

sendfile on

sendfile        on; # 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。

keepalive_timeout  65

keepalive_timeout  65;

虚拟主机配置

# 主机
server {
        listen       80; # 监听端口号
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }

server{}:代表一个虚拟主机,一个nginx.conf文件可以配置多个主机,互不干扰,可以通过端口号listen的不同来区分。

listen:监听端口。

server_name:主机名,域名。

location:是域名或主机名后跟的uri,比如我nginx.conf配置如下:

# 主机
server {
        listen       8080; # 监听端口号
        server_name  localhost;

        api/ {
            root   html;
            index  index.html index.htm;
        }

    }

那前端用户请求的就应该是,http://localhost:8080/api/。

那么请求就会映射到html文件中,这里的html以后我们做项目,会把前端项目编译后的一堆文件放到html文件中,直接就可以访问。

error_page:错误页。

error_page   500 502 503 504  /50x.html;
location = /50x.html {
     root   html;
}

假如请求http://localhost:8080/api/userList路径,但是报错了,错误码是500,那么就会跳转到/50x.html,路径就会变成http://localhost:8080/50x.html,但我们没有50x.html,所以会将目录指向nginx/html中的50x.html。

2.4、虚拟主机与域名解析

原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务。

2.4.1、实现域名解析

第一步:复制你本机的hosts文件到桌面,路径是C:\Windows\System32\drivers\etc\hosts

第二步:打开桌面上的hosts文件,输入以下映射关系

你虚拟机的ip地址 www.s1.com

这样做的意思是,给你的IP地址映射一个域名,这样你就可以通过域名来访问nginx了。

第三步:保存并替换C:\Windows\System32\drivers\etc\hosts

第四步:ping www.s1.com

如果有响应就算成功!!!

第五步:在本机浏览器上访问www.s1.com,如果出现nginx页面就算配置映射成功

2.4.2、实现Nginx不同端口访问不同项目

我现在有个需求:我只有一台服务器,但我想输入不同端口号访问不同的项目,刚如何做?

第一步:在nginx/html中创建两个目录,里面分别写上不同的html页,代表两个项目

cd /usr/local/nginx/html

mkdir -p www

mkdir -p void

cd www

vi index.html

cd void

vi index.html

第二步:打开conf/nginx.conf文件,增加主机映射

cd /usr/local/nginx/conf

vi nginx.conf

在html基础上后面加上/www,代表的意思是,当我访问localhost:80就会去html/www文件下找index.html页。

复制进去,现在总共有两个server{},一个端口为80,另一个为88。

保存文件。

第三步:重启nginx

systemctl reload nginx

注意:这里如果重启完不生效,先stop命令停止,再用start命令启动。

第四步:本机访问进行测试

2.4.3、servername匹配规则

完整匹配

我们可以在同一servername中匹配多个域名。

server_name vod.mmban.com www1.mmban.com;

这样不管我们访问vod.mmban.com还是www1.mmban.com,都映射到一台主机上。

通配符匹配

server_name *.mmban.com

通配符结束匹配

server_name vod.*;

正则匹配

server_name ~^[0-9]+\.mmban\.com$;

2.5、反向代理

2.5.1、介绍

用户请求通过互联网打到我们机房网关路由上,路由和nginx是互通的,也就是说,用户请求直接访问nginx中间商,然后nginx转发到应用服务器。

由于Nginx是服务端提供给用户访问的,所以叫反向代理

2.5.2、实现反向代理

修改配置文件nginx.conf。

proxy_pass http://baidu.com;

 

意思就是当我访问localhost:80时,直接跳转到百度,但这种域名会变,从 localhost:80变成www.baidu.com,这是因为访问的外网。

如果你代理的是内网地址,比如192.168.X.1代理到192.168.X.2,那域名就不会变。

2.6、负载均衡

2.6.1、实现简单的负载均衡

在nginx.conf配置文件中添加如下代码:

upstream httpd {
    server 192.168.44.102:80;
    server 192.168.43.103:80;
}

server{
    listen 80;
    server_name localhost;
    
    location /{
        proxy_pass http://httpds; # httpds映射到上面配置的负载均衡名,随意起名
    }
}

注意:upstream和server是同级别的,别写到server{}里面。

这样当我们访问localhost:80,第一次代理到192.168.44.102:80,第二次代理到192.168.44.102:80,依次类推,一人一次,雨露均沾。

2.6.2、负载均衡策略

轮询

默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求,一人一下,雨露均沾。

weight(权重)

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

upstream httpd {
    server 127.0.0.1:8050 weight=10 down;
    server 127.0.0.1:8060 weight=1;
    server 127.0.0.1:8060 weight=1 backup;
}

down:表示当前的server暂时不参与负载。
weight:默认为1,weight越大,负载的权重就越大。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器,意思是备用服务器。

ip_hash

根据客户端的ip地址转发同一台服务器,可以保持会话。像轮询就不会保持会话,比如你在A服务器上登录过,这次轮询到B服务器了,那你就得重新登录。而ip_hash策略,就会根据你用户的ip地址,来定向转到同一台服务器,这样就可以保持会话了。

least_conn

最小连接数访问,这样能保证后端服务器的负载更加均衡。意思就是A服务器连接次数1000次,B服务器才20次,那么就会将剩下的往B上转。

url_hash

根据用户访问的url定向转发请求。

fair

根据后端服务器响应时间转发请求。

注意:ip_hash、least_conn、url_hash、fair这四种基本上在生产环境中不会用,有一个重要的问题,无法做到服务器动态上下线,比如有现在有4台服务器,我想动态下线一台,再上线两台,这个是做不到的。

2.7、动静分离

2.7.1、介绍

如果你是前后分离的项目,这一节就不用看了。

动静分离的意思是,我们单体项目比如SpringBoot,里面有很多html页,必然会引入很多图片、gif图、JS、CSS等静态资源。本来用户请求到Nginx,再代理到Tomcat,那是不是有点浪费资源呢?我们是否可以将静态资源都放到Nginx上,这样就少了一步代理操作。静从Nginx上取,动就直接代理到Tomcat后端服务器,这就叫动静分离。

2.7.2、配置动静分离

location / {
    proxy_pass http://127.0.0.1:8080;
}

location /css {
    root /usr/local/nginx/static; # 访问static下的css目录
    index index.html index.htm;
}

location /images {
    root /usr/local/nginx/static; # 访问static下的images目录
    index index.html index.htm;
}

location /js {
    root /usr/local/nginx/static; # 访问static下的js目录
    index index.html index.htm;
}

2.7.3、使用正则配置动静分离

location ~*/(css|img|js) {
    root /usr/local/nginx/static;
    index index.html index.htm;
}

2.7.4、UrlRewrite

location /{
    rewrite ^/2.html$  /index.jsp?pageNum=2 break;
    proxy_pass http://192.168.44.104:8080;
}

配置的rewrite意思就是重写url,我们访问localhost:80/2.html其实访问的是localhost:80//index.jsp?pageNum=2。其实压根就没有2.html,配置文件只要匹配上就行。

flag标记说明:
        last #本条规则匹配完成后,继续向下匹配新的location URI规则。
        break #本条规则匹配完成即终止,不再匹配后面的任何规则。
        redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址。
        permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

2.8、高可用配置

2.8.1、Keepalived

这东西有点像Redis的哨兵模式,当每一台Nginx配备一个Keepalived,每个Keepalived是互通的,假如A服务器上的Nginx宕机了,通过Keepalived就可以将请求都转到B服务器的Nginx。

2.8.2、Keepalived配置

参考我的另一篇文章:Linux上安装Keepalived,多台Nginx配置Keepalived(保姆级教程)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/55797.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python实现GA遗传算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世…

lc1074.元素和为目标值的子矩阵数量

创建二维前缀和数组 两个for循环,外循环表示子矩阵的左上角(x1,y1),内循环表示子矩阵的右下角(x2,y2) 两个for循环遍历,计算子矩阵的元素总和 四个变量,暴力破解的时间复杂度为O(…

驱动开发(中断)

头文件: #ifndef __LED_H__ #define __LED_H__#define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_LED1_RCC 0X50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014 #define PHY_LED2_RCC 0X50000A28#def…

【安装Tomcat,web站点部署】

Tomcat部署 第一种安装 yum install tomcat.noarch -y yum install tomcat-webapps.noarch -y #启动脚本 [rootlocalhost ~]# systemctl start tomcat这时可以通过IP地址端口访问 第二种安装 点击此处找到apache-tomcat-8.5.70.tar.gz 官网下载JDK #先安装JDK [rootlocalh…

小程序云开发快速入门(1/4)

前言 从上次完成了码仔备忘录本地版本后,码仔就养成了每天记录备忘录的好习惯,每周早上会记录下自己要做的任务,然后晚上在复盘一下今天的计划是否完成。 有一天,码仔看到它最喜欢的码妞在一旁愁眉苦脸。 码仔:“怎么…

思腾云计算

以AI赋能,致敬不凡 原创 Sitonholy 思腾合力 2023-04-28 07:00 发表于北京 收录于合集#品牌介绍156个 致敬不凡 以AI赋能 思 腾 合 力 人工智能的发展和应用与五一劳动节的意义和价值是相通的。人工智能的快速发展将会对劳动力市场和生产方式产生深远的影响&…

【Ansible】Ansible自动化运维工具之playbook剧本

playbook 一、playbook 的概述1. playbook 的概念2. playbook 的构成 二、playbook 的应用1. 安装 httpd 并启动2. 定义、引用变量3. 指定远程主机 sudo 切换用户4. when条件判断5. 迭代6. Templates 模块6.1 添加模板文件6.2 修改主机清单文件6.3 编写 playbook 7. tags 模块 …

谈一谈缓存穿透,击穿,雪崩

缓存穿透 缓存穿透是指在使用缓存系统时,频繁查询一个不存在于缓存中的数据,导致这个查询每次都要通过缓存层去查询数据源,无法从缓存中获得结果。这种情况下,大量的请求会直接穿透缓存层,直接访问数据源,…

GLM模型介绍

paper: 《GLM: General Language Model Pretraining with Autoregressive Blank Infilling》 摘要: 我们提出了一个基于自回归空白填充的通用语言模型(GLM)来解决这一挑战。GLM通过添加2D位置编码和允许任意顺序预测跨度来改进空白填充预训…

视频媒体有哪些?视频媒体采访服务怎么做?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 一,在国内,主流的视频媒体包括: 1. 电视台:包括国家级、地方性和专业性电视频道,涵盖各类新闻、综艺、娱乐、体育等节目。 2…

Linux下 Docker容器引擎基础(2)

目录 创建私有仓库 将修改过的nginx镜像做标记封装,准备上传到私有仓库 将镜像上传到私有仓库 从私有仓库中下载镜像到本地 CPU使用率 CPU共享比例 CPU周期限制 CPU 配额控制参数的混合案例 内存限制 Block IO 的限制 限制bps 和iops 创建私有仓库 仓库&a…

数据结构--基础知识

数据结构是什么? 数据结构是计算机科学中研究数据组织、存储和管理的方法和原则。它涉及存储和操作数据的方式,以便能够高效地使用和访问数据。 相关内容 基本组成 数组(Array):数组是一种线性数据结构,…

为什么需要智能工业自动化网络?如何搭建?

在当今快节奏的社会中,工业自动化变得越来越重要。传统的手动操作和生产方式已经不能满足现代工业的需求。因此,建设工业自动化已成为一个必然趋势。通过不断进步的新技术创建更高效、更可靠、更安全的智能工业自动化网络。在本文中,我们将讨…

RS232转Profinet网关怎么设置

关于如何使用RS232转Profinet网关将首昌的EDI-800A称重仪表接入到西门子PLC的Profinet网络中。这个故事不仅涉及到一些科技知识,还有实际操作的过程,希望大家能认真听哦。 我们都知道,工业自动化领域中,称重仪表是非常重要的一部…

springboot通过springdata整合es7.x

首先要明确通过springdata操作es必须要将版本号和es的版本号对应上,否则会报错(倒不用完全一一对应,但版本号最好不要相差太多)。springdata引入的版本号由springboot的版本号决定,对应关系如下: 这里我用…

这篇文章算是讲清楚了 弹性布局(display:flex;)属性详解

Flexbox 是 flexible box 的简称(注:意思是“灵活的盒子容器”),是 CSS3 引入的新的布局模式。它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来。 它之所以被称为 Flexbox &#xff0…

HCIP中期考试实验

考试需求 1、该拓扑为公司网络,其中包括公司总部、公司分部以及公司骨干网,不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名,并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中,运行OSPF协议或者BGP…

[MAUI 项目实战] 手势控制音乐播放器:圆形进度条

我们将绘制一个圆形的音乐播放控件,它包含一个圆形的进度条、专辑页面和播放按钮。 关于图形绘制 使用MAUI的绘制功能,需要Microsoft.Maui.Graphics库。 Microsoft.Maui.Graphics 是一个实验性的跨平台图形库,它可以在 .NET MAUI 中使用。它…

用html+javascript打造公文一键排版系统9:主送机关排版

一、主送机关的规定 公文一般在标题和正文之间还有主送机关,相关规定为: 主送机关 编排于标题下空一行位置,居左顶格,回行时仍顶格,最后一个机关名称后标全角冒号。如主送机关名称过多导致公文首页不能显示正文时&…

使用elementplus实现文本框的粘贴复制

需求: 文本框仅用于显示展示数据并且用户可以进行复制,并不会进行修改和编辑, 注意点: 1.首先且文本为多行。所以不能使用普通的el-input,这种一行超出就会隐藏了,如果多行超出行数也会隐藏(…