0


Nginx详解

目录

    Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。

nginx做为HTTP服务器,有以下几项基本特性:

  • 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
  • 无缓存的反向代理加速,简单的负载均衡和容错.
  • FastCGI,简单的负载均衡和容错.
  • 模块化的结构。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
  • 支持SSL 和 TLSSNI.

一、nginx安装

1.1 环境准备

# 禁止防火墙自启动并立刻关闭防火墙
systemctl disable firewalld.service --now

# 安装所需软件
yum -y install gcc make pcre-devel openssl-devel
  • gcc 可以编译 C,C++,Ada,Object C和Java等语言(安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境)
  • pcre-devel 是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库
  • openssl-devel 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
  • make 编译工具

1.2 安装nginx

nginx安装包网址:https://nginx.org/

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

# 解压
tar xvf nginx-1.22.1.tar.gz
cd nginx-1.22.1

# 配置(带有https模块)
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

# 编译安装
编译:make
安装:make install

1.3 nginx基本使用

  • nginx安装目录- conf 配置文件- sbin 主程序- html 网站页面- logs 日志

nginx命令用法

# 提高安全性
useradd -s /sbin/nologin nginx

# 启动服务
/usr/local/nginx/sbin/nginx 
# 关闭服务 
/usr/local/nginx/sbin/nginx -s stop
# 重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
# 查看软件信息
/usr/local/nginx/sbin/nginx -v

1.4 使用systemd管理Nginx服务

编写service文件

vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx service
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

# 写好service文件后systemctl daemon-reload重新加载配置
systemctl daemon-reload

进行systemctl 管理

# 开机自启
systemctl enable nginx.service
# 取消开机自启动
systemctl disable nginx.service
# 启动
systemctl start nginx.service
# 关闭
systemctl stop nginx.service
# 重启服务
systemctl restart nginx.service
# 查看状态
systemctl status nginx.service

1.5 Nginx配置文件

  • nginx 配置文件有三部分组成
  • 每次修改完配置文件后都要reload一下,使文件生效
worker_processes  1;                      # 第一部分
 
events {                                  # 第二部分    
    worker_connections  1024;
}

http {                                    # 第三部分
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

1.5.1 第一部分:全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
比如上面第一行配置的:

  worker_processes  1;

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。

1.5.2 第二部分:events块

events {
    worker_connections  1024;
}

events 块涉及的指令,主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等

般来说,有多少cpu就有多少 worker_processes,worker_connections的连接数就是CPU数量×1024

1.5.3 第三部分

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
  • http全局块- http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
  • server 块- 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。- 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。- 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置
  • location 块- 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。 地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行

二、HTTPS加密网站

  • 源码安装Nginx时必须使用--with-http_ssl_module参数,启用加密模块,对于需要进行SSL加密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)。
  • 加密算法一般分为对称算法、非对称算法、信息摘要。
  • 对称算法有:AES、DES,应用在单机数据加密。(加密解密同一密码,用的最多)

配置SSL虚拟主机

2.1 修改Nginx配置文件

  • ssl_certificate cert.pem- 这里是证书文件(文件要自己创建)文件要创建配置文件conf下
  • ssl_certificate_key cert.key- 这里是私钥文件(文件要自己创建)
  • 加密网站根目录,最好改成https
[root@proxy nginx]#vim  /usr/local/nginx/conf/nginx.conf
… …    
server {
        listen       443 ssl;
        server_name            localhost;
        ssl_certificate      cert.pem;            #这里是证书文件
        ssl_certificate_key  cert.key;            #这里是私钥文件
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
            root   https;                        #加密网站根目录
            index  index.html index.htm;
        }
    }

2.2 生成私钥与证书(公钥)

[root@proxy nginx]#openssl genrsa > conf/cert.key            #生成私钥

