Nginx

Nginx


Nginx简介

nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。

第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx优点和特性

Nginx 可以在大多数 Unix Linux OS 上编译运行,并有 Windows 移植版。Nginx 的1.20.0稳定版已经于2021年4月20日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。

Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:

在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。

  • 服务器

    • Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
    • 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
    • 无缓存的反向代理加速,简单的负载均衡和容错。
    • FastCGI,简单的负载均衡和容错。
    • 模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。
    • 支持 SSL 和 TLSSNI。
  • 代码

    • Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函数。而且,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库。
  • 代理服务器

    • 作为邮件代理服务:Nginx 同时也是一个非常优秀的邮件代理服务(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
    • Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。

nginx的模块与工作原理

nginx由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

nginx的模块分类
  • nginx的模块从结构上分为核心模块、基础模块和第三方模块

    • HTTP模块、EVENT模块和MAIL模块等属于核心模块
    • HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块
    • HTTP Upstream模块、Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块
    • 用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大
  • nginx模块从功能上分为三类,分别是:

    • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个
      Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出
    • Proxies(代理器模块)。就是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能
      nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等
  • nginx基本模块:所谓基本模块,指的是nginx默认的功能模块,它们提供的指令,允许你使用定义nginx基本功能的变量,在编译时不能被禁用,包括:

    • 核心模块:基本功能和指令,如进程管理和安全。常见的核心模块指令,大部分是放置在配置文件的顶部
    • 事件模块:在Nginx内配置网络使用的能力。常见的events(事件)模块指令,大部分是放置在配置文件的顶部
    • 配置模块:提供包含机制
    • 具体的指令,请参考nginx的官方文档
Nginx工作原理

1.nginx采用了异步非阻塞的工作方式
epoll模型:当有i/o事件产生时,epoll就会告诉进程哪个连接由i/o事件产生,然后进程就会处理这个事件。
nginx配置use epoll后,以异步非阻塞的方式工作,能够处理百万计的并发连接

2.处理过程:
每进来一个请求,会有一个工作进程去处理,但不是全程进行处理,处理可以会发生阻塞的情况;

比如:向后端服务器转发请求,那么这个处理的工作进程不会一直等待,它会在发送完请求后,注册一个事件等待后端服务器返回;此时,再有新的请求,这个worker就很快再按这种方式处理;而一旦后端服务器返回信息,就会触发这个事件,worker就会进行处理,这个请求才会接着往下走;
通过这种<快速处理并快速释放请求>的方式,达到同样的配置可以处理更大并发的目的

1

Nginx的工作模式

1.master-worker模式
nginx启动成功后,会有一个master进程和至少一个worker进程;
master进程负责处理系统信号、加载配置、管理worker进程

worker进程负责处理具体的业务逻辑
对外部来说,真正提供服务的时worker进程

优点:
稳定性高;一个worker进程挂掉后master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率;
配合Linux的cpu亲和性的匹配中,可以充分利用多核cpu的优势,提升性能;
处理信号、配置重新加载等可以做到尽可能不中断服务;

2.单进程模式
nginx只有一个进程,nginx的所有工作都由这个进程负责

优点:可以很方便的利用gdb工具进行调试

缺点:
不支持平滑升级
任何的信号处理都可以造成服务的中断
进程挂掉后,在没有外部监控的情况下,无法重启服务
生产环境中不会使用

Nginx源码安装

环境准备

主机名IP地址系统
nginx192.168.174.168centos8
nginx
首先在nginx官网选择要下载的版本
//首先关闭防火墙和selinux
[root@nginx ~]# setenforce 0
[root@nginx ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@nginx ~]# systemctl disable  --now firewalld.service 
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

//创建用户
[root@nginx ~]# useradd -rMs /sbin/nologin nginx

//安装所需要的依赖包
[root@nginx ~]# dnf -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make wget vim

//下载nginx源码包,并解压
	
[root@nginx ~]# wget http://nginx.org/download/nginx-1.20.2.tar.gz
[root@nginx ~]# tar -xf nginx-1.20.2.tar.gz 
[root@nginx ~]# cd nginx-1.20.2/
[root@nginx nginx-1.20.2]#

//准备安装
##在配置前我们其实可以隐藏一下nginx版本号,以防版本泄露
[root@nginx nginx-1.20.2]# vim src/core/nginx.h 
#define NGINX_VERSION      "111"    //修改这个参数隐藏nginx版本号

//开始配置
[root@nginx nginx-1.20.2]# ./configure \
> --prefix=/usr/local/nginx \              //指定安装路径
> --user=nginx \                           //指定用户和组
> --group=nginx \                          
> --with-debug \                           //开启debug功能
> --with-http_ssl_module \                 //开启各类模块
> --with-http_realip_module \
> --with-http_image_filter_module \
> --with-http_gunzip_module \
> --with-http_gzip_static_module \
> --with-http_stub_status_module

//开启编译安装
[root@nginx nginx-1.20.2]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
.........

//安装成功
[root@nginx nginx-1.20.2]# cd /usr/local/nginx/
[root@nginx nginx]# ls
conf  html  logs  sbin

安装完成后的配置

//配置环境变量
[root@nginx nginx]# echo "export PATH=$PATH:/usr/local/nginx/sbin" > /etc/profile.d/nginx.sh
[root@nginx nginx]# source /etc/profile.d/nginx.sh
	
//启动服务
[root@nginx nginx]# nginx
[root@nginx nginx]# ss -anlt
State      Recv-Q     Send-Q          Local Address:Port           Peer Address:Port     Process     
LISTEN     0          128                   0.0.0.0:22                  0.0.0.0:*                    
LISTEN     0          128                   0.0.0.0:80                  0.0.0.0:*                    
LISTEN     0          128                      [::]:22                     [::]:*                    

//关闭服务,编写service文件,并设置服务开机自启
[root@nginx nginx]# nginx -s stop
[root@nginx nginx]# ss -anlt
State      Recv-Q     Send-Q          Local Address:Port           Peer Address:Port     Process     
LISTEN     0          128                   0.0.0.0:22                  0.0.0.0:*                    
LISTEN     0          128                      [::]:22                     [::]:*                    

[root@nginx nginx]# cat > /usr/lib/systemd/system/nginx.service << EOF
> [Unit]
> Description=nginx server daemon
> After=network.target 
>  
> [Service]
> Type=forking
> ExecStart=/usr/local/nginx/sbin/nginx
> ExecStop=/usr/local/nginx/sbin/nginx -s stop
> ExecReload=/bin/kill -HUP \$MAINPID
>  
> [Install]
> WantedBy=multi-user.target
> EOF

[root@nginx nginx]# systemctl daemon-reload 
[root@nginx nginx]# systemctl enable --now nginx.service 
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@nginx nginx]# ss -anlt
State      Recv-Q     Send-Q           Local Address:Port           Peer Address:Port     Process     
LISTEN     0          128                    0.0.0.0:22                  0.0.0.0:*                    
LISTEN     0          128                    0.0.0.0:80                  0.0.0.0:*                    
LISTEN     0          128                       [::]:22                     [::]:*                    

进行访问
2
3

LISTEN 0 128 [::]:22 [::]😗

**进行访问**
[外链图片转存中...(img-zyxt5ev1-1665416116881)]
[外链图片转存中...(img-BN5nAich-1665416116882)]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值