Nginx快速上手

news2025/1/19 2:57:58

Nginx快速上手


OVERVIEW

  • Nginx快速上手
    • 一、基本概念
      • 1.Nginx初步认识
      • 2.正向/反向代理
        • (1)正向代理
        • (2)反向代理
    • 二、Nginx 安装和配置
      • 1.安装
      • 2.Nginx指令
      • 3.Nginx配置
    • 三、Nginx的使用
      • 1.Web服务器
        • (1)静态网页存储目录
        • (2)Nginx静态网页设置
      • 2.反向代理和负载均衡
        • (1)反向代理设置
        • (2)负载均衡设置
      • 3.总结
    • 四、相关内容补充
      • 1.URL和URI
      • 2.DNS解析过程

一、基本概念

1.Nginx初步认识

Nginx能干什么?

  1. 作为web服务器:解析http协议
  2. 反向代理服务器:了解反向代理的概念
  3. 邮件服务器:解析邮件相关的协议: pop3/smtp/imap

Nginx的优势?

  1. 更快:高峰期(数以万计的并发时)nginx可以比其它web服务器更快的响应请求
  2. 高扩展:低耦合设计的模块组成,丰富的第三方模块支持
  3. 高可靠:经过大批网站检验,新浪、迅雷、
  4. 每个worker进程相对独立, 出错之后可以快速开启新的worker
    • worker进程的个数是可以控制的
    • 在后台干活的进程
  5. 低内存消耗:一般情况下,10000个非活跃的HTTP,Keep-Alive连接在nginx中仅消耗 2.5M内存
  6. 单机支持10万以上的并发连接:取决于内存,10万远未封顶
  7. 热部署:master和worker的分离设计,可实现7x24小时不间断服务的前提下升级nginx可执行文件
  8. 最自由的BSD许可协议:BSD许可协议允许用户免费使用nginx, 修改nginx源码,然后再发布(淘宝: tengine)

2.正向/反向代理

(1)正向代理

正向代理是位于客户端和原始服务器之间的服务器,为了能够从原始服务器获取请求的内容,客户端需要将请求发送给代理服务器,然后再由代理服务器将请求转发给原始服务器,原始服务器接受到代理服务器的请求并处理,然后将处理好的数据转发给代理服务器,之后再由代理服务器转发发给客户端,完成整个请求过程。

正向代理服务器是为用户服务的,正向代理的典型用途就是为在防火墙内的局域网客户端提供访问Internet的途径, 比如:

  • 学校的局域网
  • 单位局域网访问外部资源

在这里插入图片描述

(2)反向代理

反向代理方式是指代理原始服务器来接受来自Internet的链接请求然后将请求转发给内部网络上的原始服务器,并将从原始服务器上得到的结果转发给Internet上请求数据的客户端。那么顾名思义,反向代理就是位于Internet和原始服务器之间的服务器,对于客户端来说就表现为一台服务器,客户端所发送的请求都是直接发送给反向代理服务器,然后由反向代理服务器统一调配。

在这里插入图片描述

  1. 客户端给服务器发送请求, 连接服务器, 用户不知道服务器地址, 只有反向代理服务器的地址是公开的
  2. 请求直接发给反向代理服务器
  3. 反向代理服务器将请求转发给后边的web服务器
    • web服务器 N 台
    • 反向代理服务器转发请求会轮询进行
  4. web服务器收到请求进行处理, 得到结果
  5. web服务器将处理结果发送给反向代理服务器
  6. 反向代理服务器将拿到的结果转发给客户端

二、Nginx 安装和配置

1.安装

Nginx相关依赖安装

  • OpenSSL密码库(使用https进行通信的时候使用): http://www.openssl.org/
    • ./configure
    • make
    • sudo make install
  • ZLib数据压缩下载: http://www.zlib.net/
    • ./configure
    • make
    • sudo make install
  • PCRE解析正则表达式下载: http://www.pcre.org/
    • ./configure
    • make
    • sudo make install

Nginx安装

# nginx工作时候需要依赖三个库
# 三个参数=这三个库对应的源码安装目录
# 具体目录需要根据自己的电脑的库安装包的位置进行指定
./configure --with-openssl=../openssl-1.0.1t --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11
make
sudo make install