[root@proxy nginx]#openssl req -x509 -key conf/cert.key > conf/cert.pem    #生成证书,生成过程会询问诸如你在哪个国家之类的问题,可以随意回答
Country Name (2 letter code) [XX]:dc    国家名
State or Province Name (full name) []:dc    省份
Locality Name (eg, city) [Default City]:dc     城市
Organization Name (eg, company) [Default Company Ltd]:dc    公司
Organizational Unit Name (eg, section) []:dc    部门
Common Name (eg, your name or your server's hostname) []:dc    服务器名称
Email Address []:[email protected]     电子邮件

2.3 重新加载配置

[root@proxy nginx]# mkdir https    #创建安全网站的目录
[root@proxy nginx]# echo "https~~~~ "  > https/index.html     #创建安全网站的页面
[root@proxy nginx]# sbin/nginx    #服务没开的话开服务
[root@proxy nginx]# sbin/nginx -s reload    #已经开了的话重加载配置
[root@proxy nginx]# curl  -k  https://192.168.99.5     #检验,-k是忽略安全风险
https~~~~      #看到这个内容就说明实验成功
[root@proxy nginx]# systemctl stop firewalld    #如果用真机的火狐浏览器测试需要
关闭防火墙,然后输入https://192.168.99.5 
# 启动Nginx服务,如果服务器上已经启动了其他监听80端口的服务(如httpd),则需要先关闭该服务。
[root@proxy ~]# systemctl stop httpd                    #如果该服务存在则关闭该服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx             #启动Nginx服务
[root@proxy ~]# ss -utnlp | grep :80      

# 启动MySQL服务
[root@proxy ~]# systemctl enable mariadb --now          #启动服务器,并设置开机自启

# 启动PHP-FPM服务
[root@proxy ~]# systemctl enable php-fpm --now          #启动fpm,并设置开机自启

三、nginx地址重写

  • 什么是地址重写?- 获得一个URL的请求,然后改成服务器可以处理的另一个URL
  • 地址重写好处- 缩短URL,隐藏实际路径提高安全性- 易于用户记忆
  • 关于Nginx服务器的地址重写,主要用到的配置参数是rewrite- rewrite regex replacement flag- regex:表示正则匹配规则 replacement:表示跳转后的内容 flag:表示rewrite支持的flag标记- rewrite 旧地址 新地址 [选项]

3.1 地址重写的选项

  • redirect 临时重定向,状态码302,爬虫不更新URI(redirect 自动跳到修改后的地址)
  • permanent 永久重定向,状态码301,爬虫更新URI
  • last 不再读其他语句,但还会继续匹配其他location语句
  • **break **不再读其他语句,结束请求
# redirect 服务器会返回一个302状态码,告诉浏览器该页面已被重定向
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
location /imgs {
                rewrite ^/imgs/(.*\.jpg)$ /images/$1 redirect;
        }

# permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..

       location /imgs {
                rewrite ^/imgs/(.*\.jpg)$ /images/$1 permanent;
        }

# last 本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在server和if中
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
   location /imgs {
                rewrite ^/imgs/(.*\.jpg)$ /images/$1 last;  #没有其他location语句时,打开此页面,若有其他location,跳转其他页面
        }
        location /images {
                rewrite ^/images/(.*\.jpg)$ https://music.y444.cn/#/ last;
        }

# break 本条规则匹配完成即终止,不在匹配后面的任何规则,一般使用在location中
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
  location = /imgs {
                rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;  #break可以阻止后面的语句 
        }

3.2 简单地址重写

访问a.html重定向到b.html

[root@proxy nginx]# vim conf/nginx.conf
.. ..
server {
        listen       80;
        server_name  localhost;
        rewrite  /a.html  /b.html;            
        location / {
            root   html;
            index  index.html index.htm;
    }
}

访问192.168.99.5/下面子页面,重定向至www.tmooc.cn/下相同的子页面

$1 = 粘贴前面第一个小括号里的东西

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
        listen       80;
        server_name  localhost;
        rewrite  /(.*)  http://www.tmooc.cn/$1;
        location / {
            root   html;
            index  index.html index.htm;
    }
}

3.3 不同网站跳转

/ 不管你访问什么网站 都往后面那个域名跳, 访问192.168.99.5的请求重定向至www.tmooc.cn

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
        listen       80;
        server_name  localhost;
        rewrite /  http://www.tmooc.cn/;
        location / {
            root   html;
            index  index.html index.htm;
    }
}

3.4 if判断

3.4.1 基本语法

if (condition) { … }

if 可以支持如下条件判断匹配符号
~             正则匹配 (区分大小写)
~*            正则匹配 (不区分大小写)
!~            正则不匹配 (区分大小写)
!~*           正则不匹配  (不区分大小写)
-f 和!-f      用来判断是否存在文件
-d 和!-d      用来判断是否存在目录
-e 和!-e      用来判断是否存在文件或目录
-x 和!-x      用来判断文件是否可执行

