【nginx集群】web应用服务器

发布于:2025-08-08 ⋅ 阅读:(17) ⋅ 点赞:(0)

Nginx安装及基础配置

  • 版本选择:Mainline(奇数版本,开发版)、Stable(偶数版本,稳定版)、Legacy(旧稳定版)。源码编译安装优于yum,可自定义路径与功能模块。
  • 依赖环境:需GCC编译器、Automake工具,以及pcre(正则支持)、zlib(gzip压缩)、openssl(HTTPS支持)等第三方库。
  • 目录结构
    • conf/:存放核心配置文件nginx.conf
    • html/:默认Web文件及错误页面。
    • logs/:访问日志与错误日志。
    • sbin/:Nginx可执行文件。

Nginx架构与进程模型

  • 进程分工
    • Master进程:管理Worker进程、加载配置、监听端口。
    • Worker进程:处理客户端请求,竞争连接(epoll模型)。
  • 通信机制:Master通过管道与Worker通信,Worker间通过共享内存交换数据。

核心配置

  • 配置文件结构
    • main:全局配置(用户、进程数、日志等)。
    • events:连接处理模型(如use epoll)。
    • http:HTTP协议相关(MIME类型、虚拟主机等)。
  • 虚拟主机:通过server块配置,支持基于IP、端口、域名的区分。
  • Location匹配
    • =:精确匹配。
    • ~:正则匹配(区分大小写)。
    • ^~:前缀优先匹配。

Nginx安装与基础配置

这里先把nginx24版的文件下好了直接拖进/mnt/目录

安装依赖包:

dnf install gcc pcre-devel zlib-devel openssl-devel -y

创建Nginx用户:

useradd -s /sbin/nologin -M nginx

解压并编译安装:

tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
[root@Nginx nginx-1.24.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@Nginx nginx-1.24.0]# make && make install

配置环境变量:

echo "export PATH=$PATH:/usr/local/nginx/sbin" >> ~/.bash_profile
source ~/.bash_profile

启动与管理服务:

可以直接使用 nginx 命令,因为你已将其路径加入环境变量

nginx  # 启动
nginx -s stop  # 停止
nginx -s reload  # 重新加载配置
验证 Nginx 运行状态
ps aux | grep nginx

此时curl - I localhost

应该会显示是nginx.1.24的版本 

版本更新

同样的,把26版本下载好后拖进来解析编译

[root@webserver nginx-1.26.1]# ./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

 26版本只需要make,就不必make install了,否则会冲突

检查语法有没有问题

如何让版本更新,覆盖掉24的进程?

Nginx服务管理配置

创建systemd服务文件:

vi /lib/systemd/system/nginx.service

服务文件内容:

[root@webserver system]# cat nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre:/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/sbin/nainx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s OUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

停止服务查看是不是正常关闭了,再重启

管理服务:

systemctl daemon-reload
systemctl start nginx
systemctl enable nginx

实现 nginx 高并发配置

Nginx核心配置
虚拟机关机,加cpu,再启动

修改配置文件:

vi /usr/local/nginx/conf/nginx.conf

核心配置:

nginx -s reload重启服务
ps aux | grep nginx查看正在运行的进程

下载依赖

系统限制配置:

vi /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

 文件虽然改了,但默认不生效,直接指定100000就行

现在就可以做压力测试了:

ab -c 5000 -n 10000 http://192.168.1.10/
或者 ab -c 5000 -n 10000 http://192.168.1.10/index.html

虚拟主机配置

新建一个pc web站点

创建配置文件目录:

mkdir -p /usr/local/nginx/conf.d/

创建虚拟主机配置:

vi /usr/local/nginx/conf.d/vhosts.conf

配置内容:

server {
    listen 80;
    server_name www.timinglee.org;
    root /web/html;
    index index.html;
}

主配置文件引入:

创建默认访问目录,往前端测试页面写东西 

配置hosts解析:

vi /etc/hosts
192.168.1.10 webservera.timinglee.org www.timinglee.org

重启服务,访问测试

账户认证功能

当你输入密码和命令才能访问,否则访问不了,怎么设置

Nginx账户认证功能

命令:

-c 创建

m 文件

安装httpd-tools:

dnf install httpd-tools -y

创建认证文件:

#不想被别人看见可以在htpasswd前面加" . ",表示隐藏

htpasswd -cm /usr/local/nginx/.htpasswd admin
htpasswd -m /usr/local/nginx/.htpasswd lee

