nginx快速入门及配置文件结构

文章目录

  • Nginx 简介
  • Nginx 特性
  • Nginx 架构
  • Nginx 相比Apache的优点
  • Nginx 的安装
  • 启动、停止和重新加载 Nginx 配置
  • Nginx 配置文件结构
  • Nginx 工作流程

Nginx 简介

Nginx是 HTTP 和反向代理服务器,邮件代理服务器,以及 Igor Sysoev 最初编写的通用 TCP/UDP 代理服务器。
Nginx具备如下功能:

  1. 基本的 HTTP 服务器功能。
  2. 其他 HTTP 服务器功能(虚拟服务器、管道连接、限流等等)。
  3. 邮件代理服务器功能。
  4. TCP/UDP 代理服务器功能。

Nginx是一个主和几个工作进程;工作进程在非特权用户下运行。Nginx可以灵活配置, 重新配置和升级可执行文件,而不会中断客户端服务。

经过测试的操作系统和平台:

  1. FreeBSD 3 — 11 / i386; FreeBSD 5 — 11 / amd64;
  2. Linux 2.2 — 4 / i386; Linux 2.6 — 4 / amd64; Linux 3 — 4 / armv6l, armv7l, aarch64, ppc64le;
  3. Solaris 9 / i386, sun4u; Solaris 10 / i386, amd64, sun4v;
  4. AIX 7.1 / powerpc;
  5. HP-UX 11.31 / ia64;
  6. macOS / ppc, i386;
  7. Windows XP, Windows Server 2003.

在这里插入图片描述
Nginx用在哪里(应用场景)?互联网应用很多都有使用到nginx,是最外层的网关‘;比如腾讯课堂、网易邮箱等。
在这里插入图片描述

Nginx 特性

Nginx使用可扩展的事件驱动架构,而不是更传统的过程驱动架构。这需要更低的内存占用,并且当并发连接扩大时,使内存使用更可预测。

Nginx开发的目标是实现 10 倍以上的性能,优化服务器资源的使用,同时也能够扩展和支持网站的动态增长。 因此,Nginx成为最知名的模块化,事件驱动,异步,单线程 Web 服务器和 Web 代理之一。

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有很多非常优越的特性:
(1)作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。
(2)作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP 代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
(3)作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器,能够在 不间断服务的情况下进行软件版本的升级。

Nginx 架构

从一开始 nginx 就是一个专门的工具,可以实现更高性能,更密集和经济地使用服务器资源,同时实现网站的动态发展,所以它采用了不同的模式。 随着发展变成是一个模块化的,事件驱动的,异步的,单线程的非阻塞架构的 nginx 代码基础。
在这里插入图片描述
nginx 大量使用复用和事件通知,并专门用于分离进程的特定任务。 连接在有限数量的单线程进程称为工作(worker)的高效运行循环中处理。 在每个工作(worker)中,nginx 可以处理每秒数千个并发连接和请求。

Nginx 相比Apache的优点

Apache也是HTTP服务器,也可以做网关,早期使用Apache比较多,但随着Nginx的发展,Nginx越来越用的多。

  1. Nginx是纯C的代码风格进行模块化开发,让人更容易接受。
  2. Nginx的版本迭代比较频繁。
  3. Nginx提供的文档资料相当齐全。
  4. Nginx容易应用。
  5. 跨平台,兼容性好。

Nginx 的安装

可以通过系统命令安装:
sudo apt-get install nginx

也可以通过如下的源码方式安装:
准备第三方支持库源码:
(1)nginx-1.13.7.tar.gz :Nginx的源码。
(2)openssl-1.1.0g.tar.gz :Nginx支持https,需要这个库做一些加密和解密。
(3)pcre-8.41.tar.gz :正则表达式的库,Nginx用来做正则式匹配。
(4)zlib-1.2.11.tar.gz :压缩库。

wget https://sourceforge.net/projects/pcre/files/pcre/8.41/pcre-8.41.tar.gz 
--no-check-certificate
wget https://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz
--no-check-certificate
wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz --no-check-certificate
wget http://nginx.org/download/nginx-1.13.7.tar.gz

解压每个包:

tar xzvf nginx-1.13.7.tar.gz
tar xzvf openssl-1.1.0g.tar.gz
tar xzvf pcre-8.41.tar.gz
tar xzvf zlib-1.2.11.tar.gz

编译Nginx:

./configure --prefix=/usr/local/nginx --with-http_realip_module--with-http_addition_module --with-http_gzip_static_module--with-http_secure_link_module --with-http_stub_status_module--with-stream --with-pcre=/home/fly/workspace/pcre-8.41 --with-zlib=/home/fly/workspace/zlib-1.2.11 --with-openssl=/home/fly/workspace/openssl-1.1.0g