2.Nginx指令

  • Nginx的默认安装目录

    /usr/local/nginx
     conf -> 存储配置文件的目录
     html -> 默认的存储网站(服务器)静态资源的目录 [图片, html, js, css]
     logs -> 存储log日志
     sbin -> 启动nginx的可执行程序
    
  • Nginx可执行程序的路径

    /usr/local/nginx/sbin/nginx
    # 快速启动的方式
    # 1. 将/usr/local/nginx/sbin/添加到环境变量PATH中
    # 2. /usr/local/nginx/sbin/nginx创建软连接, 放到PATH对应的路径中, 比如: /usr/bin
    ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
    
  • 启动Nginx - 需要管理器权限

    # 假设软连接已经创建完毕
    sudo nginx # 启动
    # 查看nginx运行状态
    ps -ef | grep nginx
    
  • 关闭Nginx

    # 第一种, 马上关闭
    sudo nginx -s stop
    # 第二种, 等nginx做完本次操作之后关闭
    sudo nginx -s quit
    
  • 重新加载Nginx

    sudo nginx -s reload  # 修改了nginx的配置文件之后, 需要执行该命令
    
  • 测试是否安装成功

    • 知道nginx对应的主机的IP地址 - > 192.168.1.100
    • 在浏览器中访问该IP地址看到一个welcom nginx的欢迎界面

3.Nginx配置

  1. Nginx配置文件的位置

    /usr/local/nginx/conf/nginx.conf
    
  2. Nginx配置文件的组织格式

    • http -> 模块, http相关的通信设置
      • server模块 -> 每个server对应的是一台web服务器
        • location 模块:处理的是客户端的请求
    • mail -> 模块, 处理邮件相关的动作
  3. 常用配置项介绍

user  nobody; # 启动之后的worker进程属于谁
	- 错误提示: nginx操作xxx文件时候失败, 原因: Permission denied  
	- 将nobody -> root
worker_processes  1; # 设置worker进程的个数, 最大 == cpu的核数 (推荐)
error_log  logs/error.log; # 错误日志, /usr/local/nginx
pid        logs/nginx.pid; # pid文件, 里边是nginx的进程ID
# nginx的事件处理
events {
 	use epoll;	# 多路IO转接模型使用epoll
 	worker_connections  1024;// 每个工作的进程的最大连接数
}
http->server -> 每个server模块可以看做一台web服务器
server{
	listen       80;  # web服务器监听的端口, http协议的默认端口,https默认443
    server_name  localhost; # 对应一个域名, 客户端通过该域名访问服务器
    charset utf8; 	# 字符串编码
    location {	// 模块, 处理客户端的请求
	}
}

# 客户端 (浏览器), 请求:
  http://192.168.10.100:80/login.html
# 服务器处理客户端的请求
  服务器要处理的指令如何从url中提取?
  - 去掉协议: http
  - 去掉IP/域名+端口: 192.168.10.100:80
  - 最后如果是文件名, 去掉该名字: login.html
  - 剩下的: /
  服务器要处理的location指令: 
  location /
  {
        处理动作
  }

三、Nginx的使用

1.Web服务器

(1)静态网页存储目录

  • 默认的存储目录:

    /usr/local/nginx/html
    
  • 自己创建新的目录:

    应该在 /usr/local/nginx/
    mkdir /usr/local/nginx/mydir
    

(2)Nginx静态网页设置

在Nginx服务器上进行网页部署, 实现如下访问:在/usr/local/nginx/创建新的目录, 用来存储静态网页,

几个问题

  1. 客户端发起访问地址(访问静态网页): http://192.168.80.254/login.html ,

    是访问服务器的哪个位置?静态页面的login.html放到什么位置? 服务器要处理的动作

     / -> 服务器的资源根目录, /usr/local/nginx/yundisk,login.htm-> 放到yundisk中
    
    #对应这个请求服务器要添加一个location
    location 指令(/)
    {
        # 找一个静态网页
        root yundisk;  # 相对于/usr/local/nginx/来找
        # 客户端的请求是一个目录, nginx需要找一默认显示的网页index.html
        # index index.html index.htm;
    }
    # 配置之后重启nginx
    sudo nginx -s reload
    
  2. 访问地址(访问静态网页): http://192.168.80.254/hello/reg.html

    hello是什么?目录

    reg.html放到哪儿?hello目录中

    如何添加location?

     location /hello/
    {
        root yundisk;
        # index xx.html;
     }
    
  3. 访问地址(访问目录): http://192.168.80.254/upload/ ,浏览器显示upload.html

    直接访问一个目录, 得到一默认网页

    upload是一个目录, uplaod.html应该再upload目录中

     location /upload/
    {
        root yundisk;
        index upload.html;
    }
    