配置认证:

vi /usr/local/nginx/conf.d/vhosts.conf

location /login/ {
    root /web/;
    index index.html;
    auth_basic "Please input username and password";
    auth_basic_user_file /usr/local/nginx/.htpasswd;
}

验证时没有输入名字访问会被拒绝,需要加上名字

 在浏览器验证访问时需要做解析

 做实验的时候做curl就可以了

自定义错误页面同时指定响应状态码

创建错误页面目录和文件:

mkdir /web/errorpage
echo "出错误了" > /web/errorpage/error.html

默认情况下出错是这个页面,当你指定后出错就会跳到你指定的页面上

配置错误页面

注意!:error_page参数中所有字符串只能用空格来分割。并且空格个数只能为1

error_page 500 502 503 504 404 /errorpage/error.html;
location /errorpage {
    root /web/;
}

nginx -t检验内容有无问题

故意输错访问页面

指定错误日志

 检测文件是否存在

长链接

长连接(Keep-Alive)是指在一个 TCP 连接上可以连续发送多个数据包,在发送完成后保持连接状态,而不是在每次发送数据后都关闭连接。这种方式减少了 TCP 连接建立和关闭的开销,在处理多个 HTTP 请求时可以显著提高性能,特别是对于频繁交互的 Web 应用。

长连接相关指令:
keepalive_timeout:超时时间。如果在超时时间内没有新的请求到达,连接将被关闭。
keepalive_requests:可以处理的最大请求数。当达到这个请求数后,连接将被关闭,客户端需要重新建立连接。


长连接的优缺点:
优点:减少 TCP 连接建立和关闭的开销,提高吞吐量,降低延迟。
缺点:长连接会占用服务器资源,如果长时间不释放,可能导致资源浪费。

 测试长连接

前面是实验时看到效果的配置,测试完成后修改为下图

下载服务器配置

Nginx 可以配置为下载服务器,允许用户通过 HTTP 协议下载文件。通过启用自动索引功能,用户可以浏览服务器上的文件目录,并选择下载文件。

        自动索引功能:

  • autoindex on;:启用自动索引功能,当请求的 URL 对应一个目录时,Nginx 会生成一个包含该目录下所有文件的列表页面。
  • autoindex_localtime on;:显示文件的本地时间。
  • autoindex_exact_size off;:显示文件的大概大小(如 MB、GB)。
  • autoindex_format html;:指定索引页面的格式为 HTML。

        下载限速:

  • set $limit_rate 1024k;:设置下载速度限制为 1024KB/s。这个参数可以防止单个用户占用过多带宽,影响其他用户的体验。

实验原理
自动索引生成:当用户请求一个目录时,Nginx 会检查该目录是否存在,并生成一个包含目录下所有文件的 HTML 页面。这个页面显示文件名、大小、修改时间等信息,并提供下载链接。
限速实现:Nginx 通过$limit_rate变量来限制每个连接的下载速度。
静态文件处理:Nginx 作为静态文件服务器,直接处理文件下载请求,无需通过后端应用服务器,因此性能较高。
 

示例:实现下载站点

#注意:download不需要index.html文件

创建共享资源存放目录:

mkdir /web/download

建立实验素材

配置下载服务:

        创建一个location块,启用自动索引功能,并设置限速参数。

vi  

location /download/ {
    root /web/;
    autoindex on;
    autoindex_localtime on;
    autoindex_exact_size off;
    autoindex_format html;
    set $limit_rate 1024k;
}

#重启Nginx并访问测试下载页面 
使用浏览器或下载工具访问该目录,检查是否可以浏览文件列表并下载文件。
检查下载速度是否符合限速设置测试下载功能:
在服务器上创建一个测试目录,并添加一些文件。
使用浏览器或下载工具访问该目录,检查是否可以浏览文件列表并下载文件。
检查下载速度是否符合限速设置

nginx状态页

在子配置文件中加入状态页location

配置 Nginx 压缩功能

在编辑Nginx 主配置文件中启用 gzip 压缩功能,减少传输数据量,提升页面加载速度。

#参数说明
gzip on;
gzip_comp_level 4;       # 压缩级别(1-9,数值越高压缩率越大,但 CPU 消耗增加)
gzip_disable "MSIE [1-6]\.";  # 禁用旧版 IE 浏览器压缩
gzip_min_length 4k;      # 仅压缩大于 4KB 的文件
gzip_vary on;            # 响应头添加 Vary: Accept-Encoding
gzip_static on;          # 优先使用预压缩文件(如 .gz)