注意zlib、pcre、openssl的路径要改为自己的路径。
执行结果:

checking for OS
...
Configuration summary+ using PCRE library: /home/fly/workspace/pcre-8.41+ using OpenSSL library: /home/fly/workspace/openssl-1.1.0g+ using zlib library: /home/fly/workspace/zlib-1.2.11nginx path prefix: "/usr/local/nginx"nginx binary file: "/usr/local/nginx/sbin/nginx"nginx modules path: "/usr/local/nginx/modules"nginx configuration prefix: "/usr/local/nginx/conf"nginx configuration file: "/usr/local/nginx/conf/nginx.conf"nginx pid file: "/usr/local/nginx/logs/nginx.pid"nginx error log file: "/usr/local/nginx/logs/error.log"nginx http access log file: "/usr/local/nginx/logs/access.log"nginx http client request body temporary files: "client_body_temp"nginx http proxy temporary files: "proxy_temp"nginx http fastcgi temporary files: "fastcgi_temp"nginx http uwsgi temporary files: "uwsgi_temp"nginx http scgi temporary files: "scgi_temp"

安装Nginx:

make
sudo make install

在/usr/local/目录下面,产生了 nginx 的目录。

conf  html  logs  sbin

Nginx的配置文件存放于conf/nginx.conf,bin文件是位于sbin目录下的nginx文件,logs是存放的启动日志、错误日志、运行日志等。

启动Nginx(需要sudo权限):

cd /usr/loacal/nginx
sudo ./sbin/nginx -c ./conf/nginx.conf

打开浏览器访问此机器的IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功:
在这里插入图片描述

启动、停止和重新加载 Nginx 配置

要启动 nginx,请运行可执行文件。 当 nginx 启动后,可以通过使用-s 参数调用可执行文件来控制它。 使用以下语法:

nginx -s signal

信号(signal)的值可能是以下之一:
(1)stop - 快速关闭服务:要等待工作进程完成服务当前请求,该命令应该在启动 nginx 的同一用户下执行。
(2)quit - 正常关闭服务
(3)reload - 重新加载配置文件
(4)reopen - 重新打开日志文件

要重新加载配置文件,请执行:

nginx -s reload

当主进程收到要重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。 如果这是成功的,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。 否则,主进程回滚更改,并继续使用旧配置。 老工作进程,接收关闭命令,停止接受新连接,并继续维护当前请求,直到所有这些请求得到维护。 之后,旧的工作进程退出。

Nginx 配置文件结构

Nginx 由配置文件中指定的指令控制的模块组成。 指令分为简单指令和块指令。 一个简单的指令由空格分隔的名称和参数组成,并以分号(;)结尾。

块指令具有与简单指令相同的结构,但不是以分号结尾,而是以大括号({和})包围的一组附加指令结束。 如果块指令可以在大括号内部有其他指令,则称为上下文(例如:events,http,server 和 location)。

配置文件中放置在任何上下文之外的伪指令都被认为是主上下文。events 和 http 指令驻留在主上下文中,server 在 http 中的,而 location 在 http 块中。#号之后的一行的部分被视为注释。

手写一个简单的配置文件:

