当前位置:首页 » 《随便一记》 » 正文

Nginx详解

2 人参与  2024年10月14日 14:40  分类 : 《随便一记》  评论

点击全文阅读


 目录

一、nginx安装

1.1 环境准备

 1.2 安装nginx

1.3 nginx基本使用

1.4  使用systemd管理Nginx服务

1.5 Nginx配置文件

1.5.1 第一部分:全局块

1.5.2 第二部分:events块

1.5.3 第三部分

二、HTTPS加密网站

2.1 修改Nginx配置文件

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

2.3 重新加载配置

三、nginx地址重写

3.1 地址重写的选项

3.2 简单地址重写

3.3 不同网站跳转

3.4 if判断

3.4.1 基本语法

四、nginx反向代理

4.1 部署实施后端Web服务器

4.2 配置Nginx服务器

4.3 设置权重

4.4 设置健康检查

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

4.6 添加down标记

五、Nginx优化

5.1 自定义报错页面

5.2 查看服务器状态信息

5.3 优化Nginx并发量

5.4 优化Nginx数据包头缓存

六、Session共享

6.1 构建redis服务

6.2 服务器安装redis扩展

6.3 服务器上部署Session共享


        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/

# 下载nginxwget https://nginx.org/download/nginx-1.22.1.tar.gz# 解压tar xvf nginx-1.22.1.tar.gzcd 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 serviceAfter=network.target remote-fs.target nss-lookup.target [Service]Type=forkingExecStart=/usr/local/nginx/sbin/nginxExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s stopPrivateTmp=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 []:dc@dc.com     电子邮件

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.confupstream 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.confupstream 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.confupstream 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.confupstream 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/statusActive 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/bashURL=http://192.168.99.5/index.html?for i in {1..5000}do    URL=${URL}v$i=$idonecurl $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共享主要解决以下几个问题:

单点登录(SSO):在单点登录系统中,用户只需要在一个地方登录,就可以访问所有与之关联的服务。Nginx通过Session共享,可以确保用户在不同服务之间的会话状态保持一致。

服务器集群:在服务器集群环境中,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] = filesphp_value[session.save_path] = /var/lib/php/session# 修改后效果如下:php_value[session.save_handler] = redisphp_value[session.save_path] = "tcp://192.168.99.5:6379"[root@web1 ~]# systemctl  restart  php-fpm

点击全文阅读


本文链接:http://zhangshiyu.com/post/171697.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1