#在匹配过程中可以引用一些Nginx的全局变量
$args                请求中的参数;
$document_root      针对当前请求的根路径设置值;
$host                请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate            对连接速率的限制;
$request_method     请求的方法,比如"GET"、"POST"等;
$remote_addr        客户端地址;
$remote_port        客户端端口号;
$remote_user        客户端用户名,认证用;
$request_filename   当前请求的文件路径名(带网站的主目录/usr/local/nginx/html/images/a.jpg)
$request_uri        用于表示客户端请求的完整 URI,也就是请求地址,它记录了客户端发起的请求地址
$query_string       与$args相同;
$scheme             用的协议,比如http或者是https
$server_protocol    请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr        服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name        请求到达的服务器名;
$document_uri       与$uri一样,URI地址;
$server_port        请求到达的服务器端口号;

假如旧的域名是www.lty.com,有需要使用新的域名www.liutianyang.com代替,但是旧域名不能废除,需要跳转到新的域名上,而且后面的参数保持不变

//修改配置文件,写入rewrite和if结合使用
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  server {
        listen       80;
        server_name  www.lty.com;
        
       location / {
                if ($host = 'www.lty.com') {
                        rewrite ^/(.*)$ http://www.liutianuang.com/$1 permanent;
                }
                root html;
                index index.html index.htm;

四、nginx反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理的好处

  • 可以起到保护网站安全的作用,因为任何来自Internet的请求都必须先经过代理服务器。
  • 通过缓存静态资源,加速Web请求。
  • 实现负载均衡。顺便说下,目前市面上,主流的负载均衡方案,硬件设备有F5,软件方案有四层负载均衡的LVS,七层负载均衡的Nginx、Haproxy等。

4.1 部署实施后端Web服务器

后端部署两台web服务器

4.2 配置Nginx服务器

修改/usr/local/nginx/conf/nginx.conf配置文件

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
.. ..
#使用upstream定义后端服务器集群,集群名称任意(如webserver)
#使用server定义集群中的具体服务器和端口
upstream webserver {
                server 192.168.99.100:80;
                server 192.168.99.200:80;
        }
.. ..
server {
        listen        80;
        server_name  localhost;
            location / {
#通过proxy_pass将用户的请求转发给webserver集群
            proxy_pass http://webserver;
        }
}
.. ..
}

4.3 设置权重

weight 可以设置后台服务器的权重,权重越大任务的分配量就越大,权重值默认 1

就是访问两次web1,在访问一次web2,然后重复

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
                server 192.168.99.100 weight=2;
                server 192.168.99.200;
        }

4.4 设置健康检查

max_fails可以设置后台服务器的失败次数,fail_timeout可以设置后台服务器的失败超时时间

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
                server 192.168.99.100;
                server 192.168.99.200 max_fails=2 fail_timeout=30;
        }

4.5 设置相同客户端访问相同Web服务器

ip_hash根据客户端IP分配固定的后端服务器

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
                 ip_hash;
                server 192.168.99.100 ;
                server 192.168.99.200 ;
        }

4.6 添加down标记

down标记可以让集群主机暂时不参与集群活动

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
                server 192.168.99.100 ;
                server 192.168.99.200 down;
        }

五、Nginx优化

5.1 自定义报错页面

优化前,客户端使用浏览器访问不存在的页面,会提示404文件未找到

修改Nginx配置文件,自定义报错页面

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
        charset utf-8;              #仅在需要中文时修改该选项
error_page   404  /test.jpg;        #自定义错误页面为一张图片,图片可以从真机拷入
.. ..
[root@proxy ~]# nginx -s reload

优化后,客户端再次使用浏览器访问不存在的页面,会看到图片

5.2 查看服务器状态信息

编译安装时使用--with-http_stub_status_module开启状态页面模块

[root@proxy nginx]# cd ~/lnmp_soft/nginx-1.22.1/
[root@proxy nginx-1.22.1]# ./configure   \
> --with-stream                                 #开启4层代理模块
> --with-http_stub_status_module                #开启status状态页面
[root@proxy nginx-1.22.1]# make                 #编译
[root@proxy nginx-1.22.1]# killall  nginx
[root@proxy nginx-1.22.1]# cp  objs/nginx /usr/local/nginx/sbin/   #覆盖原文件
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx   #开启nginx

修改Nginx配置文件,定义状态页面

