一、nginx详解

一、简介

Nginx 是一款轻量级的套接字服务,他的特点如下
一、可以充当很多角色或用途:
(1)如过web应用只是一堆简单的html、css、js等静态页面,那根本都用不到nginx的反向代理功能,可以直接用nginx对外提供服务,此时可以将其称之为静态文件服务
(2)在集群架构中,web层服务器上可以用nginx充当web服务用,其作用是反向代理web应用(fastcgi_pass、proxy_pass、uwsgi_pass)
(3)七层负载均衡(反向代理功能+upstream模块)
(4)四层负载均衡(反向代理功能+upstream模块)
(5)还可以基于location来区分动静态请求,实现动静分离,分离集群压力
二、性能非常强大(官方测试能够支撑 5 万并发连接,在实际生产环境中可以支撑 2 到 4 万并发连接。)
(1)内存消耗少,启动极快
(2)采用异步非阻塞事件驱动模型(epoll网络IO模型),从而使其高并发能力极强,在互联网项目中广泛应用。
(3)开源软件,免费
(4)稳定性高,用于反向代理(负载均衡),宕机的概率微乎其微。
(5)支持热部署。在不间断服务的情况下,对软件版本升级。
三、nginx包含的应用场景

file

四、了解nginx的同类

1.apache:httpd,最早期使用的web服务,性能不高,操作难
2.nginx
    tengine:Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性
    openresty-nginx:OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
3.IIS:windows下的web服务
4.lighttpd:是一个德国人领导的开源 Web 服务器软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的 Web Server 环境。具有非常低的内存开销,CPU 占用率低,效能好,以及丰富的模块等特点。
5.GWS:google web server
6.BWS:baidu web server

二、安装nginx

2.1 yum安装

yum安装见:https://egonlin.com/?p=9386
yum安装后会产生一些文件,为了让大家更清晰的了解Nginx软件的全貌,可使用rpm -ql nginx查看整体的目录结构及对应的功能,
了解即可
1.Nginx主配置文件

路径 类型 作用
/etc/nginx/nginx.conf 配置文件 nginx主配置文件
/etc/nginx/conf.d/default.conf 配置文件 默认网站配置文件

2.Nginx代理相关参数文件

路径 类型 作用
/etc/nginx/fastcgi_params 配置文件 Fastcgi代理配置文件
/etc/nginx/scgi_params 配置文件 scgi代理配置文件
/etc/nginx/uwsgi_params 配置文件 uwsgi代理配置文件

3.Nginx编码相关配置文件

路径 类型 作用
/etc/nginx/win-utf 配置文件 Nginx编码转换映射文件
/etc/nginx/koi-utf 配置文件 Nginx编码转换映射文件
/etc/nginx/koi-win 配置文件 Nginx编码转换映射文件
/etc/nginx/mime.types 配置文件 Content-Type与扩展名

4.Nginx管理相关命令

路径 类型 作用
/usr/sbin/nginx 命令 Nginx命令行管理终端工具
/usr/sbin/nginx-debug 命令 Nginx命令行与终端调试工具

5.Nginx日志相关目录与文件

路径 类型 作用
/var/log/nginx 目录 Nginx默认存放日志目录
/etc/logrotate.d/nginx 配置文件 Nginx的日志切割配置,由lograte工具管理详见https://egonlin.com/?p=9568第二小节,你也可以直接去/var/log/nginx目录下查看切割的结果

2.2 源安装

安装nginx依赖包

yum install gcc* glibc* -y
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

gcc:安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境

pcre pcre-devel:pcre 是一个 perl 库,包括 perl 兼容的正则表达式库,nginx 的 http 模块使用 pcre 来解析正则表达式

zlib zlib-devel:zlib 库提供了很多种压缩和解压缩方式,nginx 使用 zlib 对 http 包的内容进行 gzip

openssl openssl-devel:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库

下载压缩包

wget https://nginx.org/download/nginx-1.22.1.tar.gz

安装 Nginx 步骤

# 解压到当前目录
[root@localhost opt]# tar -zxvf /opt/nginx-1.12.2.tar.gz

