常见的HTTP服务

  1. HTTPD -> Apache基金会
  2. IIS -> 微软
  3. GWS -> Google
  4. openrestry ->
  5. tengline -> 淘宝基于Nginx开发
  6. lighttpd ->

Nginx基本简述

Nginx是一个高性能的HTTP和反向代理的web服务器,它的设计重点是高并发、高性能和低内存消耗。

采用事件驱动的异步非阻塞处理方式框架,使得其具有极好的IO性能,时常用于服务端的反向代理、提供静态内容、负载均衡和作为Web服务器。

Nginx具有以下功能和特点:

  1. 静态文件服务:作为一个Web服务器,Nginx可以处理静态文件的请求,通过快速地处理请求和发送静态内容来提供更好的性能。
  2. 反向代理:Nginx可以作为反向代理服务器,将客户端的请求转发到多个后端服务器,以提供负载均衡、缓存和安全性等功能。它支持多种负载均衡策略,如轮询、加权轮询和Ip hash等。
  3. 动态内容处理:尽管Nginx主要用于处理静态文件,但它也可以与各种后端应用程序(如PHP、Python、Java等)配合使用,用于处理动态内容。
  4. 高性能:Nginx采用了异步、非阻塞的事件驱动架构,能够处理大量的并发连接,提供出色的性能。
  5. 低内存消耗:Nginx在处理大量并发连接时,使用的内存较少,因此能够提供更高的并发连接数和更好的性能。
  6. 配置灵活:Nginx的配置非常灵活,管理员可以根据需要进行各种配置和优化,以满足不同的需求。

此外,Nginx也提供了web缓存功能,可以对不同的文件做不同的缓存处理,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。

然而,Nginx也存在一些常见的安全问题,如目录浏览、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)和远程代码执行(RCE)等。因此,在使用Nginx时,需要注意相关的安全配置和防范措施。

当需要进行Nginx的升级或回滚操作时,可以考虑使用自动化工具如Ansible,通过编写playbook来实现对Nginx的安装、配置和管理。这样可以确保升级或回滚过程的顺利进行,并减少人为错误的风险。

Nginx是一个功能强大且灵活的web服务器和反向代理工具,适用于各种Web应用场景。然而,在使用时需要注意其安全配置和性能优化,以确保其稳定性和安全性。

Nginx由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发,其第一个公开版本0.1.0发布于2004年10月4日。在随后的多年中,Nginx不断发展和完善,发布了多个版本。其中,2011年6月1日发布了nginx 1.0.4版本,而在2020年12月15日则公开发布了版本1.19.6。此外,2022年1月25日nginx 1.21.6发布,而到了2023年4月11日,官方发布了基于之前开发版Bug修复和新特性加入的Nginx最新稳定版,版本号为1.24.0。

Nginx应用场景

  1. 静态处理
  2. 反向代理
  3. 负载均衡
  4. 资源缓存
  5. 安全防护
  6. 访问限制
  7. 访问认证

架构和工作模型

Nginx的架构和工作模型主要体现了其高性能和可扩展性的特点。

Nginx采用了事件驱动、非阻塞的架构模型。这种模型使得Nginx能够通过单线程或少量线程处理大量并发连接,从而提供出色的性能和可扩展性。其核心组件包括Master进程和Worker进程。Master进程负责管理和监控所有的Worker进程,接收和处理外部信号,但并不直接处理请求。Worker进程则是实际处理客户端请求的进程,它们独立运行,相互之间无共享状态。

图片

在工作模型方面,Nginx的事件模块负责处理底层的事件,如网络连接、数据读写等。当有新的连接或数据到达时,事件模块会通知相应的Worker进程进行处理。同时,HTTP模块负责解析HTTP请求、处理请求头、处理请求内容,以及生成HTTP响应等。它内部包含了很多子模块,如反向代理模块、负载均衡模块、静态文件模块等,可以根据需求进行自定义配置。

Nginx还采用了I/O多路复用的技术,能够同步监控所有的连接请求的活动状态。当一个连接的状态发生改变时(如数据准备完毕或发生某错误),Nginx将为其执行一系列特定操作。这种多路复用的特性使得进程或线程不会被空闲的连接所占用,因此可以提供高效的工作模式。

