nginx介绍+部署

  • Post author:
  • Post category:其他




1. nginx简介

  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
  • Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。
  • 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2022年01月25日,nginx 1.21.6发布。
  • Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。



2.Nginx 使用场景



2.1 HTTP 服务器

Nginx 作为 Web 服务器能独立提供 Http 服务。另外,我们常常通过 Nginx 作为静态资源服务器来访问服务器上的静态资源,比如对于最新热门的前后端分离架构,前端打好包后直接放到某个地址,在 Nginx 配置后可以通过 Nginx 来访问主机上的前端页面。



2.2 反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。这样的好处是,将不暴露内部的服务地址,只统一使用一个公共出口,通过 URI 匹配转发到不同的内部服务处理请求。



2.3 负载均衡

负载均衡也是 Nginx 的一个高频使用场景,对于下游存在的多个相同服务,可以将请求采用某种策略(随机、轮询、权重)发到相应的服务处理。这样由于多个相同服务的存在,可以实现高可用功能,在一个服务不可用时,Nginx 会自动发现并将其剔出服务集群,将请求转发给正常的服务进行处理。



2.4 第三方插件

基于第三方插件,Nginx 可以完成各种各样复杂的功能,全方位满足程序员的想法。比如在 Nginx 中引入 lua 模块,可以实现对 Http 请求更细粒度的限制,包括限速、限流、校验认证等等。后续,在 Nginx 上发展出来的 OpenResty 已经应用到了微服务网关方向。



3. nginx优点



1. 高性能、高稳定、低资源消耗

Nginx 的进程模型采用了 Master/Workers 进程池的机制,即通常情况下,Nginx 会启动一个 Master 进程(当然,也可以无 master 进程)和多个 Worker 进程对外提供服务。Master 进程是监控进程,本身并不处理具体的 TCP 和 HTTP 请求,只负责接受 UNIX 信号,管理 Worker 进程,类似于工地的包工头。

Worker 进程是比较累的,负责处理客户端的连接请求,它充分利用了 Linux 系统中的 epoll、kqueue 等机制,高效处理 TCP 和 HTTP 请求,利用这些特点,Nginx 充分挖掘了服务器的潜能,让服务器更快响应用户请求。

一般情况下,10000 个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅仅消耗 2.5M 内存,这是 Nginx 支持高并发连接的基础,体现了 Nginx 高性能的特点。另外,由于官方提供的模块都非常稳定,每个 Worker 进程都相对独立,Woker 进程出错时,Master 进程会立马感知到并快速拉起新的 Worker 子进程不间断提供服务,保证服务的稳定性。

nginx的进程模型

在这里插入图片描述



2. 高可扩展性

Nginx 的架构设计是非常优秀的,极具扩展性,它完全由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。

另外,我们还可以在官方提供的模块上进行二次开发,例如 HTTP 模块,其中设计了 HTTP 过滤器模块,这样我们开发一个新的 HTTP 模块时,除了使用诸如 HTTP 核心模块、events 模块、log 模块等不同层次的模块,还可以原封不动地复用大量已有的 HTTP 过滤器模块。

这种低耦合度的优秀设计,造就了 Nginx 庞大的第三方模块,而且 Nginx 的模块都是嵌入到二进制的文件中执行的,这样使得第三方模块同样具备极其优秀的性能,充分利用 Nginx 的高并发特性,因此许多高流量的网站都会在 Nginx 基础上开发符合自己业务特性的定制模块,而且开发成本低,效果好。

另外,对于中小型企业来说,Nginx 开箱即用,其本身的高并发能力能满足企业的大部分业务,因此 Nginx 在绝大部分互联网企业中应用非常广泛。



3. 热部署

支持热部署功能是 Nginx 的一个特色,许多大型门户网站要求 24 小时不间断提供服务,一旦出现服务停止,容易造成用户投诉和用户流失。Nginx 由于其管理进程和 Worker 进程的分离设计,使得其能提供热部署功能,满足大型站点在 7×24 小时不间断服务的前提下升级 Nginx。