2.反向代理和负载均衡

  1. 需要客户端 - 1个:Window中的浏览器作为客户端

  2. 反向代理服务器 -> 1个:作为反向代理服务器

  3. web服务器 -> 2个

    • ubuntu - server1: 192.168.247.135

    • ubuntu - server2 : 192.168.26.250

(1)反向代理设置

在这里插入图片描述

修改nginx的配置文件 - conf/nginx.conf
# 代理几台服务器就需要几个server模块
# 将 domain_name1 与 domain_name2设置为映射到同一个ip地址
    # 客户端访问的url: http://192.168.1.100/login.html
	# server1
    server {
        listen       80;        # 客户端访问反向代理服务器, 代理服务器监听的端口
        server_name  domain_name1; # 客户端访问反向代理服务器, 需要一个域名
        location / {
            # 反向代理服务器转发指令, http:// 固定
            proxy_pass http://server1.test.com;
        }

    }
    # 添加一个代理模块
    upstream server1.test.com
    {
        server 192.168.247.135:80;
    }

    # server2
    server {
        listen       80;        # 客户端访问反向代理服务器, 代理服务器监听的端口
        server_name  domain_name2; # 客户端访问反向代理服务器, 需要一个域名
        location / {
            # 反向代理服务器转发指令, http:// 固定
            proxy_pass http://server2.test.com;
        }
    }
    # 添加一个代理模块
    upstream server2.test.com
    {
        server 192.168.26.250:80;
    }
}

(2)负载均衡设置

在这里插入图片描述

反向代理服务器需要做什么?
	server {
        listen       80;         # 客户端访问反向代理服务器, 代理服务器监听的端口
        server_name  localhost; # 客户端访问反向代理服务器, 需要一个域名
        location / {
            # 反向代理服务器转发指令, http:// 固定的头
            proxy_pass http://linux.com;
        }
        location /hello/ {
            # 反向代理服务器转发指令, http:// 固定的头
            proxy_pass http://linux.com;
        }
    	location /upload/ {
            # 反向代理服务器转发指令, http:// 固定的头
            proxy_pass http://linux.com;
        }

    }
    # 添加一个代理模块
    upstream linux.com
    {
        server 192.168.247.135:80 weight=1;
        server 192.168.26.250:80 weight=3;
    }
web服务器需要做什么?
# 192.168.247.135
location /
{
    root xxx;
    index xxx;
}
location /hello/ 
{
    root xx;
    index xxx;
}
location /upload/ 
{
    root xxx;
    index xx;
}

# 192.168.26.250
location /
{
    root xxx;
    index xxx;
}
location /hello/ 
{
    root xx;
    index xxx;
}
location /upload/ 
{
    root xxx;
    index xx;
}

3.总结

  • Nginx作为web服务器:
# 部署静态网页
1. 制作出来, 并且部署到对应的资源目录中
2. 根据客户端的请求, 在服务器端添加对应的 location处理指令 - nginx.conf
3. 重新加载nginx.conf配置文件
客户端请求的url: http://xxxx.com/hello/login.html
	- 去掉协议: http
	- 去掉域名/IP:
	- 去掉端口
	- 去掉尾部的文件名
  • Nginx作为反向代理服务器:
1. 找到反向代理服务器 的配置文件: nginx.conf
2. 找模块 http -> server
server{
    listen: 80; # 客户端访问反向代理服务器的时候使用的端口
    server_name: localhost; # 域名, 客户端访问反向代理服务器时候, 使用的地址
    # 配置如何转发, 根据客户端的请求的url找到对应的转发指令
    location /
    {
     	# 设置转发地址
        proxy_pass http://test.com;
    }    
     location /login
    {
     	# 设置转发地址
        proxy_pass http://test.com;
    } 
}
# 设置代理
upstream test.com
{
    # web服务器的地址信息
    server 192.168.1.100:80;
    server 192.168.1.101:80;
}

# 192.168.1.100 web服务器
http->server
server{
        location /
    {
     	# 设置转发地址
        root xxx;
    }    
     location /login
    {
     	# 设置转发地址
        xxxx;
    } 
}
# 192.168.1.101 web服务器
http->server
server{
        location /
    {
     	# 设置转发地址
        root xxx;
    }    
     location /login
    {
     	# 设置转发地址
        xxxx;
    } 
}

四、相关内容补充

1.URL和URI