Nginx的架构和工作模型设计得非常精巧,能够有效地处理大量的并发请求,同时提供丰富的功能和灵活性。这使得Nginx成为了构建高性能Web应用和反向代理的理想选择。

模块

Nginx的模块是其架构中的核心组成部分,它们负责处理各种功能,使得Nginx能够灵活、高效地处理各种Web请求。

Nginx的模块大致可以分为核心模块、基础模块和第三方模块。

核心模块:

  • HTTP模块:处理HTTP请求和响应。
  • EVENT模块:处理网络事件和连接。
  • MAIL模块:提供了邮件代理功能。

基础模块:

  • HTTP Access模块:用于控制访问权限。
  • HTTP FastCGI模块:用于与FastCGI进程通信。
  • HTTP Proxy模块:用于实现反向代理功能。
  • HTTP Rewrite模块:用于URL重写和重定向。

除了核心模块和基础模块,Nginx还支持大量的第三方模块。这些模块通常由社区开发并贡献给Nginx,它们提供了各种各样的扩展功能,以满足不同用户的需求。一些常见的第三方模块包括HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块等。

每个模块都有其特定的功能和配置选项,用户可以根据实际需求选择启用或禁用模块,并进行相应的配置。通过合理地配置和使用这些模块,构建出高性能、安全、灵活的Web服务器和反向代理系统。

Nginx优秀特性

Nginx基于IO多路复用

IO复用解决的是并发性的问题,Socket作为复用

IO复用(串行,产生阻塞)

多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的 “复用”指的是复用同一个线程。

IO多路复用的实现方式有select、poll、Epool

1.什么是select

select缺点

1.能够监视文件描述符的数量存在最大限制

2.线性遍历扫描效率低下

2.epool模型

1.每当FD(file descriptor)就绪,采用系统的回调函数之间将fd放入,效率更高。

2.最大连接无限制

轻量级

  1. 功能模块少
  2. 代码模块化

CPU亲和(affinity)

将CPU核心和Nginx工作进程绑定方式,把每个worker进程固定在一个cpu上执行,减少切换cpu的cache miss,获得更好的性能。

sendfile

传统文件传输, 在实现上其实是比较复杂的, 其具体流程细节如下:

1.调用read函数,文件数据被复制到内核缓冲区2.read函数返回,文件数据从内核缓冲区复制到用户缓冲区
3.write函数调用,将文件数据从用户缓冲区复制到内核与socket相关的缓冲区。4.数据从socket缓冲区复制到相关协议引擎。
传统文件传输数据实际上是经过了四次复制操作:
硬盘—>内核buf—>用户buf—>socket缓冲区(内核)—>协议引擎
也就是说传统的文件传输需要经过多次上下文的切换才能完成拷贝或读取, 效率不高。

sendfile文件传输是**在内核中操作完成**的, 函数直接在两个文件描述符之间传递数据, 从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝, 操作效率很高, 被称之为零拷贝。

1.系统调用sendfile函数通过 DMA 把硬盘数据拷贝到 kernel buffer,2.数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。
3.DMA把数据从kernel buffer直接拷贝给协议栈。
这里没有用户空间和内核空间之间的切换,在内核中直接完成了从一个buffer到另一个buffer的拷贝。

Nginx快速安装

版本介绍

Nginx官方定义了Mainline、Stable、Legacy三种版本。地址:nginx: download

  • Mainline version(主线版本)

该版本包含最新的功能和bug修复,被视为开发版,即正在活跃开发中的版本。其版本号通常为单数,例如1.25.5。这个版本的更新较快,可能会引入新的功能和修复,但也可能存在尚未解决的bug。

  • Stable version(稳定版本)

最新稳定版适合生产环境使用。其版本号通常为双数,例如1.26。这个版本经过充分测试和验证,bug较少,适合用于承载实际业务。因此,通常建议在生产环境中使用此版本。

  • Legacy versions(历史版本)

这些版本是之前发布的稳定版,对于需要特定旧版本的兼容性或安全性支持的用户有用。然而,这些版本一般不推荐用于新项目,除非有特殊需求。

源码

二进制包安装