但要注意的是,Nginx 并不支持在不停止服务的情况下就更新配置、更换日志文件等功能。Nginx 的热部署实现原理是,在不停止老进程的前提下,终止其连接请求,并启动新的 Worker 进程处理新进来的连接请求,再慢慢终止老的 Worker 进程,实现新老交替。



4. 开源和免费

Nginx 和老大哥 Apache 一样开源且免费。在如今的时代,开源才能有力地成长,免费才能让更多的企业和个人开发者使用。 当然 Nginx 也有它的商业版本 Nginx plus,它有着更为丰富的功能和应用场景。然而免费版本的功能已经足够强大,加上第三方层出不穷的插件模块,几乎能实现各种业务功能,再加上配合第三方的语言集成(perl、lua等),对于绝大多数企业和个人来说已经完全足够。

当然,Nginx 的优点绝对不止于此。它最核心地功能是:在支持高并发请求的同时保持高效的服务。而这一点正是广大开发者,也是各大企业迫切需要满足的需求,以应对日益庞大的国内互联网用户群体。


文章转载:https://zhuanlan.zhihu.com/p/266153320

  • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化
  • 外围支持好:文档全,二次开发和模块较多
  • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
  • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组



4. nginx的功能及应用类别



4.1 nginx的基本功能

  • 静态资源的web服务器,能缓存打开的文件描述符
  • http、smtp、pop3协议的反向代理服务器
  • 缓存加速、负载均衡
  • 支持FastCGI(fpm,LNMP),uWSGI(Python)等
  • 模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
  • 支持SSL



4.2 nginx的扩展功能

  • 基于名称和IP的虚拟主机
  • 支持keepalive
  • 支持平滑升级
  • 定制访问日志、支持使用日志缓冲区提高日志存储性能
  • 支持URL重写
  • 支持路径别名
  • 支持基于IP及用户的访问控制
  • 支持速率限制,支持并发数限制



4.3 nginx的应用类别

  • 使用nginx结合FastCGI运行PHP、JSP、Perl等程序
  • 使用nginx作反向代理、负载均衡、规则过滤
  • 使用nginx运行静态HTML网页、图片
  • nginx与其他新技术的结合应用



5.nginx的模块与工作原理

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



5.1 模块分类

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等进行交互,实现服务代理和负载均衡等功能。

图1-1展示了Nginx模块常规的HTTP请求和响应的过程。

在这里插入图片描述



6.nginx的工作原理

nginx的模块直接被编译进nginx,因此属于静态编译方式。

启动nginx后,nginx的模块被自动加载,与Apache不一样,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。

在解析配置文件时,nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。

nginx的进程架构:

启动nginx时,会启动一个Master进程,这个进程不处理任何客户端的请求,主要用来产生worker线程,一个worker线程用来处理n个request。

在这里插入图片描述

下图展示了nginx模块一次常规的HTTP请求和响应的过程

在这里插入图片描述

下图展示了基本的WEB服务请求步骤

在这里插入图片描述



7. nginx部署



安装yum源

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2495  100  2495    0     0   8693      0 --:--:-- --:--:-- --:--:--  8723
[root@localhost yum.repos.d]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@localhost yum.repos.d]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@localhost yum.repos.d]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*



创建系统用户nginx,安装依赖环境