为了方便实验改为4k

文件内存大于4k就会被压缩

接下来查看文件内存,日志里面内存比较多,超过之后可以复制到我们需要测试的big.html文件中,让文件内存大于4k

如果日志文件内存较少,可以多运行几次日志

查看有没有成功,内存有没有增加
[root@webserver nginx]# du -sh /usr/local/nginx/html/big.html
有时候复制日志时候日志内容可能被清空了,所以复制后big.html内存没有任何增加
这个时候可以选择手动输入
[root@webserver conf.d]#  cp /usr/local/nginx/logs/timinglee.org.access /usr/local/nginx/html/
[root@webserver conf.d]# echo hello > /usr/local/nginx/html/small.html
[root@webserver conf.d]# cp /usr/local/nginx/logs/timinglee.org.access /usr/local/nginx/html/big.html

-head:只请求HTTP头信息(HEAD方法)

--compressed:请求压缩内容

测试压缩效果:

curl --head --compressed http://192.168.1.10/big.html

另一个文件没有大于4K,所以不会压缩,通过-v可以查看里面写了什么


nginx Reweite环境

rewritenginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能

作用主要有:

  • 美化与跳转 URL:让复杂 URL 变简洁易记,网站结构变化时实现平滑跳转。
  • 流量分配与负载均衡:按条件转发请求,实现简单流量分配和负载均衡。
  • 安全防护:隐藏真实路径,拦截恶意请求,降低安全风险。
  • 访问控制:依据用户身份或来源限制访问,管理权限。
  • 优化体验:强制 HTTPS 加密,自动切换语言版本,提升用户体验。 

解析源码