Nginx一般可以使用apt/yum/dnf来安装二进制包,若需使用特定的功能模块,则需要使用源码安装。

  • OS:Rocky Linux 9.3 (Blue Onyx)

    1
    2
    3
    4
    5
    # 检查当前系统可安装列表

    [root@RockyLinux9 ~]# dnf list nginx
    Available Packages
    nginx.x86_64 1:1.20.1-14.el9_2.1 appstream
  • 配置官方YUM仓库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@RockyLinux9 ~]# cat /etc/yum.repos.d/nginx.repo
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

    [root@RockyLinux9 ~]# dnf list nginx
    Available Packages
    nginx.x86_64 1:1.26.0-1.el9.ngx nginx-stable
  • 安装

    1
    2
    3
    4
    5
    [root@RockyLinux9 ~]# dnf install -y nginx
    # 服务启动并配置开机自启
    [root@RockyLinux9 ~]# systemctl enable nginx --now
    # 查看服务状态
    [root@RockyLinux9 ~]# systemctl status nginx
  • 查看版本及默认编译依赖项

    1
    2
    3
    4
    5
    6
    [root@RockyLinux9 ~]# nginx -V
    nginx version: nginx/1.26.0
    built by gcc 11.3.1 20221121 (Red Hat 11.3.1-4) (GCC)
    built with OpenSSL 3.0.7 1 Nov 2022
    TLS SNI support enabled
    configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_v3_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
  • 二进制包安装的默认位置

    1
    2
    3
    4
    5
    6
    7
    8
    [root@RockyLinux9 ~]# rpm -ql nginx
    /etc/nginx # 配置文件目录
    ......
    /usr/lib64/nginx/modules # 模块安装目录
    /usr/sbin/nginx # 二进制程序
    /usr/share/nginx/html # 网站根目录
    /var/cache/nginx # 缓存目录
    /var/log/nginx # 日志目录

源码编译安装

  • 安装相关编译工具

    1
    2
    [root@RockyLinux9 ~]# dnf update
    [root@RockyLinux9 ~]# dnf install -y gcc make pcre pcre-devel zlib zlib-devel openssl openssl-devel
  • 创建运行用户

    1
    2

    [root@RockyLinux9 ~]# useradd -r -s /usr/sbin/nologin nginx
  • 下载源码包并解压

    1
    2
    3
    [root@RockyLinux9 ~]# curl -O https://nginx.org/download/nginx-1.26.0.tar.gz
    [root@RockyLinux9 ~]# tar xf nginx-1.26.0.tar.gz
    [root@RockyLinux9 ~]# cd nginx-1.26.0/
  • 编译安装

    1
    2
    3
    [root@RockyLinux9 nginx-1.26.0]# mkdir /usr/local/nginx
    [root@RockyLinux9 nginx-1.26.0]# ./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@RockyLinux9 nginx-1.26.0]# make && make install
  • 修改配置目录用户及属组

    1
    2
    3
    4
    5
    6
    7
    [root@RockyLinux9 nginx-1.26.0]# chown -R nginx:nginx /usr/local/nginx/
    [root@RockyLinux9 nginx-1.26.0]# ll /usr/local/nginx/
    total 4
    drwxr-xr-x. 2 nginx nginx 4096 May 9 22:32 conf # 配置文件目录
    drwxr-xr-x. 2 nginx nginx 40 May 9 22:32 html # 网站根目录
    drwxr-xr-x. 2 nginx nginx 6 May 9 22:32 logs # 日志目录
    drwxr-xr-x. 2 nginx nginx 19 May 9 22:32 sbin # 二进制程序目录
  • 创建程序软链接

    1
    2
    [root@RockyLinux9 nginx-1.26.0]# ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx
    '/usr/sbin/nginx' -> '/usr/local/nginx/sbin/nginx'
  • 查看版本及编译属性

    1
    2
    3
    4
    5
    6
    [root@RockyLinux9 nginx-1.26.0]# nginx -V
    nginx version: nginx/1.26.0
    built by gcc 11.4.1 20230605 (Red Hat 11.4.1-2) (GCC)
    built with OpenSSL 3.0.7 1 Nov 2022
    TLS SNI support enabled
    configure arguments: --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
  • 启动程序

    1
    2
    3
    4
    5
    6
    7
    8
    [root@RockyLinux9 ~]# nginx
    [root@RockyLinux9 ~]# ps -ef|grep nginx
    root 44079 1 0 22:40 ? 00:00:00 nginx: master process nginx
    nginx 44080 44079 0 22:40 ? 00:00:00 nginx: worker process
    root 44082 38412 0 22:40 pts/0 00:00:00 grep --color=auto nginx

    # 停止程序
    [root@RockyLinux9 ~]# nginx -s stop
  • 编写nginx服务文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [root@RockyLinux9 ~]# cat /usr/lib/systemd/system/nginx.service
    [Unit]
    Description=nginx
    Documentation=https://nginx.org/en/docs/
    After=network-online.target remote-fs.target nss-lookup.target
    Wants=network-online.target
    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s TERM $MAINPID
    LimitNOFILE=100000
    [Install]
    WantedBy=multi-user.target
  • 修改配置文件nginx.conf,删除pid注释

    1
    2
    3
    4
    5
    6
    [root@RockyLinux9 ~]# vim /usr/local/nginx/conf/nginx.conf
    pid logs/nginx.pid;
    # 校验文件
    [root@RockyLinux9 ~]# nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  • 启动服务

    1
    2
    3
    4
    5
    6
    7

    # 加载服务脚本
    [root@RockyLinux9 ~]# systemctl daemon-reload
    # 启动服务
    [root@RockyLinux9 ~]# systemctl start nginx
    # 查看服务状态
    [root@RockyLinux9 ~]# systemctl status nginx
  • 导入man手册

    1
    2
    3
    4
    5
    6
    7
    # 拷贝文件
    [root@RockyLinux9 ~]# cp nginx-1.26.0/man/nginx.8 /usr/share/man/man8/
    # 更新man db库
    [root@RockyLinux9 ~]# mandb
    # 查看nginx确认
    [root@RockyLinux9 ~]# whereis nginx
    nginx: /usr/sbin/nginx /usr/local/nginx /usr/share/man/man8/nginx.8