在这里插入图片描述

  • URL(Uniform Resource Locator): 统一资源定位符,表示资源位置的字符串

    • 基本格式: “协议://IP地址/路径和文件名
    • ftp://ftp.is.co.za/rfc/rfc1808.txt
    • http://www.ietf.org/rfc/rfc2396.txt
    • telnet://192.0.2.16:80/
  • URN(Uniform Resource Name): 统一资源名称

    • P2P下载中使用的磁力链接
  • URI(Uniform Resource Identifier): 统一资源标识符

    • 是一个紧凑的字符串用来标示抽象或物理资源, URL是URI的一种
    • 让URI能成为URL的当然就是那个“访问机制”,“网络位置”。e.g. http:// or ftp://
      • files.hp.com
      • tel:+1-816-555-1212
      • ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL)
      • http://www.ietf.org/rfc/rfc2396.txt (also a URL)
      • telnet://192.0.2.16:80/ (also a URL)
  • 经验式理解:

    http://localhost:8080/myweb/hello.html
    

    从包含关系上说: URI包含URL

    字符串长度上说: URL包含URI

    UIRI可以没有协议, 没有地址(IP/域名)

2.DNS解析过程

在这里插入图片描述

  1. 在浏览器中输入www.magedu.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有就先调用这个IP地址映射,完成域名解析。
  2. 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
    Windows和Linux系统都会在本地缓存dns解析的记录,提高速度。
  3. 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
  4. 如果要查询的域名,不由本地DNS服务器区域解析,但该DNS服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
  5. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(没有设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责 .com域的这台服务器。这台负责 .com域的服务器收到请求后,如果自己无法解析,它就会找一个管理 .com域的下一级DNS服务器地址(magedu.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找magedu.com域服务器,重复上面的动作进行查询,直至找到www.magedu.com主机。
  6. 如果用的是转发模式(设置转发器),此DNS服务器就会把请求转发至上一级ISP DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java对日开发成趋势?网友:找工作打开了新思路

近两年行业环境起起伏伏,企业降本增效,提高人才招聘的门槛,导致大家找工作时觉得越来越难,尤其是Java开发,主打的就是一个“卷”! 不过行业变革,挑战与机遇并存。Java作为编程语言排行榜的常年第…

Java8 判空新写法(Optional方式)

1 引言 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince();这种写法&…

计算机网络 实验四

⭐计网实验专栏,欢迎订阅与关注! ★观前提示:本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求,因此以下内容建议仅做思路参考。 一、实验目的 理解ARP协议的工作原理掌握ARP、ICMP 处理过程 二、实验内容 利用网络…

BearPi环境搭建及基本使用

这是一篇总结,一些坑的记录 具体教程请访问: BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码 - Gitee.com 第一步:安装虚拟机 不做赘述 第二步:下载资源 这里要用到ubuntu的一些基础知识,不会的…

HTTP Flood攻击与防御原理

一.引言HTTP Flood攻击DDoS的一种,别称叫做CC攻击(CC是Challenge Collapsar的缩写,而Collapsar是国内一家著名安全公司的DDoS防御设备),是针对Web服务在第七层协议发起的攻击,重点在于突破前端的cache,通过HTTP头中的字段设置直接到达Web Ser…

精通线程池,看这一篇就够了

一:什么是线程池 当我们运用多线程技术处理任务时,需要不断通过new的方式创建线程,这样频繁创建和销毁线程,会造成cpu消耗过多。那么有没有什么办法避免频繁创建线程呢? 当然有,和我们以前学习过多连接池技术类似&…

安全头响应头(一)Content-Security-Policy

一 Content Security Policy CSP 中文翻译 ① 背景引入 "重点提炼" 1) CSP最初被设计用来减少XSS跨站点脚本攻击,该规范后续版本还可防止其他如点击劫持形式的攻击2) CSP 的实质就是白名单制度[1]、网站开发者明确告诉客户端,哪些外部资源可以加载和执行,等同…

STM32H750ZBT6核心板设计

成品图 注意事项 1、主频无法设置480Mhz,只能最高设置为400Mhz 设置版本号为V版本,即稳定版本即可以设置主频为480Mhz了,不清楚自己的STM32H750是什么版本,可以查看芯片上丝印,ST公司LOGO旁边有个Y/V,即是版本号。 2…

零碎Java

1. 1995年Sun公司开发了java 2009年Oracle收购了Sun公司 其中2004年的java5.0和2014年的java8.0更新力度最大 java特性:第一至今已有20多年了 第二编程语言 第三应用广泛 2. 二进制中逢二进一 11 10 111100 0000万 0000,0000亿 …