# 进入解压目录
[root@localhost opt]# cd nginx-1.22.1/

# 配置参数(具体参数可以./configure --help命令查看)
[root@localhost nginx-1.22.1]# ./configure --prefix=/usr/local/nginx1.12.2 --with-http_stub_status_module --with-http_ssl_module

# 编译
[root@localhost nginx-1.22.1]# make

# 安装
[root@localhost nginx-1.22.1]# make install

# 验证
[root@localhost nginx-1.22.1]# /usr/local/nginx1.12.2/sbin/nginx -v
nginx version: nginx/1.22.1

# 制作软连接:一般./configure指定的prefix目录都会具体到nginx的版本,这样方便区分,但是在用的时候一般都会做软连接,这样既方便用也方便后续升级
[root@localhost nginx-1.22.1]# ln -s /usr/local/nginx1.12.2 /usr/local/nginx

# 配置环境变量/etc/profile.d/nginx.sh
export PATH=$PATH:/usr/local/nginx/sbin

# system管理配置
#源码包安装后没有办法使用system管理,需要我们自己配置
[root@localhost /usr/lib/systemd/system]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://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=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target

[root@localhost ~]# systemctl daemon-reload                 #加载新的unit (*.service)配置文件

三、nginx常用命令

例如:/usr/local/nginx/sbin/nginx

Nginx 默认端口号为 80。-v、-t、-s 参数最为常用
参数:
-h:命令帮助
-v :打印版本号
-V:打印已经安装的插件等信息
-t:测试配置正确性并退出
-q:测试配置时只显示错误
-s:向主进程发送信号(reload 重新加载配置文件、stop 停止服务)
-p:指定Nginx服务器路径前缀
-c: 指定Nginx配置文件路径
-g: 指定Nginx附加配置文件路径\

示例

nginx #启动nginx。 等价于systemctl start nginx

nginx -s reopen #重启Nginx。   等价于systemctl restart nginx

nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx。 等价于systemctl reload nginx

nginx -s stop #强制停止Nginx服务。 等价于systemctl stop nginx

nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务)

nginx -t #检测配置文件是否有语法错误,然后退出

nginx -?,-h #打开帮助信息

nginx -v #显示版本信息并退出

nginx -V #显示版本和配置选项信息,然后退出

nginx -V 2>&1 | sed "s/\s\+--/\n --/g" #模块分行输出,格式化输出

killall nginx #杀死所有nginx进程

systemctl enable nginx  #加入开机自启
    Centos6:
        启动:nginx
            service nginx start
            /etc/init.d/nginx start
        加入开机自启:
            chkconfig nginx on

nginx -T #检测配置文件是否有语法错误,转储并退出

nginx -q #在检测配置文件期间屏蔽非错误信息

nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)

nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)

nginx -g directives #设置配置文件外的全局指令

nginx -V # 大写子字母V可以看到nginx的更加详细的信息,包括加载的模块,具体内容解析如下

[root@web02 ~]# nginx -V        #显示版本和配置选项信息,然后退出
。。。。
###########################内容解析#######################################

nginx version: nginx/1.18.0                 #nginx版本
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)    #
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments:
 --prefix=/etc/nginx            #nginx文件的安装路径,其它选项如果使用相对路径,那么以此路径为基础路径
 --sbin-path=/usr/sbin/nginx    #二进制程序的安装目录
 --modules-path=/usr/lib64/nginx/modules    #模块安装路径
 --conf-path=/etc/nginx/nginx.conf  #设置nginx的conf文件路径
 --error-log-path=/var/log/nginx/error.log  #设置nginx错误日志路径
 --http-log-path=/var/log/nginx/access.log  #设置nginx的访问日志路径
 --pid-path=/var/run/nginx.pid  #设置nginx的pid文件路径
 --lock-path=/var/run/nginx.lock    #设置lock文件临时存放的路径
 --http-client-body-temp-path=/var/cache/nginx/client_temp  #设置http客户端主体临时缓存路径
 --http-proxy-temp-path=/var/cache/nginx/proxy_temp     #设置http反向代理临时路径
 --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp     #设置http的fastcgi临时缓存路径
 --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp #设置uwsgi临时目录
 --http-scgi-temp-path=/var/cache/nginx/scgi_temp   #scgi临时存放目录
 --user=nginx   #设置启动 worker 进程时所使用的非特权用户名
 --group=nginx  #设置启动 worker 进程时所使用的非特权用户组名
 。。。。。。