epel源安装

  • 基础环境准备:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # nginx位于第三方的yum源里面,不在centos官方yum源里面
    yum -y install epel-release
    yum -y update

    # 关闭iptables
    [root@xuliangwei ~]# /etc/init.d/iptables stop
    [root@xuliangwei ~]# chkconfig iptables off
    systemctl disable firewalld.service

    # 临时关闭selinux
    [root@xuliangwei ~]# setenforce 0

    # 配置Nginx官方Yum源
    [root@xuliangwei ~]# vim /etc/yum.repos.d/nginx.repo
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/6/$basearch/(centos 6)
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

    # 安装Nginx
    # rpm -q nginx (查看是否安装)
    # rpm -ql nginx (查看具体安装的路径)
    # rpm -qc nginx (查看配置文件位置)
    yum install nginx -y

    # 查看Nginx当前版本
    nginx -v/V(编译参数)
    nginx version: nginx/1.12.2


    # /etc/nginx/conf.d/ :该文件夹是子配置的存放处, /etc/nginx/nginx.conf 主配置文件会默认把这个文件夹中所有子配置都引入
    # /usr/share/nginx/html :该文件夹一般是存储静态文件,也可以配置其他路径
  • 如下表格对Nginx安装目录做详细概述 rpm -ql nginx

    路径 类型 作用
    /etc/nginx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf 配置文件 Nginx主配置文件
    /etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params 配置文件 Cgi、Fastcgi、Uwcgi配置文件
    /etc/nginx/win-utf /etc/nginx/koi-utf /etc/nginx/koi-win 配置文件 Nginx编码转换映射文件
    /etc/nginx/mime.types 配置文件 http协议的Content-Type
    /etc/rc.d/init.d/nginx /etc/rc.d/init.d/nginx-debug /etc/sysconfig/nginx /etc/sysconfig/nginx-debug 配置文件 配置系统守护进程管理器
    /etc/logrotate.d/nginx 配置文件 Nginx日志轮询,日志切割
    /usr/sbin/nginx /usr/sbin/nginx-debug 命令 Nginx终端管理命令
    /usr/share/doc/nginx-1.12.2 /usr/share/man/man8/nginx.8.gz 目录 Nginx的帮助手册
    /var/cache/nginx 目录 Nginx的缓存目录
    /var/log/nginx 目录 Nginx的日志目录
    /etc/nginx/modules /usr/lib64/nginx /usr/lib64/nginx/modules 目录 Nginx模块目录
    /usr/share/nginx /usr/share/nginx/html /usr/share/nginx/html/50x.html /usr/share/nginx/html/index.html 目录 Nginx默认站点目录
  • 开放端口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 添加开启端口,--permanent表示永久打开,不加是临时打开重启之后失效
    firewall-cmd --permanent --zone=public --add-port=8888/tcp
    # 开放 80、8080、443 端口,然后重启防火墙
    firewall-cmd --permanent --zone=public --add-port=80/tcp
    firewall-cmd --permanent --zone=public --add-port=8080/tcp
    firewall-cmd --permanent --zone=public --add-port=443/tcp

    # 查看防火墙,添加的端口也可以看到
    firewall-cmd --list-all

    systemctl start firewalld # 开启防火墙
    systemctl stop firewalld # 关闭防火墙
    systemctl status firewalld # 查看防火墙开启状态,显示running则是正在运行
    firewall-cmd --reload # 重启防火墙,永久打开端口需要reload一下