[root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf
… …
location /status {
                stub_status on;
                 #allow IP地址;
                 #deny all;
        }
… …
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

优化后,查看状态页面信息

[root@proxy ~]# curl  http://192.168.99.5/status
Active connections: 1 
server accepts handled requests
 10 10 3 
Reading: 0 Writing: 1 Waiting: 0

Active connections:当前活动的连接数量。

Accepts:已经接受客户端的连接总数量。

Handled:已经处理客户端的连接总数量。

Requests:客户端发送的请求数量。

Reading:当前服务器正在读取客户端请求头的数量。

Writing:当前服务器正在写响应信息的数量。

Waiting:当前多少客户端在等待服务器的响应。

5.3 优化Nginx并发量

优化前使用ab高并发测试,使用web1或proxy自己作为海量客户(防火墙与selinux都关闭

[root@proxy ~]# ab -n 100 -c 100 http://192.168.99.5/    #-n任务量,-c是连接数
...
...
100%                    #成功
[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.99.5/
Benchmarking 192.168.99.5 (be patient)
socket: Too many open files (24)                #失败

修改Nginx配置文件,增加并发量

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes  2;                 #与CPU核心数量一致
events {
    worker_connections 50000;        #每个worker最大并发连接数
}
.. ..
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

优化Linux内核参数(最大文件数量)

[root@proxy ~]# ulimit -n                         #查看最大文件数量
[root@proxy ~]# ulimit -n 100000                  #临时设置最大文件数量
[root@proxy ~]# vim /etc/security/limits.conf
    .. ..
*               soft    nofile            100000
*               hard    nofile            100000
#该配置文件分4列,分别如下:
#用户或组    硬限制或软限制    需要限制的项目   限制的值

5.4 优化Nginx数据包头缓存

优化前,使用脚本测试超长头部请求是否能获得响应

默认情况下nginx无法支持长地址栏,会报414错误

[root@proxy ~]# cat lnmp_soft/buffer.sh 
#!/bin/bash
URL=http://192.168.99.5/index.html?
for i in {1..5000}
do
    URL=${URL}v$i=$i
done
curl $URL                              #经过5000次循环后,生成一个超长的URL地址
[root@proxy ~]# ./buffer.sh
.. ..
<center><h1>414 Request-URI Too Large</h1></center>        #访问失败

修改Nginx配置文件,增加数据包头部缓存大小

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size    200k;         #请求包头信息的缓存大小    
large_client_header_buffers  4 200k;        #大请求包头部信息的缓存个数与容量
.. ..
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

六、Session共享

当nginx将用户的请求分发到不同的服务器时,如果用户的两次请求被分发到了不同的服务器,而这些服务器之间没有共享session信息,就会出现session不一致的问题。具体来说,如果用户的第一次请求被分发到服务器A,并在该服务器上创建了session,而第二次请求被分发到服务器B,但服务器B上没有该用户的session信息,那么服务器B就无法识别用户的会话状态,导致用户需要重新登录或遇到其他会话相关的问题。

Nginx的Session共享主要解决以下几个问题:

  1. 单点登录(SSO):在单点登录系统中,用户只需要在一个地方登录,就可以访问所有与之关联的服务。Nginx通过Session共享,可以确保用户在不同服务之间的会话状态保持一致。
  2. 服务器集群:在服务器集群环境中,Nginx作为负载均衡器,将用户请求分发到不同的服务器上。如果每个服务器都独立维护Session,那么当用户请求被分发到不同的服务器时,可能会出现Session不一致的情况。通过Session共享,可以确保无论请求被分发到哪个服务器,用户都能保持一致的会话状态。

我们将使用Session共享存储:使用共享存储后端(如Redis、Memcached等)来存储Session数据。Nginx将用户的Session数据存储在共享存储中,并通过某种机制(如Session标识符)来关联用户的请求和Session数据。当用户请求到达不同的服务器时,这些服务器可以从共享存储中获取用户的Session数据,从而实现Session共享。

6.1 构建redis服务

redis安装-CSDN博客

6.2 服务器安装redis扩展

web主机上安装redis扩展

yum -y install phpredis-5.1.0-1.x86_64.rpm

6.3 服务器上部署Session共享

修改PHP-FPM配置文件,并重启服务

[root@web1 ~]# vim  /etc/php-fpm.d/www.conf          #修改该配置文件的两个参数
# 最后一页的部分内容,修改前效果如下:
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
# 修改后效果如下:
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://192.168.99.5:6379"
[root@web1 ~]# systemctl  restart  php-fpm
标签: nginx 服务器 前端

本文转载自: https://blog.csdn.net/2301_78183285/article/details/138911740
版权归原作者 我爱云计算 所有, 如有侵权,请联系我们删除。

“Nginx详解”的评论:

还没有评论