四、nginx平滑升级方法

1.下载新版本的包
[root@web02 ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz

2.解压
[root@web02 ~]# tar xf nginx-1.18.0.tar.gz

3.生成
[root@web02 nginx-1.18.0]# cd nginx-1.18.0
[root@web02 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx-1.18.0 --user=www --group=www --without-http_gzip_module --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

4.编译安装
[root@web02 nginx-1.18.0]# make && make install

5.重做软连接:删除磁盘上的nginx包相关文件并不会影响已运行的nginx进程,因为代码文件都已经加载到内存中了
[root@web02 ~]# rm -rf /usr/local/nginx && ln -s /usr/local/nginx-1.18.0 /usr/local/nginx

6.重启服务
[root@web02 ~]# systemctl restart nginx

五、Nginx 配置文件

5.1 配置文件主体结构

一些全局配置    # 1、全局配置

events { ... } # 2、事件驱动配置

http{          # 3、http模块配置
   upstream {}
   server{
        location  { ... }
    }
}

stream{        # 4、stream模块配置
   upstream {}
   server{
        location  { ... }
    }
}

说明如下:

  • main:全局配置,所有其他配置块都包含在其内部
    • events 块:控制Nginx处理连接的方式。
    • http 块:Nginx处理http请求的主要配置块。
      • upstream块:配置负载均衡
      • server块:Nginx中主机配置块,可用于配置多个虚拟主机。
        • localtion块:可以有多个,用于匹配uri路径
    • stream块:stream做四层负载均衡并不常用
      • upstream块:配置负载均衡
      • server块:四层的server块内部必然是不能写location匹配uri地址
        补充:
        1、http块与stream块内的upstream及server块均可以有多个
        2、在 Nginx 配置文件中,每一条指令配置都必须以 “;” 分号结束。

file

留存作图地址:https://www.processon.com/diagraming/5889ff28e4b049e795ec6c62

5.2 全局配置介绍

events块、http块、stream块内部都可以包含很多配置,但就这三大块本身来说他们都是属于全局块的,这仨内部的东西暂且不说,先来说一下与他们并列处于顶级的一些配置

# 1、运行用户
user nobody;

# 2、工作的worker进程数,通过与cpu核数保持一致,设置为auto,nginx会自动配置为核数。
#    注意:nginx启动后还有一个master进程负责与用户交互响应会话,具体干活的是worker进程
worker_processes  auto;  #

# 3、全局错误日志:日志级别有:debug、info、notice、warn、error、crit、alert
#error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

# 4、PID文件
pid        logs/nginx.pid;

# 5、include用来引入配置文件
#    下述指令的含义:nginx启动时会加载动态dynamic模块的所有配置,确保动态模块都加载到nginx中
include /usr/share/nginx/modules/*.conf;

我们在用nginx配置四层stream负载均衡时,yum安装stream动态模块会产生两个动作
1、下载的模块放到/usr/lib64/nginx/modules目录下
2、加载该插件模块的配置文件放到/usr/share/nginx/modules下

[root@lb ~]# ls /usr/lib64/nginx/modules/
ngx_stream_module.so
[root@lb ~]# ls /usr/share/nginx/modules/
mod-stream.conf
[root@lb ~]# cat /usr/share/nginx/modules/mod-stream.conf 
load_module "/usr/lib64/nginx/modules/ngx_stream_module.so";

file

worker_processes 是 Nginx 服务器实现并发处理的关键所在。worker processes 值越大,可以支持的并发处理量也越多(并不是越大越好,因为会受到硬件、软件等设备的制约)

5.3 events块

events块用于设置nginx的IO模型及连接数上限
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

events {
    # 1、epoll仅用于linux2.6以上内核,还有其他io多路复用模型如select、poll等
    use  epoll; 
    #2、单个后台worker process进程的最大并发链接数,可以调大,但是文件描述也要一起调大,并且你要
    #  综合考虑硬件性能。
    # 当前 Nginx 服务器能够处理的并发请求数量 = worker_connections × worker_processes
    worker_connections  1024;
}

5.4 http块

Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里

http {
    #1、设定日志输出模板
    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;

    #2、网络io优化参数
    #2.1 开启高效文件传输模式,调用 sendfile 函数(zero copy 方式)来传输文件,效率高cpu消耗低
    sendfile     on;
    #2.2 通常与sendfile一起用,当 tcp_nopush 设置为 on 时,Nginx 将尽可能发送较大的 TCP 数据包,减少 TCP 报文的数量,提高传输效率。这对于减少网络传输中的 TCP 慢启动阶段,减少网络延迟和提高网络吞吐量非常有用。这在传输大型文件或使用 HTTP/1.1 的 Keep-Alive 长连接时特别有效。
    tcp_nopush     on; 
    #2.3 开启Nagle算法,数据将会尽快发送出去,而不是等待缓冲区满或者接收到ACK。这会减少延迟,但可能会造成网络利用率低。这个选项在处理需要快速响应的短数据流(例如HTTP/1.1的keep-alive连接)时非常有用。
    tcp_nodelay     on;
    #2.4、控制长连接的两个参数:
    keepalive_timeout  65; # 开启长连接:如果客户端在65秒内没有再次发送新的请求,那么Nginx将关闭这个连接,反之如果在65秒内有新的请求到来,那么这个连接会保持开启,等待处理新的请求
    keepalive_requests 100; # 默认情况下,Nginx的keepalive_requests 是设置为100,这个设置针对的是每个长连接在关闭前能处理的最大请求数量。你可以根据需要调整这个值。

    #2.5开启gzip压缩,节省带块加速网络传输
    gzip  on;

    # 3、控制客户端请求头的缓冲区大小和数量:应对请求头过大的情况
    client_header_buffer_size    128k;  #  设定用于保存客户端请求头的缓冲区的大小,当客户端发送的请求头超过这个大小时,Nginx 将使用临时文件来保存请求头。这可以防止恶意客户端发送大量数据来消耗服务器资源
    large_client_header_buffers  4 128k; # 如果请求头过大,可以使用多个缓冲区来保存。格式为 <数量> <大小>。<数量>代表缓冲区数量,<大小>代表每个缓冲区的大小。

    #4、mime.types定义了nginx可以识别的网络资源类型,例如css、js、jpg等
    include  /etc/nginx/mime.types; 
    #5、http响应header中,如果没有明确指定Content-Type,则默认使用default_type指定的
    default_type application/octet-stream; # application/octet-stream。这是一种二进制的数据类型,意味着这种内容不会被浏览器解析,而是作为一个下载文件来处理。这主要用于那些不适合以普通文本或者其他MIME类型表示的文件,例如可执行文件。

    # 5、设定虚拟主机配置
    server {
        #侦听80端口
        listen    80;
        #定义使用 www.nginx.cn访问
        server_name  www.nginx.cn;
        #定义服务器的默认网站根目录位置
        root html;
        #设定本虚拟主机的访问日志
        access_log  logs/nginx.access.log  main;
        #默认请求
        location / {
            #定义首页索引文件的名称
            index index.php index.html index.htm;   
        }
        # 定义错误提示页面
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
        }

        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            #过期30天,静态文件不怎么更新,过期可以设大一点,
            #如果频繁更新,则可以设置得小一点。
            expires 30d;
        }

        #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
        location ~ .php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

        #禁止访问 .htxxx 文件
            location ~ /.ht {
            deny all;
        }
    }
}

1、include mime.types;
mime.types定义了浏览器能够识别的网络资源的媒体类型,Nginx 服务器作为 Web 服务器,必须能够识别这些资源类型才能正常响应

# mime.types包含的部分类型
types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;
    ......
}

2、如果你是使用Nginx作为反向代理服务器,并且你希望与后端服务器之间的连接也保持长连接,你还可以在upstream块中添加keepalive设置,这需要Nginx的版本在1.1.4或者以上。例如:

   upstream backend {
       server backend1.example.com;
       server backend2.example.com;
       keepalive 32;
   }

3、日志格式设置(重要,但很简单,看一下就行):
https://egonlin.com/?p=9568
4、反向代理服务器在转发请求的 http 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的 IP 地址和原来客户端的请求的服务器地址。

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header X-Real-IP $remote_addr;  # 设置真实/原始客户端的 IP 地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 追加原始客户端的 IP 地址到 X-Forwarded-For 头信息中。这样,在后端服务器中就可以通过读取 X-Forwarded-For 头信息来获取原始客户端的 IP 地址。
        proxy_set_header Host $host;
    }
}

在这个例子中,有三个和代理相关的头信息被添加到了请求中:
1、Host:保存的是原始请求头中的Host字段。这个字段是必要的,因为在某些应用中,会根据这个字段来判断如何处理请求。
2、X-Real-IP:保存的是客户端的真实IP地址。
3、X-Forwarded-For:记录了客户端的真实IP地址,以及所有中间代理服务器的地址。如果这个头已经存在,
Nginx会把当前服务器的地址添加到这个头的最后。这个头可以用来追踪请求的全部转发路径。
注意:proxy_set_header 这个指令必须在location块中,而不能在http或者server块中。
因为头信息的设置是在处理请求的时候进行的,所以它必须在处理请求的位置设置。

5、gzip

Nginx 开启 gzip 压缩功能,可以使网站的 css、js 、xml、html 文件在传输时进行压缩,提高访问速度,进而优化 Nginx 性能。

gzip 压缩可以配置 http,server 和 location 块下,位置不同,作用域不同。

1)作用:将响应报⽂发送⾄客户端之前可以启⽤压缩功能,这能够有效地节约带宽,并提⾼响应⾄客户端的速度。

2)语法:gzip
指令  含义
gzip on;    决定是否开启 gzip 模块,on 代表开启,off 代表关闭
gzip_min_length 1100;   设置允许压缩的页面最小字节(从header头的Content-Length中获取) ,当返回内容大于此值时才会使用 gzip 进行压缩,以 K 为单位,当值为 0 时,所有页面都进行压缩。建议大于1k
gzip_buffers 16 8k; 设置 gzip 申请内存的大小,其作用是按块大小的倍数申请内存空间。此处指按照原始数据大小以 8k 为单位的 16 倍申请内存
gzip_comp_level 6;  设置 gzip 压缩等级,等级越底压缩速度越快,文件压缩比越小,反之速度越慢文件压缩比越大;等级1-9,最小的压缩最快 但是消耗 cpu
gzip_disable “msie6”    (IE5.5 和 IE6 SP1使用 msie6 参数来禁止 gzip 压缩 )指定哪些不需要 gzip 压缩的浏览器(将和User-Agents进行匹配),依赖于 PCRE 库
gzip_types text/plain text/css …    设置需要压缩的MIME类型,非设置值不进行压缩,即匹配压缩类型

3) 示例
http {
    gzip on;
    gzip_min_length 1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 9;
    gzip_types       text/plain  application/x-javascript  text/css  application/xml  text/javascript  application/x-httpd-php  application/javascript  application/json;
    gzip_disable "msie6";
    gzip_vary on;
}

5.5 server块详解-虚拟主机

server 块主要负责配置虚拟主机。每个 http 块可以包含多个 server 块,而每个 server 块就相当于一个虚拟主机。
什么时虚拟主机

在同一台物理服务器上,只部署一个nginx,然后在nginx的配置文件内可以定义多个server,
每个server都可以用来管理一个站点、具有独立的程序及资源,可以独立地对外提供服务供用户访问

用户在访问这些站点时,就好像在访问一台独立的物理服务器一样,
但其实都源自于一台机器,访问的站点只是同一台物理机上的多个server配置而已,
这个server便被称之为虚拟主机了
该技术的产生是为了节省互联网服务器硬件成本。

联系管理员微信tutu19192010,注册账号

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术