编译安装

  • 直接下载安装包,

  • Mainline version 开发版

  • Stable version 稳定版

  • Legacy version 历史版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    # 确认系统网络
    ping baidu.com

    # yum安装依赖
    yum install -y tar perl-devel zip unzip gperftools gcc gcc-c++ perl-ExtUtils-Embed pcre gd-devel.x86_64 libxml2 libxslt-devel autoconf pcre pcre-devel zlib zlib-devel openssl openssl-devel make automake wget httpd-tools vim tree

    # 初始化基本目录
    mkdir /soft -p
    cd /soft
    # 使用wget命令下载(推荐)。确保系统已经安装了wget,如果没有安装,执行 yum install wget 安装
    wget -c https://nginx.org/download/nginx-1.26.2.tar.gz
    # 解压
    tar -zxvf nginx-1.26.2.tar.gz -C /soft
    cd nginx-1.26.2

    # 使用configure配置nginx 注:将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录
    # 使用默认配置 没有报错代表安装完成。
    ./configure
    # 自定义配置(不推荐)
    # ./configure --help 查看./configure 支持哪些参数
    ./configure \
    --prefix=/usr/local/nginx \
    --conf-path=/usr/local/nginx/conf/nginx.conf \
    --pid-path=/usr/local/nginx/conf/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi

    # ./configure执行完成后,会生成很多中间文件,放在objs目录下面
    # 在当前命令执行make命令进行编译 没有报错代表执行成功
    make
    # make执行完成后生成的中间件文件,都会放在objs/src目录下面
    # 如果是第一次安装,下一步可以执行make install命令 make && make install
    # 如果是升级,就不能执行install命令。,需要把objs目录下生成nginx二进制文件拷贝到原老版本的nginx目录下。
    #执 行安装命令,第一次安装可以执行,如果是升级,谨慎执行。
    make install

    # 安装完成,安装目录为:/usr/local/nginx
    nginx -v #查看nginx版本
    nginx -V #查看nginx编译参数,如果没有额外的参数,只会显示configure arguments:
    #这情况下,代表是默认安装,可以查看源码目录auto/options 文件。默认安装了哪些模块,哪些没有安装。

    # conf 配置文件
    # html 网页文件,网站的根目录,就类似与apache里面的htdocs目录。
    # logs 日志文件
    # sbin 主要二进制程序,启动程序命令
  • 配置Nginx环境变量

    1
    2
    3
    vim ~/.bashrc
    export PATH=$PATH:/usr/local/nginx/sbin
    source ~/.bashrc
  • Nginx的启动管理

    1
    2
    3
    4
    5
    6
    7
    8
    # nginx进程启动
    cd /usr/local/nginx/sbin
    ./nginx # 启动nginx 如果不加 "-c" 参数,Nginx 会默认加载其安装目录的 conf 子目录中的 nginx.conf 文件。
    ./nginx -c /usr/local/nginx/conf/nginx.conf # 参数 "-c" 指定了配置文件的路径,
    ./nginx -s stop # 此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。
    ./nginx -s quit # 此方式停止步骤是待nginx进程处理任务完毕进行停止。
    ./nginx -s reload # 不停止nginx的服务,重新加载配置文件
    ./nginx -t # 测试测试配置文件是否正确