make&&make install编译并安装

 

    配置常用内置变量 

    server { 
    listen 80; 
    server_name lee.timinglee.org; 
    root /webdata/nginx/timinglee.org/lee; 
    location /var { 
    default_type text/html; 
            echo $uri;
            echo $remote_addr;
            echo $args;
            echo $is_args;
            echo $document_root;
            echo $document_uri;
            echo $host;
            echo $remote_port;
            echo $remote_user;
            echo $request_method;
            echo $request_uri;
            echo $request_filename;
            echo $http_user_agent;
            echo $server_addr;
            echo $server_name;
            echo $server_port;
            echo $scheme;
            echo $server_protocol;
            echo $http_cookie;
            echo $cookie_key1;
            echo $http_HOST;
            echo $arg_name;
        } 
    } 

    访问时就会输出相应的内置变量对应的文件/地址/域名 

    Rewrite 重写规则

    通过正则表达式修改 URL,实现重定向或伪静态。

    域名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳
    转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存。
    • redirect;

    #临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端

    #由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302

    • permanent;

    #重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端

    #由客户端重新发起请求,状态码:301

    # 临时重定向(302)
    location /test {  
        rewrite ^/test http://www.timinglee.org redirect;  
    }
    
    # 永久重定向(301)  
    location /aaa {  
        rewrite ^/aaa http://www.timinglee.org permanent;  
    }
    
    # 文件不存在时重定向  
    location / {  
        if (!-e $request_filename) {  
            rewrite /(.*) https://$host/index.html;  
        }  
    }
    

    默认不能显示重启后的页面

    要访问得加上-L

     

    break和last区别案例

            在 Nginx 中,break和last指令都用于对请求进行控制,但它们存在多方面区别:

           作用域与执行流程
           
     break:仅在当前location作用域内生效,当break指令被执行后,会立即中断当前location内后续由ngx_http_rewrite_module模块相关指令(比如rewrite)的执行 ,但不会影响其他location的匹配。如果后续还有其他模块指令,依然会继续执行。例如:
     

    nginx
    location /test {
        rewrite ^/test /new_url break;
        echo "This won't be executed if rewrite is triggered"; 
    }

    上述示例中,当rewrite规则触发,break指令执行,echo指令就不会被执行。


            last:不仅会终止当前location中ngx_http_rewrite_module模块后续指令的执行,还会重新发起一次新的location匹配查找。也就是说,执行last后,Nginx 会停止当前location内后续的重写操作,并根据修改后的 URI,从server块的location配置中重新寻找匹配的location 。示例如下:

    nginx
    location /test {
        rewrite ^/test /new_location last;
        echo "This won't be executed if rewrite is triggered"; 
    }
    location /new_location {
        return 200 "New location reached"; 
    }

    这里rewrite触发last后,Nginx 会重新匹配location,进而执行/new_location对应的配置。

    创建测试用例到默认目录中

     修改文件

    做重定向后

    访问TT时候重定向到test1,test1又重定向到lee页面

    主要就是修改名字和重定向,看访问出来的是哪一个文件,以及我们要重定向到哪一个文件怎么设置

    last和break的区别案例

    完整页面重定向对比


    全栈加密

    全栈加密是指在系统或应用程序的各个环节,包括数据传输、存储、处理等层面都采用加密技术,以保障数据安全。

    • 传输加密:用 HTTPS 协议(基于 SSL/TLS)建立安全连接,确保数据传输过程加密。
    • 存储加密:对数据库、文件系统中的数据加密,防止存储介质被攻击时数据泄露。
    • 应用层加密:代码中对敏感数据加密处理,API 交互时加密数据。
    • 客户端加密:浏览器或移动客户端对数据加密后再传输。
    • 密钥管理:妥善管理加密密钥的生成、存储等全周期,保障加密有效性。

    全站加密实验旨在实现所有 HTTP 请求强制跳转至 HTTPS,确保客户端与服务器的通信全程加密。

    基本配置

    1. 生成自签名证书(测试用1.):

    openssl req -newkey rsa:2048 -nodes -sha256 \
        -keyout /usr/local/nginx/certs/timinglee.org.key \
        -x509 -days 365 -out /usr/local/nginx/certs/timinglee.org.crt
    

    2. https的基本配置

    Nginx 配置示例:

    server{
        listen  80;
        listen  443 ssl;
        server_name  www.timinglee.org;
        root    /web/html;
        index   index.html;
        error_page 500 502 503 504 404 /errorpage/error.html;
        error_log  /usr/local/nginx/logs/timinglee.org.err;
        access_log /usr/local/nginx/logs/timinglee.org.access;
        ssl_certificate /usr/local/nginx/certs/timinglee.org.crt;
        ssl_certificate_key /usr/local/nginx/certs/timinglee.org.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout 5m;
        ssl_ciphers HIGH:!aNULL:!MD5;

    强制 HTTP 跳转到 HTTPS:

    增加一行location

    location / {  
        if ($scheme = http) {  
            rewrite /(.*) https://$host/$1; 
        }  
    }
    

    3. 验证并重启 Nginx

    检查配置文件语法是否正确:

    nginx -t
    nginx -s reload
    测试全站加密效果

    • 浏览器访问 http://www.timinglee.org(你的域名),观察是否自动跳转至 https:// 版本。

    注意:!实验完记得把把全站加密的删掉,以防我们做其他的实验有影响


    当我们访问一个不存在的站点,应是404

    如果客户要一个网页,我们没有,直接说没有,客户下次可能就不来了

    那我们要如何处理一个不存在的文件呢?可以把它重定义成主站点,让客户可以转到这里

    #是一个临时的,因为只有文件不存在时才转

    防盗链配置

    理解盗链机制
    盗链是指其他网站直接链接并使用你的服务器上的资源(如图片、视频、文件等),而不经过你的网页。这会消耗你的服务器带宽和资源,导致额外成本。

    如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗

    链,referer就是之前的那个网站域名(用什么途径访问的)

    那我们肯定不能让别人随意的动用我们的资源,怎么办呢?

    识别盗链的关键因素

    • 请求头中的 Referer 字段会显示资源请求的来源域名。
    • 直接访问或合法来源的请求会有预期的 Referer,而盗链请求通常来自外部域名。

    其实每个用户/盗链者访问时都是有域名来源的,如果用户通过盗链的网页打开我们网站的资源,也会有显示

    解决方法:限制资源仅允许特定来源访问

    通过检查 Referer 字段来阻止非授权域名的访问

    实验配置

    新建一台服务器RS1:192.168.1.20

    停止防火墙,永久关闭

    要一个解析不然访问不了

    添加域名

    vi /etc/hosts
    
    192.168.1.20  lee.timinglee.org

    写一个网页,调用了网站上的一个图片

    增加一个盗链目录

    这样就可以盗用别人网页的图片链接

    首先,可以查看客户是通过什么途径访问的

    访问www.timinglee.org时日志有记录

    当你访问网站时,控制你的访问流量从哪过来

    如果你的referer值为空,可以直接访问

    如果无效时,重定向到盗链页面

    一般情况下,直接把无效referer限制不让访问就好了


    反向代理与负载均衡

    两台服务器RS1,RS2 

    [root@RS1 ~]# dnf install httpd -y
    [root@RS1 ~]# vi /etc/hosts
    [root@RS1 ~]# systemctl enable --now httpd
    Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
    [root@RS1 ~]# echo 192.168.1.20 > /var/www/html/index.html
    [root@RS1 ~]# mkdir /var/www/html/static/
    [root@RS1 ~]# echo 192.168.1.20 static > /var/www/html/static/index.html

    添加域名(两个都要)

     关闭火墙 (两个都要)

    下载服务httpd,php

    
    [root@RS2 ~]# dnf install php -y
    
    [root@RS2 ~]# dnf install httpd -y

    启动服务(两个都要)

    在 Linux 系统中,PHP 通常不是以php.service的名称运行的,而是作为 Apache(httpd)的模块运行

    Mkdir /var/www/html/php/
    Vi /var/www/html/php/index.php

     

    Web服务器配置:反向代理隐藏后端服务器:

    之前的全删了

    记得每次修改后都要重启服务

    当访问一个本机没有的页面时,可以对后端进行合理调度,转到其他服务器页面

    负载均衡分配请求:

    upstream webserver {  
        server 192.168.1.20:80 weight=2;  
        server 192.168.1.30:80;  
        server 192.168.1.10:8888 backup;  # 备份节点  
    }  
    location / {  
        proxy_pass http://webserver;  
    }
    


    反向代理缓存

    现在有三台,server192.168.1.10

    RS1  192.168.1.20

    RS2   192.168.1.30

    增加10的域名解析

    搞缓存看一下

    缓存功能默认关闭状态,需要先动配置才能启用

    先写入主配置文件,创建缓存目录

    目录会自动生成

    缓存静态资源减轻后端压力:

     proxy_cache_path /usr/local/nginx/cache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_size=10g;
    

    再进入

    server{
        listen  80;
    
        server_name  www.timinglee.org;
    
        location /{
             proxy_pass http://www.lee.org;
             proxy_cache  proxycache;
             proxy_cache_key $request uri;
             proxy_cache_valid 200 302 10m;
             proxy_cache_valid 404 1m;
               }
        location ~ \.(php|jsp|js)$ {
             proxy_pass http://192.168.1.30:80;
       }


    Nginx 与 PHP-FPM 集成

    PHP 请求转发配置:

    location ~ \.php$ {  
        fastcgi_pass 127.0.0.1:9000;  
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
        include fastcgi_params;  
    }
    


    PHP 扩展(如 Memcache)

    安装 Memcache :

    前面我创建了一个fast_php目录,这里就直接把memcache文件拖进来了

    后续需要用到一些命令,不可以直接使用,需要/path/file/+命令,如图: 

    想直接使用某些命令是需要配置环境变量的

    编辑环境变量

    环境变量配置完后

    编译安装

    ./configure && make && make install

    如果此时这里只有一个包,说明安装不全

    ./configure --with-php-config=/usr/local/php/bin/php-config

    正常情况下

    启动 Memcached 服务:

    systemctl start memcached
    
    配置php加载memcache模块

    :wq退出保存

    /word搜索单词(word替换成你想搜的)

    :set nu显示行号

    部署模块

    端口一定是11211

    复制测试文件到默认发布目录中

     访问测试

    现在可以做访问测试了,但是因为前面做配置时我在默认发布目录/web/html/下创建了一个php目录,并创建了index.php页面,在访问页面时为了访问到index.php,默认发布目录是/web/html/php/,但实际我的默认访问目录是/web/html/,于是我将index.php转移到了主目录

    原配置:

    修改后的配置:

     此时就可以通过主目录访问页面了,不过此时我们是不知道登陆密码的,所以要进入配置文件修改

     可以看到用户名和密码

    可以改成自己喜欢的名字和密码

    登陆

    现在里面的使用率为0,因为我们还什么都没写

    那么现在我们往里面写入东西

    ​
    [root@webserver html]# ab -n 1000 -c50 www.timinglee.org/example.php
    

    全部写入失败率为0(有时候写入文件太多顾不过来就放弃了)

    浏览器页面刷新一下

    如果想重新测怎么办?只需要把这个服务重启,那么它的所有数据就会清零

    systemctl restart memcached.service


    网站公告

    今日签到

    点亮在社区的每一天
    去签到