[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx
[root@localhost ~]#  yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++



创建日志存放目录

root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx



下载并编译安装nginx

[root@localhost ~]# cd /usr/src/
[root@localhost src]# ls
debug  kernels
[root@localhost src]# wget http://nginx.org/download/nginx-1.22.0.tar.gz
[root@localhost src]# tar xf nginx-1.22.0.tar.gz
[root@localhost src]# ls
debug  kernels  nginx-1.22.0  nginx-1.22.0.tar.gz
[root@localhost src]# cd nginx-1.22.0
[root@localhost nginx-1.22.0]# ./configure \
> --prefix=/usr/local/nginx \
-http-log-path=/var/log/nginx/access.log \> --user=nginx \
> --group=nginx \
> --with-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 \
> --http-log-path=/var/log/nginx/access.log \
> --error-log-path=/var/log/nginx/error.log
[root@localhost nginx-1.22.0]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install



安装完成后配置

[root@localhost ~]#  echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@localhost ~]# . /etc/profile.d/nginx.sh
[root@localhost ~]# nginx
[root@localhost ~]# ss -antl
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                   [::]:*                  



部署mysql安装

安装yum源

 cd /etc/yum.repos.d/
 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
 sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
 sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

下载依赖包

yum -y install wget tar make  cmake gcc gcc-c++ ncurses  ncurses-devel  libaio-devel  openssl openssl-devel  libtirpc-devel  bison

安装脚本

[root@mysql ~]# cat mysql.sh 
!/bin/bash
#关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld &> /dev/null
setenforce 0


#部署yum源
#到阿里云源查找centos镜像
#curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/rep o/Centos-vault-8.5.2111.repo 
#yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noar ch.rpm 
#sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors. aliyun.com|' /etc/yum.repos.d/epel* 
#sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*


#安装依赖包
echo "正在安装依赖包"
yum -y install libncurses* &> /dev/null
echo "安装完成"

#创建mysql用户
echo "正在创建mysql用户"
id mysql &> /dev/null
if [ $? -eq 0 ];then
        echo    "mysql用户创建成功"
else
        echo "正在创建mysql用户"
        useradd -r -M -s /sbin/nologin mysql
        echo "mysql用户创建成功"
fi

#配置mysql数据库
echo "解压mysql压缩包"
tar -xzf /opt/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz -C /usr/local 
ln -sv /usr/local/mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql &>/dev/null
chown -R mysql.mysql /usr/local/mysql &> /dev/null
mkdir -p /opt/data &> /dev/null
chown -R mysql.mysql /opt/data  &>/dev/null

#初始化数据库
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/opt/data/ &>/dev/null
ln -sv /usr/local/mysql/include/ /usr/local/include/mysql &> /dev/null
echo '/usr/local/mysql/lib '> /etc/ld.so.conf.d/mysql.conf &> /dev/null
ldconfig &> /dev/null
ln -s /usr/local/mysql/bin/mysql /usr/bin

#编辑mysql配置文件
cat > /etc/my.cnf << EOF
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
EOF

sed -ri "s#^(basedir=).*#\1/usr/local/mysql#g" /usr/local/mysql/support-files/mysql.server
sed -ri "s#^(datadir=).*#\1/opt/data#g" /usr/local/mysql/support-files/mysql.server

#定义mysql服务可以使用systemd来进行管理
cat > /usr/lib/systemd/system/mysqld.service <<EOF
[Unit]
Description=mysql server daemon
After=network.targe

[Service]
Type=forking
ExecStart=/usr/local/mysql/support-files/mysql.server start
ExecStop=/usr/local/mysql/support-files/mysql.server stop
ExecReload=/bin/kill -HUP \$MAINPID

[install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && echo "重载成功"
systemctl enable --now mysqld && echo "配置开机自启"

#设置数据库密码
read -p "请输入数据库密码:" a
/usr/local/mysql/bin/mysql -uroot -e "set password=password('$a')"

#做一个链接,添加mysq命令的变量到环境变量
echo "export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH" >>/etc/profile
source /etc/profile
echo "-----mysql部署完成-----"

chmod +x mysql.sh
./mysql.sh
[root@mysql ~]# mysql -uroot -p
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.37 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> set password = password('redhat'); 
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> quit 
Bye



源码安装php

//关闭防火墙和selinux
 systemctl stop firewalld
 systemctl disable firewalld
 vim /etc/sysconfig/selinux 
SELINUX=disabled
//配置yum源--阿里源centos8和epel源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*


[root@localhost ~]# cd /usr/local/src
[root@localhost src]# ls
oniguruma-6.9.4.tar.gz  php-7.1.10  php-7.1.10.tar.gz
[root@localhost src]# ls
php-7.1.10  php-7.1.10.tar.gz

//解压安装包
tar -xf php-7.1.10.tar.gz

下载安装工具

yum install -y gcc gcc-c++
yum -y install libxml2-devel openssl-devel curl-devel libjpeg-devel libpng-devel libicu-devel freetype-devel openldap-devel openldap openldap-devel



编译安装php

cd php-7.1.10
 ./configure --prefix=/usr/local/php7  \
--with-config-file-path=/etc \
--enable-fpm \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-soap \
--with-openssl \
--enable-bcmath \
--with-iconv \
--with-bz2 \
--enable-calendar \
--with-curl \
--enable-exif  \
--enable-ftp \
--with-zlib-dir \
--with-gettext \
--enable-json \
--enable-mbstring \
--enable-pdo \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-readline \
--enable-shmop \
--enable-simplexml \
--enable-sockets \
--enable-mysqlnd-compression-support \
--with-pear \
--enable-pcntl \
--enable-posix
[root@localhost php-7.1.10]# make && make install

编译完配置

[root@localhost ~]# cd /usr/local/php7/
[root@localhost php7]# echo 'export PATH=$PATH:/usr/local/php7/bin' > /etc/profile.d/php7.sh
[root@localhost php7]# source /etc/profile.d/php7.sh
[root@localhost php7]#  ln -s /usr/local/php7/include/ /usr/include/php7
[root@localhost php7]# echo '/usr/local/php7/lib/' > /etc/ld.so.conf.d/php7.conf
[root@localhost php7]# ldconfig
[root@localhost php7]# cd /usr/src/php-7.1.10
[root@localhost php-7.1.10]# cp php.ini-production /etc/php.ini
cp: overwrite '/etc/php.ini'? y
[root@localhost php-7.1.10]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
cp: overwrite '/etc/init.d/php-fpm'? y
[root@localhost php-7.1.10]#  chmod +x /etc/init.d/php-fpm
[root@localhost php-7.1.10]# cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
cp: overwrite '/usr/local/php7/etc/php-fpm.conf'? y
[root@localhost php-7.1.10]# cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
cp: overwrite '/usr/local/php7/etc/php-fpm.d/www.conf'? y
[root@localhost ~]#  vim /usr/local/php7/etc/php-fpm.d/www.conf
pm.max_children = 50  
pm.start_servers = 5  
pm.min_spare_servers = 2  
pm.max_spare_servers = 8 

[root@localhost php-7.1.10]#  cp /usr/lib/systemd/system/httpd.service php-fpm.service
[root@localhost php-7.1.10]# vim php-fpm.service
[Unit]
Description=php-fpm server daemon 
After=network.target sshd-keygen.target 
[Service] 
Type=forking 
ExecStart=/etc/init.d/php-fpm start 
ExecStop=/etc/init.d/php-fpm stop 
ExecReload=/bin/kill -HUP $MAINPID
[root@localhost php-7.1.10]# systemctl daemon-reload
[root@localhost php-7.1.10]# systemctl start php-fpm
[root@localhost php-7.1.10]# systemctl enable php-fpm
php-fpm.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable php-fpm
[root@localhost php-7.1.10]# vim /usr/local/php7/etc/php-fpm.d/www.conf
listen = 192.168.253.150:9000 //ip指向php 
listen.allowed_clients = 192.168.253.148   //nigx

[root@localhost php-7.1.10]# ss -anlt
State        Recv-Q       Send-Q                Local Address:Port               Peer Address:Port       Process       
LISTEN       0            128                 192.168.253.150:9000                    0.0.0.0:*                        
LISTEN       0            128                         0.0.0.0:22                      0.0.0.0:*                        
LISTEN       0            128                            [::]:22                         [::]:*      

在这里插入图片描述