RK3568平台开发系列讲解(设备驱动篇)V4L2程序实现流程

🚀返回专栏总目录 文章目录 一、V4L2 进行视频采集二、命令标识符三、V4L2程序实例3.1、打开设备3.2、查询设备属性3.3、显示所有支持的格式3.4、设置图像帧格式3.5、申请缓冲区3.6、将申请的缓冲帧从内核空间映射到用户空间3.7、将申请的缓冲帧放入队列,并启动数据流3.8、启…

配置mpls vpn MCE组网

实验三:配置mpls vpn MCE组网 1、实验环境: 某公司需要通过mpls vpn实现总部和分部的互访,并且要实现不同部门之间的业务隔离,为了节省开支,总公司使用MCE设备接入不同的部门。要求分公司A只能访问总公司的部门A&…

分子生物学 第二章 遗传物质

文章目录第二章 遗传物质第一节 遗传物质的分子本质大多数生物体的遗传物质是DNA有些生物体的遗传物质是RNA蛋白质能否充当遗传物质第二节 核酸的结构1 DNA双螺旋结构的特征2 影响DNA双螺旋结构稳定性的因素3 DNA结构的多态性4 DNA多链结构5 DNA的超螺旋结构6 RNA的二级结构第三…

性能测评:腾讯云轻量2核4G5M服务器CPU内存带宽流量系统盘

2核4G云服务器可以选择腾讯云轻量应用服务器,自带5M公网带宽,5M带宽下载速度峰值可达640KB/秒,系统盘为60GB SSD盘,每月500GB流量包,折合每天16GB流量,2核4G5M轻量服务器一年168、198元15个月、三年628元&a…

OpenMV快速上手 | OpenMV硬件版本概述及HelloWorld

文章目录一、OpenMV1. 什么是OpenMV2. OpenMV版本2.1. OpenMV1(M4 V1)2.2. OpemMV2(M4 V2)2.3. OpenMV3(M7)2.4. OpenMV4(H7)二、OpenMV开发环境搭建三、hello world1. 连接OpenMV2.…

Callable、Runnable、Future 和 FutureTask

Callable 和 Future 是 Java 在后续版本中引入的,Callable 类似于 Runnable 接口,实现 Callback 接口的类与实现 Runnable 接口的类都可以用于被被线程执行的任务。 以下是两个接口的相关源码: // /xref/libcore/ojluni/src/main/java/java…

我为什么开发个人版的ChatGPT,而不使用集成好的商业版的十大好处。

随着人工智能技术的不断发展,ChatGPT已经成为了许多人工智能爱好者的热门话题。然而,面对现有的商业版ChatGPT,许多人可能会感到疑惑:为什么要自己开发个人版的ChatGPT,而不是直接使用集成好的商业版?本文将…

C++ 并发编程

文章目录基本概念编程创建线程启动共享数据相关条件变量时间相关future相关——等待一次性事件读写锁原子操作与缓存一致性关系线程管理启动线程从类的方法来创建线程传参标识线程常用API等待线程完成后台运行线程移动线程间共享数据互斥量(mutex)unique…

公网WebSocket Client远程连接本地WebSocket Server【内网穿透】

目录 1. Java 服务端demo环境 2. 在pom文件引入第三包封装的netty框架maven坐标 3. 创建服务端,以接口模式调用,方便外部调用 4. 启动服务,出现以下信息表示启动成功,暴露端口默认9999 5. 创建隧道映射内网端口 6. 创建隧道映射本地端口 7. 测试公网远程连接 1. Java 服…

一文轻松教会你基于Excel+关键字驱动的自动化测试框架封装

目录 一、概述 二、框架设计 测试用例管理 关键字库封装 数据驱动设计 日志记录和报告生成 三、框架实现 测试用例管理 关键字库封装 数据驱动设计 日志记录和报告生成 四、框架使用 编写测试用例 编写关键字库 执行测试 五、总结 一、概述 在软件开发过程中&a…

【Spring Security】| 从0到1编写一个权限认证 | 学会了吗?

目录一. 🦁 认证前的工作1. 添加依赖2. 创建数据库表(数据自行添加)3. 编写用户实体类4. 编写Dao接口5. 在启动类中添加 MapperScan 注解6. 继续添加各种包二. 🦁 自定义逻辑认证原理—UserDetailsService三. 🦁 数据库…