启动时报80端口被占用:

  • 端口问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 安装net-tool 包
    yum install net-tools

    # 查看端口监听情况
    sudo netstat -lntp

    # 注意最右侧的PID一列,可以根据PID查找到占用端口的程序所在路径。
    sudo ls -l /proc/{PID}| grep exe

    # 询指定端口 80 的占用情况:
    sudo netstat -tunlp | grep 80

    # 干掉所有nginx进程 : yum -y install psmisc
    killall nginx
  • 开机自启动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    # 方法一: vi /etc/rc.local
    # 增加一行
    /usr/local/nginx/sbin/nginx

    # 方法二
    # /usr/lib/systemd/system 系统内建的服务
    # /etc/systemd/system/ 存放用户自定义的服务单元文件
    # 进入/etc/systemd/system文件夹,新增文件 nginx.service
    vi /etc/systemd/system/nginx.service

    [Unit]
    Description=nginx service
    After=network.target

    [Service]
    User=root
    Type=forking
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop
    ExecStartPre=/bin/sleep 10

    [Install]
    WantedBy=multi-user.target

    # /etc/systemd/system下的服务文件并准备启用新配置时,通常还需要运行systemctl daemon-reload来通知Systemd重新加载配置文件,然后才能使用systemctl start|stop|restart|enable|disable等命令来操作服务。
    systemctl daemon-reload

    # 开启开机启动
    systemctl enable nginx

查看Nginx编译参数

1
[root@xuliangwei ~]# nginx -V

下表展示了Nginx编译参数选项以及作用

编译选项 作用
–prefix=/etc/nginx 程序安装目录和路径
–sbin-path=/usr/sbin/nginx Nginx启动停止命令
–modules-path=/usr/lib64/nginx/modules Nginx模块路径
–conf-path=/etc/nginx/nginx.conf Nginx主配置文件路径
–error-log-path=/var/log/nginx/error.log Nginx错误日志路径
–http-log-path=/var/log/nginx/access.log Nginx访问日志路径
–pid-path=/var/run/nginx.pid NginxPid路径
–lock-path=/var/run/nginx.lock Nginx锁路径
–http-client-body-temp-path=/var/cache/nginx/client_temp client头部临时缓存文件
–http-proxy-temp-path=/var/cache/nginx/proxy_temp proxy临时缓存文件
–http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp fastcgi临时缓存文件
–http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp uwsgi临时缓存文件
–http-scgi-temp-path=/var/cache/nginx/scgi_temp scgi临时缓存文件
–user=nginx 设定Nginx进程启动用户
–group=nginx 设定Nginx进程启动组(安全)
–with-cc-opt 设置额外的参数将被添加到CFLAGS变量
–with-ld-opt 设置附加的参数, 链接系统库

Nginx 重新编译

  • 获取参数:

    1
    nginx -V
  • 日常生产环境使用nginx,编译模块按照nginx官方yum安装的模块,基本能满足95%以上的生产需求。yum安装模块如下,可自行参考:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    yum -y update && yum install -y gcc wget tree pcre-devel \
    zlib-devel openssl openssl-devel \
    libxml2 libxml2-dev libxslt-devel gd-devel \
    ncurses-devel perl perl-ExtUtils-Embed \
    gperftools

    # 生产环境使用
    ./configure --prefix=/usr/local/nginx \
    --with-compat \
    --with-debug \
    --with-file-aio \
    --with-google_perftools_module \
    --with-http_addition_module \
    --with-http_auth_request_module \
    --with-http_dav_module \
    --with-http_degradation_module \
    --with-http_flv_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_image_filter_module=dynamic \
    --with-http_mp4_module \
    --with-http_perl_module=dynamic \
    --with-http_random_index_module \
    --with-http_realip_module \
    --with-http_secure_link_module \
    --with-http_slice_module \
    --with-http_ssl_module \
    --with-http_stub_status_module \
    --with-http_sub_module \
    --with-http_v2_module \
    --with-http_xslt_module=dynamic \
    --with-mail=dynamic \
    --with-mail_ssl_module --with-pcre \
    --with-pcre-jit --with-stream=dynamic \
    --with-stream_ssl_module \
    --with-stream_ssl_preread_module \
    --with-threads --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' \
    --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
  • 在当前命令执行make命令,没有报错代表执行成功, 如果是升级,就不能执行make install命令, 把objs目录下生成nginx二进制文件拷贝到原老版本的nginx目录下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # make && make install
    make
    # 备份原有已安装好的nginx
    cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
    systemctl stop nginx
    # 将刚刚编译好的nginx覆盖掉原有的nginx
    cp ./objs/nginx /usr/local/nginx/sbin/
    # 检查模块是否加载
    nginx -V
    # 重启nginx
    systemctl restart nginx
    # 日志
    tail -f /usr/local/nginx/logs/error.log