# test.conf
worker_processes 4;		#工作进程数量events {worker_connections 1024;
}http {server {listen 8888;	#监听端口}
}

这里没有配置自己的服务器目录,所以会默认访问/usr/local/nginx/html/index

# ls /usr/local/nginx/html/index
50x.html  index.html

worker_processes 4;配置的是工作进程数量。

$ ps -aux | grep nginx
root      11122  0.0  0.0  20676   384 ?        Ss   11:45   0:00 nginx: master process/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/fly.conf
nobody    11123  0.0  0.0  21100  2424 ?        S    11:45   0:00 nginx: worker process
nobody    11124  0.0  0.0  21100  2424 ?        S    11:45   0:00 nginx: worker process
nobody    11125  0.0  0.0  21100  2424 ?        S    11:45   0:00 nginx: worker process
nobody    11126  0.0  0.0  21100  2428 ?        S    11:45   0:00 nginx: worker process

Nginx可以放多个server,如下示例:

# test.conf
worker_processes 4;events {worker_connections 1024;
}http {server {listen 8888;}server {listen 8889;}server {listen 8890;}server {listen 8891;}
}

服务器的状态:

fly@fly-virtual-machine:/usr/local/nginx$ sudo netstat -anop | grep 8888
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      11536/fly.conf   关闭 (0.00/0/0)
fly@fly-virtual-machine:/usr/local/nginx$ sudo netstat -anop | grep 8889
tcp        0      0 0.0.0.0:8889            0.0.0.0:*               LISTEN      11536/fly.conf   关闭 (0.00/0/0)
fly@fly-virtual-machine:/usr/local/nginx$ sudo netstat -anop | grep 8890
tcp        0      0 0.0.0.0:8890            0.0.0.0:*               LISTEN      11536/fly.conf   关闭 (0.00/0/0)
fly@fly-virtual-machine:/usr/local/nginx$ sudo netstat -anop | grep 8891
tcp        0      0 0.0.0.0:8891            0.0.0.0:*               LISTEN      11536/fly.conf   关闭 (0.00/0/0)

可以看到所有的服务器都在一个进程里面,该进程就是Nginx的master的主进程。也就是说四个server都是被Nginx的master进程监听。

$ ps -aux | grep nginx
root      11536  0.0  0.0  20684   408 ?        Ss   14:25   0:00 nginx: master process./sbin/nginx -c conf/fly.conf
nobody    11537  0.0  0.0  21116  2396 ?        S    14:25   0:00 nginx: worker process
nobody    11538  0.0  0.0  21116  2396 ?        S    14:25   0:00 nginx: worker process
nobody    11539  0.0  0.0  21116  2396 ?        S    14:25   0:00 nginx: worker process
nobody    11540  0.0  0.0  21116  2400 ?        S    14:25   0:00 nginx: worker process

Nginx 工作流程

nginx 有一个主进程和几个工作进程。 主进程的主要目的是读取和评估配置,并维护工作进程。 工作进程对请求进行实际处理。 nginx 采用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分配请求。 工作进程的数量可在配置文件中定义,并且可以针对给定的配置进行修改,或者自动调整到可用 CPU 内核的数量。

在配置文件中确定 nginx 及其模块的工作方式。默认情况下,配置文件名为 nginx.conf,并放在目录:/usr/local/nginx/conf, /etc/nginx, 或 /usr/local/etc/nginx 中。

Nginx是由master进程监听,所有的请求都在worker进程处理。
在这里插入图片描述
那么如何做到在master进程监听,让 listen() 得到的listen fd进入到worker进程,然后可以在worker进程处理呢?
在master进行listen,listen之后进行fork()出子进程,这样master创建的 listen fd就可以被子进程继承了。

既然Nginx是有多个worker进程处理连接的,也就是存在多线程/多进程、多端口的情况,那么就势必会有惊群问题。这是客观问题。
Nginx内部是这么解决惊群问题的:在同一时刻,只有一个进程把listen fd加入epoll中,具体详见nginx惊群处理

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

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

相关文章

解锁潜力:创建支持Actions接口调用的高级GPTs

如何创建带有Actions接口调用的GPTs 在本篇博客中,我们将介绍如何创建一个带有Actions接口调用的GPTs ,以及如何进行配置和使用。我们将以 https://chat.openai.com/g/g-GMrQhe7ka-gptssearch 为例,演示整个过程。 Ps: 数据来源&#xff1a…

Linux:wget后台下载/查看后台任务进度

1. 后台下载 使用wget -b url: wget -b http://cn.wordpress.org/wordpress-3.1-zh_CN.zip后台任务启动后,会返回两段话,第一段返回一个pid,代表这个后台任务的进程,并且我们可以kill掉这个id来终止此次下载&#x…

Vue2系列 -- 组件自动化全局注册(require.context)

参考官网:https://v2.cn.vuejs.org/v2/guide/components-registration.html 1 作用 省略 import 引入组件 省略 在main.js 中注册 实现自动化引入组件 2 自定义文件夹 在 src 下新建一个 components/base 文件夹,用于存放要自动注册的组件 3 在 base…

【Docker】从零开始:1.Docker概述

【Docker】从零开始:1.Docker概述 1.什么是Docker2.为什么要使用Docker3.传统虚拟机技术与Linux容器技术的区别(1).传统虚拟机技术(2).Linux容器 4.Docker的特点一次构建、随处运行a.更快速的应用交付和部署b.更便捷的升级和扩缩容:c.更简单的系统运维d.…

边缘计算是如何为元宇宙提供动力的?

构建元宇宙虚拟世界并不简单,也并不便宜,但是还是有许多大型公司正在转移大量资源来开发他们的元宇宙业务,当然大部分企业注意力都围绕着 VR 耳机、AR 眼镜、触觉手套和其他沉浸式虚拟现实体验所需的可穿戴硬件。虽然这种沉浸式的体验是最终结…

2023.11.20 关于 Spring MVC 详解

目录 MVC 工作流程 Spring MVC 掌握三个功能 创建 Spring MVC 项目 推荐安装插件 EditStarters 安装步骤 使用方法 实现连接功能 基础注解 RequestMapping 指定 GET 和 POST 方法类型 ResponseBody 获取参数 传递 单个 或 多个参数 参数重命名 RequestParam …

5.基于飞蛾扑火算法(MFO)优化的VMD参数(MFO-VMD)

代码的使用说明 基于飞蛾扑火算法优化的VMD参数 优化算法代码原理 飞蛾扑火优化算法(Moth-Flame Optimization,MFO)是一种新型元启发式优化算法,该算法是受飞蛾围绕火焰飞行启发而提出的,具有搜索速度快、寻优能力强的…

事件溯源(Event Sourcing)和命令查询责任分离(CQRS)经验

这篇文章是实现一个基于 CQRS 和事件溯源原则的应用程序,描述这个过程的方式,我相信分享我面临的挑战和问题可能对一些人有用。特别是如果你正在开始自己的旅程。 业务背景 项目的背景与空中交通管理(ATM)领域相关。我们为一个 …

动手学深度学习——循环神经网络的简洁实现(代码详解)

文章目录 循环神经网络的简洁实现1. 定义模型2. 训练与预测 循环神经网络的简洁实现 # 使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, …

【Linux】文件操作

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻文件是什么?&am…

Python3.11+Pyside6开发电影下载程序

VideoSave是一款使用Python3.11Pyside6编写的提供下载电影/电视剧的软件,支持注册、登录、搜索、下载、查看日志等功能,提供了Window、Mac系统安装包。 先上效果图 提供功能 节省寻找资源的时间 ⌚️模糊搜索指定影片 🐴查看影片下载日志 &…

观光奶牛 (01分数规划、负环)

01分数规划问题:类似于观光奶牛这个题中的,求的路径上的点权值和与边权值和的商最大最小。 当前问题的推到如下: 该问题其实可以用二分图来解决, 在不断的二分答案中获取符合条件的最大值。然后问题就转化为如何是否存在和为mid的…

程序员如何“升级打怪”?我用了这几个“歪瓜”!

不会吧?不会吧?计算机本命专业出身、以及半路出家的,混了几年了,还在新手村?对得起这几年摸的鱼? 思考一下:如何从小白一跃为大师,从此走上人生巅峰、迎娶白富美?变强只…

Java --- JVM之垃圾回收相关知识概念

目录 一、System.gc() 二、内存溢出与内存泄漏 2.1、内存溢出 2.2、内存泄漏 三、Stop the world 四、垃圾回收的并行与并发 4.1、并发 4.2、并行 4.3、并行 vs 并发 4.4、垃圾回收的并发与并行 五、安全点与安全区域 5.1、安全点 5.2、安全区域 六、引用 6.1…

3.基于多能互补的热电联供微网优化运行复现(matlab代码)

0.代码链接 基于多能互补的热电联供微电网/综合能源系统优化运行(Matlab程序Yalmip+Cplex求解)_工业综合能源系统资源-CSDN文库 2. 主要内容:代码主要做的是多能互补的热电联供型微网优化运行模型,在需求侧对负荷类型…

Android Studio 引入Xui框架-简单应用

Android Studio Flamingo | 2022.2.1 Patch 2 Android 11开发、Gradle Version 8.0、 jdk17 源代码:GitHub - xuexiangjys/XUI: 💍A simple and elegant Android native UI framework, free your hands! (一个简洁而优雅的Android原生UI框架&#xff…

WordPress网站迁移实战经验

前几日,网站服务器到期,换了服务商,就把我的WordPress的网站迁移到本地电脑了。方便以后文章迁移。 本次迁移网站主要经历以下几个步骤。 1.域名转出。 2.备份数据库及网站文件下载。 3.重新搭建WordPress网站。 4.网站文件及数据库导入。 下面详细介绍下每个步骤的操作…

【狂神说Java】redis

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :【狂神说Java】 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台&#xff0c…

pipeline传参给job

场景:pipeline实现自动部署,job实现自动测试,但是只有部署dddd环境时,才调自动测试的job,所以需要在调自动测试job时,把参数传给测试job 上一个任务会显示下一步调谁 ------------------------------------…

解决:ERR This instance has cluster support disabled

问题描述 在使用Redisson做分布式锁,连接redis时,提示以下错误: 问题定位 通过指令: cluster nodes查看,发现 出现这种提示的原因,是因为此Redis实例已经禁用了集群(默认状态下是禁用状态)。 解决 …