Nginx网站服务

文章目录

  • Nginx网站服务
  • 一、Nginx服务基础
    • [1.1 Nginx简介](#1.1 Nginx简介)
    • [1.2 Nginx 功能介绍](#1.2 Nginx 功能介绍)
    • [1.3 基础特性](#1.3 基础特性)
    • [1.4 Web 服务相关的功能](#1.4 Web 服务相关的功能)
    • [1.5 Nginx 应用场景](#1.5 Nginx 应用场景)
    • [1.6 简述 Nginx 和 Apache 的差异](#1.6 简述 Nginx 和 Apache 的差异)
    • [1.7 Nginx 相对于 Apache 的优点](#1.7 Nginx 相对于 Apache 的优点)
    • [1.8 Nginx 架构](#1.8 Nginx 架构)
    • [1.9 Nginx 进程结构](#1.9 Nginx 进程结构)
    • [1.10 Nginx 模块](#1.10 Nginx 模块)
  • [二、编译安装 Nginx 服务](#二、编译安装 Nginx 服务)
    • [2.0 扩展 在线安装 Nginx](#2.0 扩展 在线安装 Nginx)
      • [1、yum 部署 Nginx](#1、yum 部署 Nginx)
    • [2.1 Nginx 编译安装](#2.1 Nginx 编译安装)
    • [2.2 安装依赖包](#2.2 安装依赖包)
    • [2.3 创建运行用户与组](#2.3 创建运行用户与组)
    • [2.4 编译安装 Nginx](#2.4 编译安装 Nginx)
    • [2.5 Nginx 信号](#2.5 Nginx 信号)
      • [可以安装 1.18 版本](#可以安装 1.18 版本)
      • [nginx 命令 kill 命令含义:](#nginx 命令 kill 命令含义:)
    • [2.6 添加 Nginx 系统服务](#2.6 添加 Nginx 系统服务)
  • [三、Nginx 主配置文件 nginx.conf](#三、Nginx 主配置文件 nginx.conf)
      • [3.1 全局配置](#3.1 全局配置)
      • [3.2 I/O 事件配置](#3.2 I/O 事件配置)
      • [3.3 HTTP 配置](#3.3 HTTP 配置)
  • 四、实战案例
      • [4.1 Nginx 的访问状态统计](#4.1 Nginx 的访问状态统计)
      • [4.2 基于授权的访问控制](#4.2 基于授权的访问控制)
      • [4.3 基于客户端的访问控制](#4.3 基于客户端的访问控制)
      • [4.4 基于域名的 Nginx 虚拟主机](#4.4 基于域名的 Nginx 虚拟主机)
      • [4.5 基于 IP 的 Nginx 虚拟主机](#4.5 基于 IP 的 Nginx 虚拟主机)
      • [4.6 基于端口的 Nginx 虚拟主机](#4.6 基于端口的 Nginx 虚拟主机)
  • [五、LNMP 架构](#五、LNMP 架构)
      • [基于端口的 Nginx 虚拟主机](#基于端口的 Nginx 虚拟主机)
      • [Nginx 工作原理](#Nginx 工作原理)
  • 六、扩展
      • [Nginx 相对于 Apache 的优势:](#Nginx 相对于 Apache 的优势:)
      • [Apache 相对于 Nginx 的优势:](#Apache 相对于 Nginx 的优势:)
      • [Apache 相对于 Nginx 的优势:](#Apache 相对于 Nginx 的优势:)

Nginx网站服务

一、Nginx服务基础

1.1 Nginx简介

Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器。Nginx 是由 Igor Sysoev 为俄罗斯访问量排名第二的 Rambler.ru 网站开发的,第一个公开版本 0.1.0 于 2004 年 10 月 4 日发布。其源代码以类 BSD 许可证的形式发布,因其稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011 年 6 月 1 日,Nginx 1.0.4 发布,后续主要版本包括 1.18、1.20、1.22 等等。

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,单台物理服务器可支持 30,000~50,000 个并发请求。并在一个 BSD-like 协议下发行。由俄罗斯的程序设计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度 BWS、新浪、网易、腾讯、等。

Nginx 官网:

  • 淘宝 web
  • Tengine:Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网、天猫商城等得到了很好的检验。可以这样理解:淘宝网拿到了 Nginx 源代码之后,进行了功能的填充、优化等,然后提交给 Nginx 官方,但由于 Nginx 官方相应慢甚至不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循 GPL 的原则上进行二次开发,于是就出了现在的 Tengine 版本。

Nginx 版本:

Nginx 中文参考地址: http://www.nginx.cn/doc/

1.2 Nginx 功能介绍

  • 静态的 web 资源服务器:html、图片、js、css、txt 等静态资源。
  • http/https 协议的反向代理:7 层 URL。
  • 结合 FastCGI / uWSGI / SCGI 等协议反向代理动态资源请求。
  • tcp/udp 协议的请求转发(反向代理):4 层。

1.3 基础特性

  • 模块化设计,较好的扩展性。
  • 高可靠性。
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件。
  • 低内存消耗:10,000 个 keep-alive 连接模式下的非活动连接,仅需 2.5M 内存。
  • event-driven, aio, mmap,sendfile。

1.4 Web 服务相关的功能

  • 虚拟主机(server)。
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)。
  • 访问日志(支持基于日志缓冲提高其性能)。
  • URL rewrite 。
  • 路径别名。
  • 基于 IP 及用户的访问控制。
  • 支持速率限制及并发数限制。
  • 重新配置和在线升级而无须中断客户的工作进程。

1.5 Nginx 应用场景

  1. 静态服务器 (图片、视频服务、文本)。
  2. 动态服务。
  3. 反向代理, 负载均衡。
  4. 缓存服务。

Nginx 中的 http 七层代理和四层代理可以用作 Web 服务器或代理服务器。可以实现反向代理和负载均衡。

1.6 简述 Nginx 和 Apache 的差异

  • Nginx 是一个基于事件的 Web 服务器,Apache 是一个基于进程的服务器。
  • Nginx 避免子进程的概念,Apache 是基于子进程的。
  • Nginx 在内存消耗和连接方面更好,Apache 在内存消耗和连接方面一般。
  • Nginx 的性能和可伸缩性不依赖于硬件,Apache 依赖于 CPU 和内存等硬件。
  • Nginx 支持热部署,Apache 不支持热部署。
  • Nginx 对于静态文件处理具有更高效率,Apache 相对一般。
  • Nginx 在反向代理场景具有明显优势,Apache 相对一般。

1.7 Nginx 相对于 Apache 的优点

  • 轻量级:同样是 web 服务,比 Apache 占用更少的内存及资源。
  • 高并发:Nginx 处理请求是异步非阻塞的,而 Apache 则是阻塞型的。在高并发下 Nginx 能保持低资源低消耗高性能。
  • 高度模块化的设计:编写模块相对简单。
  • 社区活跃:各种高性能模块出品迅速。

1.8 Nginx 架构

Nginx 的进程模型分为 master 进程和 worker 进程。worker 进程之间是平等的,每个进程处理请求的机会也是一样的。当我们提供 80 端口的 http 服务时,一个连接请求过来,每个进程都有可能处理这个连接。通过抢占 accept_mutex 确定哪个进程处理请求。一个请求完全由 worker 进程来处理,而且只在一个 worker 进程中处理。

1.9 Nginx 进程结构

web请求处理机制:

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接。优势是处理速度快,子进程之间相互独立,但如果访问过大会导致服务器资源耗尽而无法提供请求。
  • 多线程方式:与多进程方式类似,每收到一个客户端请求会有服务进程派生出一个线程来与客户端进行交互。一个线程的开销远远小于一个进程,但多线程也有缺点,即多个线程在同一个进程内工作时,可以相互访问同样的内存地址空间,一旦主进程挂掉则所有子线程都不能工作了。

Worker进程的功能:

Nginx 采用多 worker 的方式来处理请求,每个 worker 里面只有一个主线程,但 Nginx 是采用异步非阻塞的方式来处理请求,可以同时处理成千上万个请求。Worker 进程数量一般设置为核心数,充分利用 CPU 资源,同时避免进程数量过多,导致进程竞争 CPU 资源,增加上下文切换的损耗。

具体功能:

  • 接受处理客户的请求。
  • 将请求依次送入各个功能模块进行处理。
  • I/O调用,获取响应数据。
  • 与后端服务器通信,接收后端服务器的处理结果。
  • 缓存数据,访问缓存索引,查询和调用缓存数据。
  • 发送请求结果,响应客户的请求。
  • 接收主程序指令,比如重启、升级和退出等。

1.10 Nginx 模块

  • 核心模块:Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。
  • 标准 HTTP 模块:提供 HTTP 协议解析相关的功能,比如端口配置、网页编码设置、HTTP 响应头设置等等。
  • 可选 HTTP 模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如 Flash 多媒体传输、解析 GeoIP 请求、网络传输压缩、安全协议 SSL 支持等。
  • 邮件服务模块:主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。
  • Stream 服务模块: 实现反向代理功能,包括 TCP 协议代理 四层。
  • 第三方模块:用于扩展 Nginx 服务器应用,完成开发者自定义功能,比如 Json 支持、Lua 支持等。

Nginx 高度模块化,但其模块早期不支持 DSO 机制;1.9.11 版本支持动态装载和卸载。

常用模块:

  • ngx_http_core_module 核心模块

  • ngx_http_access_module 访问控制

  • ngx_http_auth_basic_module 身份验证

  • ngx_http_gzip_module 压缩模块

  • ngx_http_log_module 日志模块

  • ngx_http_proxy_module 代理模块

  • ngx_http_rewrite_module 重写模块

  • ngx_http_stub_status_module 状态页模块

  • ngx_http_upstream_module 反向代理

  • ngx_http_stream_module 四层代理

非常抱歉之前的遗漏,下面是继续生成的内容,保证不会漏掉任何部分。


二、编译安装 Nginx 服务

2.0 扩展 在线安装 Nginx

1、yum 部署 Nginx

  1. 使用 yum 部署 Nginx 需要先安装 epel-release 扩展包,官方源默认没有 Nginx 的 yum 源。
    • #安装 epel-release 扩展源
  2. 扩展源安装完后直接安装 Nginx。
    • 核心模块:core module
    • 标准模块:
      • HTTP 模块: ngx_http_*
      • HTTP Core modules #默认功能
      • HTTP Optional modules #需编译时指定
      • Mail 模块: ngx_mail_*
      • Stream 模块 ngx_stream_*
      • 第三方模块
    • yum install epel-release -y
    • yum install nginx -y
    • #安装 nginx 服务
  3. 使用 yum 安装的 nginx 配置文件位置在:/etc/nginx.conf。默认根目录在:/usr/share/nginx/html。默认日志文件在:/var/log/nginx/路径下。

2.1 Nginx 编译安装

  1. 关闭防火墙,将安装 nginx 所需软件包传到 /opt 目录下
  2. 下载安装包:nginx-1.12.0.tar.gz
    • 在这里可以下载你的安装包:
      • https://nginx.org/download/nginx-1.18.0.tar.gz
      • wget https://nginx.org/download/nginx-1.18.0.tar.gz
      • https://nginx.org/download/nginx-1.20.1.tar.gz

2.2 安装依赖包

  1. systemctl stop firewalld
  2. systemctl disable firewalld
  3. setenforce 0
    • nginx 的配置及运行需要 pcre、zlib 等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
  4. yum -y install pcre-devel zlib-devel gcc gcc-c++ make
    • 创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
  5. useradd -M -s /sbin/nologin nginx
  6. cd /opt
  7. tar zxvf nginx-1.12.0.tar.gz -C /opt/
  8. cd nginx-1.12.0/
  9. ./configure \
    • --prefix=/usr/local/nginx \ #指定 nginx 的安装路径
    • --user=nginx \ #指定用户名
    • --group=nginx \ #指定组名
    • --with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计操作 VTS
  10. make && make install

2.3 创建运行用户与组

  • 在上述过程中已经创建了运行用户与组,配置完成后可以使用 systemctl 命令管理 nginx 服务。

2.4 编译安装 Nginx

  • 已在 2.2 节中详细说明了编译安装的过程。

2.5 Nginx 信号

Nginx 命令支持向其发送信号,实现不同功能:

  • nginx 当做单独命令使用有以下选项:

    • ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #让系统识别 nginx 的操作命令

    • 启动检查:

      • nginx -t #检查配置文件是否配置正确
    • 启动 nginx:

      可以安装 1.18 版本

      • tar zxvf nginx-1.18.0.tar.gz -C /opt/
      • yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
      • ./configure --help #查看帮助模块
      • ./configure --prefix=/usr/local/nginx \
        • --user=nginx \
        • --group=nginx \
        • --with-http_ssl_module \
        • --with-http_v2_module \
        • --with-http_realip_module \
        • --with-http_stub_status_module \
        • --with-http_gzip_static_module \
        • --with-pcre \
        • --with-stream \
        • --with-stream_ssl_module \
      • --with-stream_realip_module
  • [root@node2 ~]# nginx -h

    • -v : show version and exit
    • -V : show version and configure options then exit
    • -t : test configuration and exit
    • -T : test configuration, dump it and exit
    • -q : suppress non-error messages during configuration testing
    • -s signal : send signal to a master process: stop, quit, reopen, reload
    • -p prefix : set prefix path (default: /etc/nginx/)
    • -e filename : set error log file (default: /var/log/nginx/error.log)
    • -c filename : set configuration file (default: /etc/nginx/nginx.conf)
    • -g directives : set global directives out of configuration file
    • nginx -t 检查语法
    • nginx -T 检查语法 并打印所有配置
    • nginx -v 显示版本
    • nginx -V 显示详细信息,包括编译的信息
    • nginx -c 指定配置文件启动
    • nginx -s = kill 发送信号
    • nginx -s relaod 重新加载配置文件

nginx 命令 kill 命令含义:

  • nginx -s relaod kill -s HUP 重新加载配置文件
  • nginx -s stop kill -9(KILL) 立即停止
  • nginx -s quit kill -3(QUIT) 优雅的退出
  • nginx -s reopen kill -s USR1 重新生成日志文件
  • nginx kill -s USR2 飞行中升级

扩展还有一种方式叫做 平滑升级 在不影响生产环境的情况下升级

2.6 添加 Nginx 系统服务

方法一:service 系统管理

  • nginx -s stop 停止 nginx 立即停止
  • nginx -s quit 优雅的退出 ,如果有人在访问我的服务, 那么不会立即关闭, 等客户断开连接再退出
  • nginx -s reopen 重新生成日志文件 USR1 日志有关
  • nginx -s USR2 飞行中升级

新版本升级:

  • tar -zxvf nginx-1.xx.xx.tar.gz 1.22.0

  • cd nginx-1.xx.xx

  • ./configure \

    • --prefix=/usr/local/nginx \
    • --user=nginx \
    • --group=nginx \
    • --with-http_stub_status_module \
    • --with-http_ssl_module
  • make

  • mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old 备份

  • cp objs/nginx /usr/local/nginx/sbin/nginx

  • 重启服务并且

  • nginx -V #查看版本

  • make upgrade

  • #或者先 killall nginx ,再/usr/local/nginx/sbin/nginx

  • vim /etc/init.d/nginx

    #!/bin/bash
    #chkconfig: 35 99 20 // 这是固定格式,2345表示运行级别,之后为开机执行顺序和关机执行顺序
    #description:Nginx Service Control Script //这也是必须的
    COM="/usr/local/nginx/sbin/nginx"
    PID="/usr/local/nginx/logs/nginx.pid"
    case "$1" in
    start)
    $COM
    ;;
    stop)
    kill -s QUIT $(cat $PID)
    ;;
    restart)
    $0 stop
    $0 start
    ;;
    reload)
    kill -s HUP $(cat $PID)
    ;;
    *)
    echo "Usage: $0 {start|stop|restart|reload}"
    exit 1
    ;;
    esac
    exit 0

  • chmod +x /etc/init.d/nginx

  • chkconfig --add nginx #添加为系统服务

  • systemctl stop nginx

  • systemctl start nginx

  • service nginx start|stop|restart|reload

方法二:

  • vim /lib/systemd/system/nginx.service

    [Unit]
    Description=nginx
    After=network.target

    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $

    MAINPID
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target


解释:

  • [Unit]:服务的说明
    • Description:描述服务
    • After:依赖,当依赖的服务启动之后再启动自定义的服务
  • [Service]服务运行参数的设置
    • Type=forking 是后台运行的形式,使用此启动类型应同时指定
    • PIDFile 以便 systemd 能够跟踪服务的主进程。
  • ExecStart 为服务的具体运行命令
  • ExecReload 为重启命令
  • ExecStop 为停止命令
  • PrivateTmp=True 表示给服务分配独立的临时空间
  • 注意:启动、重启、停止命令全部要求使用绝对路径
  • [Install]服务安装的相关设置,可设置为多用户

  • chmod 754 /lib/systemd/system/nginx.service
  • systemctl start nginx.service
  • systemctl enable nginx.service

三、Nginx 主配置文件 nginx.conf

3.1 全局配置

  • #user nobody; #运行用户,若编译时未指定则默认为 nobody
  • worker_processes 4; #工作进程数量,可配置成服务器内核数 * 2,如果网站访问量不大,一般设为1就够用了

3.2 I/O 事件配置

  • CPU
    • 2P:2个物理CPU
    • 4C:1物理核有4个核心一共有2*4=8个逻辑核
    • 8G内存
    • 4C 16G 高效盘 40G (系统盘) 存储 oss 网络存储 nas 50M
  • #error_log logs/error.log; #错误日志文件的位置
  • #pid logs/nginx.pid; #PID 文件的位置

events {
  use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
  worker_connections 4096; #每个进程处理 4096 个连接 2000
}
  • 如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
  • 在 Linux 平台上,在进行高并发 TCP 连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个 TCP 连接都要创建一个 socket 句柄,每个 socket 句柄同时也是一个文件句柄)。
  • 可使用 ulimit -a 命令查看系统允许当前用户进程打开的文件数限制。
  • /etc/security/limits.conf
  • epoll 是 Linux 内核为处理大批句柄而作改进的 poll,是 Linux 下多路复用 IO 接口 select/poll 的增强版本,它能显著地减少程序在大量并发连接中只有少量活跃的情况下的系统 CPU 利用率。

3.3 HTTP 配置

http {
  ##文件扩展名与文件类型映射表
  include mime.types;
  ##默认文件类型
  default_type application/octet-stream;
  ##日志格式设定
  #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  # '$status $body_bytes_sent "$http_referer" '
  # '"$http_user_agent" "$http_x_forwarded_for"';
  ##访问日志位置
  #access_log logs/access.log main;
  ##支持文件发送(下载)
  sendfile on;
  ##此选项允许或禁止使用 socket 的 TCP_CORK 的选项(发送数据包前先缓存数据),此选项仅在使用 sendfile 的时候使用
  #tcp_nopush on;
  ##连接保持超时时间,单位是秒
  #keepalive_timeout 0;
  keepalive_timeout 65;
  ##gzip 模块设置,设置是否开启 gzip 压缩输出
  #gzip on;
  ##Web 服务的监听配置
  server {
    ##监听地址及端口
    listen 80;
    ##站点域名,可以有多个,用空格隔开
    server_name www.kgc.com;
    ##网页的默认字符集
    charset utf-8;
    ##根目录配置
    location / {
      ##网站根目录的位置 /usr/local/nginx/html
      root html;
      ##默认首页文件名
      index index.html index.php;
    }
    ##内部错误的反馈页面
    error_page 500 502 503 504 /50x.html;
    ##错误页面配置
    location = /50x.html {
      root html;
    }
  }
}

四、实战案例

4.1 Nginx 的访问状态统计

日志格式设定:

  • $remote_addr$http_x_forwarded_for 用以记录客户端的 IP 地址;
  • $remote_user:用来记录客户端用户名称;
  • $time_local:用来记录访问时间与时区;
  • $request: 用来记录请求的 URL 与 HTTP 协议;
  • $status: 用来记录请求状态;成功是 200,
  • $body_bytes_sent:记录发送给客户端文件主体内容大小;
  • $http_referer:用来记录从哪个页面链接访问过来的;
  • $http_user_agent:记录客户浏览器的相关信息;

通常 web 服务器放在反向代理的后面,这样就不能获取到客户的 IP 地址了,通过 $remote_add 拿到的 IP 地址是反向代理服务器的 IP 地址。反向代理服务器在转发请求的 HTTP 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的 IP 地址和原来客户端的请求的服务器地址。


location 常见配置指令:

  • root(根路径配置):root /var/www/html 编译安装 /usr/local/nginx/html
    • 请求 www.kgc.com/test/1.html,会返回文件 /var/www/html/test/1.html
  • alias(别名配置):alias /var/www/html
    • 请求 www.kgc.com/test/1.html,会返回文件 /var/www/html/1.html
  • proxy_pass(反向代理配置)

访问状态统计配置:

  1. 先使用命令 /usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块
    • cat /opt/nginx-1.12.0/auto/options | grep YES 可查看 nginx 已安装的所有模块
  2. 修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置
    • cd /usr/local/nginx/conf
    • cp nginx.conf nginx.conf.bak
    • vim /usr/local/nginx/conf/nginx.conf

......
http {
......
server {
  listen 80;
  server_name www.kgc.com;
  charset utf-8;
  location / {
    root html;
    index index.html index.php;
  }
  ##添加 stub_status 配置##
  location /status { #访问位置为/status
    stub_status on; #打开状态统计功能
    access_log off; #关闭此位置的日志记录
  }
}
}
}

  1. 重启服务,访问测试
    • systemctl restart nginx
    • 浏览器访问 http://192.168.10.19/status

Active connections :表示当前的活动连接数;
server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的 TCP 握手次数、已处理的请求数。
可 `curl -s http://192.168.10.19/status` 结合 awk 与 if 语句进行性能监控。

4.2 基于授权的访问控制

生成用户密码认证文件

  • yum install -y httpd-tools
  • htpasswd -c /usr/local/nginx/passwd.db zhangsan
  • chown nginx /usr/local/nginx/passwd.db
  • chmod 400 /usr/local/nginx/passwd.db

修改主配置文件相对应目录,添加认证配置项

  • vim /usr/local/nginx/conf/nginx.conf

    ......
    server {
    location / {
    ......
    ##添加认证配置##
    auth_basic "secret"; #设置密码提示框文字信息
    auth_basic_user_file /usr/local/nginx/passwd.db;
    }
    }

  • nginx -t

  • systemctl restart nginx

  • 浏览器访问 http://192.168.10.19


4.3 基于客户端的访问控制

访问控制规则如下:

  • deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
  • allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
  • 规则从上往下执行,如匹配则停止,不再往下匹配。

**修改配置

文件:**

  • vim /usr/local/nginx/conf/nginx.conf

    ......
    server {
    location / {
    ......
    ##添加控制规则##
    allow 192.168.10.20; #允许访问的客户端 IP
    deny all; #拒绝其它 IP 客户端访问
    }
    }

  • systemctl restart nginx


4.4 基于域名的 Nginx 虚拟主机

  1. 为虚拟主机提供域名解析
    • echo "192.168.10.19 www.kgc.com www.benet.com" >> /etc/hosts
  2. 为虚拟主机准备网页文档
    • mkdir -p /var/www/html/benet
    • mkdir -p /var/www/html/kgc
    • echo "<h1>www.kgc.com</h1>" > /var/www/html/kgc/index.html
    • echo "<h1>www.benet.com</h1>" > /var/www/html/benet/index.html
  3. 修改 Nginx 的配置文件
    • vim /usr/local/nginx/conf/nginx.conf

......
http {
......
server {
  listen 80;
  server_name www.kgc.com; #设置域名 www.kgc.com
  charset utf-8;
  access_log logs/www.kgc.access.log; #设置日志名
  location / {
    root /var/www/html/kgc; #设置 www.kgc.com 的工作目录
    index index.html index.php;
  }
  error_page 500 502 503 504 /50x.html;
  location = 50x.html{
    root html;
  }
}
server {
  listen 80;
  server_name www.benet.com; #设置域名 www.benet.com
  charset utf-8;
  access_log logs/www.benet.access.log;
  location / {
    root /var/www/html/benet;
    index index.html index.php;
  }

4.5 基于 IP 的 Nginx 虚拟主机

  • error_page 500 502 503 504 /50x.html;

  • location = 50x.html{

  • root html;

  • }

  • systemctl restart nginx

  • 浏览器访问

    • http://www.kgc.com
    • http://www.benet.com

4.6 基于端口的 Nginx 虚拟主机

  • ifconfig ens33:0 192.168.10.40 netmask 255.255.255.0
  • vim /usr/local/nginx/conf/nginx.conf

......
http {
......
server {
  listen 192.168.10.19:80; #设置监听地址 192.168.10.19
  server_name www.kgc.com;
  charset utf-8;
  access_log logs/www.kgc.access.log;
  location / {
    root /var/www/html/kgc;
    index index.html index.php;
  }
  error_page 500 502 503 504 /50x.html;
  location = 50x.html{
    root html;
  }
}
server {
  listen 192.168.10.40:80; #设置监听地址 192.168.10.40
  server_name www.benet.com;
  charset utf-8;
  access_log logs/www.benet.access.log;
  location / {
    root /var/www/html/benet;
    index index.html index.php;
  }
  error_page 500 502 503 504 /50x.html;
  location = 50x.html{
    root html;
  }
}

五、LNMP 架构

  • systemctl restart nginx
  • 浏览器访问
    • http://192.168.80.10
    • http://192.168.80.11

基于端口的 Nginx 虚拟主机

  • vim /usr/local/nginx/conf/nginx.conf

......
http {
......
server {
  listen 192.168.80.10:8080; #设置监听 8080 端口
  server_name www.kgc.com;
  charset utf-8;
  access_log logs/www.kgc.access.log;
  location / {
    root /var/www/html/kgc;
    index index.html index.php;
  }
  error_page 500 502 503 504 /50x.html;
  location = 50x.html{
    root html;
  }
}
server {
  listen 192.168.80.10:8888; #设置监听 8888 端口
  server_name www.benet.com;
  charset utf-8;
  access_log logs/www.benet.access.log;
  location / {
    root /var/www/html/benet;
    index index.html index.php;
  }
  error_page 500 502 503 504 /50x.html;
  location = 50x.html{
    root html;
  }
}

  • systemctl restart nginx
  • 浏览器访问
    • http://192.168.80.11:8080
    • http://192.168.80.11:8888

Nginx 工作原理

这里需要结合 Apache 的工作,对 PHP 文件处理过程的区别:

  1. Nginx 是通过 php-fpm 这个服务来处理 php 文件
  2. Apache 是通过 libphp5.so 这个模块来处理 php 文件

Apache:

  • Apache 的 libphp5.so 随着 Apache 服务器一起运行,而 Nginx 和 php-fpm 是各自独立运行,所以在运行过程中,Nginx 和 php-fpm 都需要分别启动!
  • 修改 Nginx 配置文件,启动 Nginx 服务,修改 php 配置文件,启动 php-fpm 服务
  • 反向代理 对应页面 IP: 端口

六、扩展


Nginx 相对于 Apache 的优势:

  1. 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源。
  2. 抗并发,nginx 以 epollkqueue 作为开发模型,处理请求是异步非阻塞的,多个连接对应一个进程,负载能力比 apache 高很多,
    • 而 apache 则是同步多进程模型,只能一个连接对应一个进程,当压力过大时,它是会被阻塞型的。
    • 在高并发下 nginx 能保持低资源低消耗高性能,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
  3. 设计高度模块化,编写模块相对简单。
  4. 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃。
  5. 一般用于处理静态文件,静态处理性能比 apache 高三倍以上。
  6. 作为负载均衡服务器,支持7层负载均衡。
  7. 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器。
  8. nginx 启动特别容易,并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,支持热部署,比如:实现不间断服务的情况下进行软件版本的升级与版本的回退。
  9. 社区活跃,各种高性能模块出品迅速。

Apache 相对于 Nginx 的优势:

  1. apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache。
  2. apache 发展到现在,模块超多,基本想到的都可以找到。
  3. apache 更为成熟,少 bug,nginx 的 bug 相对较多。
  4. apache 超稳定,一个进程死掉时,会影响到多个用户的使用,稳定性差。
  5. apache 对 PHP 支持比较简单,nginx 需要配合其他后端用。
  6. apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
  7. apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区。

对应一个进程,当压力过大时,它是会被阻塞型的。

  • 在高并发下 nginx 能保持低资源低消耗高性能,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
  1. 设计高度模块化,编写模块相对简单。
  2. 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃。
  3. 一般用于处理静态文件,静态处理性能比 apache 高三倍以上。
  4. 作为负载均衡服务器,支持7层负载均衡。
  5. 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器。
  6. nginx 启动特别容易,并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,支持热部署,比如:实现不间断服务的情况下进行软件版本的升级与版本的回退。
  7. 社区活跃,各种高性能模块出品迅速。

Apache 相对于 Nginx 的优势:

  1. apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache。
  2. apache 发展到现在,模块超多,基本想到的都可以找到。
  3. apache 更为成熟,少 bug,nginx 的 bug 相对较多。
  4. apache 超稳定,一个进程死掉时,会影响到多个用户的使用,稳定性差。
  5. apache 对 PHP 支持比较简单,nginx 需要配合其他后端用。
  6. apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
  7. apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区。
相关推荐
丶2136几秒前
【Nginx】在 Docker 上安装 Nginx 的详细指南
运维·nginx·docker
神即道 道法自然 如来16 分钟前
Jenkins怎么设置每日自动执行构建任务?
运维·jenkins
hanniuniu1331 分钟前
详细解读,F5服务器负载均衡的技术优势
运维·服务器·负载均衡
鱼饼6号44 分钟前
Prometheus 上手指南
linux·运维·centos·prometheus
m0_609000422 小时前
向日葵好用吗?4款稳定的远程控制软件推荐。
运维·服务器·网络·人工智能·远程工作
小安运维日记3 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql
m0_741768857 小时前
使用docker的小例子
运维·docker·容器
学习3人组7 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神8 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0668 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构