Nginx常用模块

Nginx模块分为 Nginx官方模块以及Nginx第三方模块

Nginx编译选项 模块作用
ngx_http_core_module 包含一些核心的http参数配置,对应Nginx的配置区块部分
ngx_http_access_module 访问控制模块,用来控制网站用户对Nginx的访问
ngx_http_gzip_module 压缩模块,对Nginx返回的数据压缩,属于性能优化模块
ngx_http_fastcgi_module fastci模块,和动态应用相关的模块,例如PHP
ngx_http_proxy_module proxy代理模块
ngx_http_upstream_module 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查。
ngx_http_rewrite_module URL地址重写模块
ngx_http_limit_conn_module 限制用户并发连接数及请求数模块
ngx_http_limit_req_module 限制Nginx request processing rate根据定义的key
ngx_http_log_module 访问日志模块,以指定的格式记录Nginx客户访问日志等信息
ngx_http_auth_basic_module Web认证模块,设置Web用户通过账号密码访问Nginx
nginx_http_ssl_module ssl模块,用于加密的http连接,如https

Nginx内置变量

http核心模块的内置变量

http请求变量
Nginx内置变量
自定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$uri: 当前请求的uri,不带参数
$request_uri: 请求的uri,带完整参数
$host: http请求报文中host首部,如果没有则以处理此请求的虚拟主机的主机名代替
$hostname: nginx服务运行在主机的主机名
$remote_addr: 客户端IP
$remote_port: 客户端端口
$remote_user: 使用用户认证时客户端用户输入的用户名
$request_filename: 用户请求中的URI经过本地root或alias转换后映射的本地文件路径
$request_method: 请求方法, GET POST PUT
$server_addr: 服务器地址
$server_name: 服务器名称
$server_port: 服务器端口
$server_protocol: 服务器向客户端发送响应时的协议, 如http/1.1 http/1.0
$scheme:在请求中使用scheme, 如http://xxx.com中的http
$http_HEADER: 匹配请求报文中指定的HEADER
$http_host: 匹配请求报文中的host首部
$document_root: 当前请求映射到的root配置

Nginx编译安装

openresty编译安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
//1.基础环境准备
mkdir /soft/package/src -p
mkdir /soft/package/src/ngx_3rd -p
useradd -s /sbin/nologin -M www
yum -y install wget make gcc gcc-c++ zlib-devel openssl \
openssl-devel pcre-devel kernel keyutils patch perl zlib \
tcl readline-devel glic libxslt-devel gd-devel GeoIP-devel \
libevent libevent-devel


//2.安装依赖插件
cd /soft/package/src
#openresty安装包
wget https://openresty.org/download/openresty-1.11.2.2.tar.gz
tar -xf openresty-1.11.2.2.tar.gz

#libdrizzle模块
wget http://openresty.org/download/drizzle7-2011.07.21.tar.gz
tar xzvf drizzle7-2011.07.21.tar.gz
cd drizzle7-2011.07.21/
./configure --without-server
make libdrizzle-1.0
make install-libdrizzle-1.0

#openssl依赖包安装
wget https://www.openssl.org/source/openssl-1.0.2d.tar.gz
tar -xf openssl-1.0.2d.tar.gz

#pcre依赖
wget -O pcre-8.37.tar.gz \
http://sourceforge.net/projects/pcre/files/pcre/8.37/pcre-8.37.tar.gz/download
tar -xf pcre-8.37.tar.gz

wget ftp://91.193.69.2/distributive/FreeBSD/ports/local-distfiles/osa/nginx-accesskey-2.0.3.tar.gz
tar xf nginx-accesskey-2.0.3.tar.gz
mv nginx-accesskey-2.0.3 ngx_3rd/nginx-accesskey-master

cd /soft/package/src/ngx_3rd
wget -O ngx_http_consistent_hash.zip \
https://codeload.github.com/replay/ngx_http_consistent_hash/zip/master
unzip ngx_http_consistent_hash.zip

wget -O nginx-static-etags.zip \
https://codeload.github.com/mikewest/nginx-static-etags/zip/master
unzip nginx-static-etags.zip

wget -O nginx-http-footer-filter.zip \
https://codeload.github.com/alibaba/nginx-http-footer-filter/zip/master
unzip nginx-http-footer-filter.zip

wget -O form-input-nginx-module.zip \
https://codeload.github.com/calio/form-input-nginx-module/zip/master
unzip form-input-nginx-module.zip

wget -O ngx_http_accounting_module.zip \
https://codeload.github.com/Lax/ngx_http_accounting_module/zip/master
unzip ngx_http_accounting_module.zip

wget -O ngx_log_if.zip \
https://codeload.github.com/cfsego/ngx_log_if/zip/master
unzip ngx_log_if.zip

wget -O nginx-limit-upstream.zip \
https://codeload.github.com/cfsego/nginx-limit-upstream/zip/master
unzip nginx-limit-upstream.zip

wget -O limit_upload_rate.zip \
https://codeload.github.com/cfsego/limit_upload_rate/zip/master
unzip limit_upload_rate.zip

wget -O ngx_devel_kit.zip \
https://codeload.github.com/simpl/ngx_devel_kit/zip/master
unzip ngx_devel_kit.zip

wget -O nginx-module-vts.zip \
https://codeload.github.com/vozlt/nginx-module-vts/zip/master
unzip nginx-module-vts.zip

wget -O nginx_tcp_proxy_module.zip \
https://codeload.github.com/yaoweibin/nginx_tcp_proxy_module/zip/master
unzip nginx_tcp_proxy_module.zip

wget -O nginx-module-sts.zip \
https://codeload.github.com/vozlt/nginx-module-sts/zip/master
unzip nginx-module-sts.zip

wget -O nginx-http-concat.zip \
https://codeload.github.com/alibaba/nginx-http-concat/zip/master
unzip nginx-http-concat.zip

wget -O nginx-url.zip \
https://codeload.github.com/vozlt/nginx-module-url/zip/master
unzip nginx-url.zip

wget -O nginx-access-plus.zip \
https://codeload.github.com/nginx-clojure/nginx-access-plus/zip/master
unzip nginx-access-plus.zip


//3.编译openresty
cd /soft/package/src/ngx_openresty-1.11.2.2
./configure \
--user=www \
--group=www \
--prefix=/soft/openresty-1.11 \
--pid-path=/soft/openresty-1.11/nginx/pid \
--error-log-path=/soft/log/nginx/error.log \
--http-log-path=/soft/log/nginx/access.log \
--http-proxy-temp-path=/soft/openresty-1.11/nginx/proxy_temp \
--http-fastcgi-temp-path=/soft/openresty-1.11/nginx/fastcgi_temp \
--http-client-body-temp-path=/soft/openresty-1.11/nginx/client_body_temp \
--with-openssl=/soft/package/src/openssl-1.0.2d \
--with-pcre=/soft/package/src/pcre-8.37 \
--with-libdrizzle=/usr/local \
--with-threads \
--with-file-aio \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_ssl_module \
--with-http_xslt_module \
--with-http_iconv_module \
--with-http_geoip_module \
--with-http_realip_module \
--with-http_gunzip_module \
--with-http_drizzle_module \
--with-http_addition_module \
--with-http_gzip_static_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_image_filter_module \
--without-http_uwsgi_module \
--without-http_scgi_module \
--with-mail \
--with-mail_ssl_module \
--add-module=/soft/package/src/ngx_3rd/nginx-accesskey-master/ \
--add-module=/soft/package/src/ngx_3rd/ngx_http_consistent_hash-master/ \
--add-module=/soft/package/src/ngx_3rd/nginx-static-etags-master/ \
--add-module=/soft/package/src/ngx_3rd/nginx-http-footer-filter-master/ \
--add-module=/soft/package/src/ngx_3rd/ngx_http_accounting_module-master/ \
--add-module=/soft/package/src/ngx_3rd/ngx_log_if-master/ \
--add-module=/soft/package/src/ngx_3rd/nginx-http-concat-master/ \
--add-module=/soft/package/src/ngx_3rd/nginx-module-vts-master/ \
--add-module=/soft/package/src/ngx_3rd/nginx-module-url-master/ \
--add-module=/soft/package/src/ngx_3rd/nginx-access-plus-master/src/c/
gmake && gmake install && ln -s /soft/openresty-1.11 /soft/openresty