Nginx04-Nginx代理、反向代理实验、LNMP流程详解与排错思路

作者 : admin 本文共4553个字,预计阅读时间需要12分钟 发布时间: 2024-06-9 共1人阅读

目录

  • 写在前面
  • Nginx04
    • LNMP流程详解
      • Nginx处理静态资源流程
      • Nginx处理动态资源流程
    • LNMP排错
      • Linux
      • Nginx
      • PHP
      • Mysql
    • Nginx 代理
      • 概述
        • 正向代理
        • 反向代理
        • 区别
      • 反向代理实验(Proxy模块)
        • 环境准备
        • front配置
        • lb01配置
        • 测试
        • 流程梳理
        • 总结

写在前面

这是Nginx第四篇,内容为LNMP流程详解、排错思路、Nginx代理等。
上篇笔记 Nginx03-动态资源和LNMP介绍与实验、自动索引模块、基础认证模块、状态模块

Nginx04

LNMP流程详解

Nginx处理静态资源流程

  • 用户与服务端的端口进行连接,报文携带请求方法请求页面http协议host等信息
  • 服务端接收到请求,到nginx先匹配http区域(nginx主配置文件)
  • 根据用户请求的域名和配置文件的server_name进行匹配,匹配到了对应的域名,根据对应域名的配置进行处理(子配置文件
  • 根据用户请求的页面uri,结合站点目录,寻找到对应的文件,返回给客户端
  • 返回的报文携带http响应码请求文件等信息

Nginx处理动态资源流程

  • 用户与服务端的端口进行连接,报文携带请求方法请求页面http协议host等信息
  • 服务端接收到请求,到nginx后先匹配http区域(nginx主配置文件)
  • 根据用户请求的域名和配置文件的server_name进行匹配,匹配到了对应的域名,根据对应域名的配置进行处理(子配置文件
  • 根据用户请求的页面uri,发现是动态资源(location ~* .php$),nginx将该请求交由php-fpm处理,传递的是该文件绝对路径
    – fastcgi_pass 127.0.0.1:9000; 将请求传递给本机的哪个服务处理(php-fpm监听9000
    – fastcgi_index index.php;
    – fastcgi_param SCRIPT_FILENAME

    d

    o

    c

    u

    m

    e

    n

    t

    r

    o

    o

    t

    document_root

    documentrootfastcgi_script_name; 设置变量,$document_root是location中的root部分、$fastcgi_script_name是请求的文件uri
    – include fastcgi_params;

  • php-fpm进程根据收到的SCRIPT_FILENAME进行处理,将处理结果传回给nginx
  • nginx将php的结果通过响应报文传回给用户
  • 返回的报文携带http响应码请求文件等信息

LNMP排错

Linux

  • 检查防火墙
  • 检查selinux

Nginx

  • 检查端口ss -tunlp | grep nginx
  • 检查进程ps -ef | grep nginx
  • 检查配置nginx.conf conf.d/*.conf
  • 创建测试目录后curl测试

PHP

  • 创建测试文件
//站点目录下(root指定的路径)
cat testinfo.php
<?php
        phpinfo();
?>
  • 访问测试文件
    Nginx04-Nginx代理、反向代理实验、LNMP流程详解与排错思路插图

注意:这个测试文件会记录很多信息,不能泄露,测试完即删除

Mysql

  1. mysql -u用户 -p密码 -h 数据库ip
  2. 书写页面测试php
<?php
//
数据库地址
$db_host='192.168.100.152';
//
数据库用户名
$db_user='test';
$db_pass='test';
//
数据库名字
$db_name='test';
$link_id=mysqli_connect($db_host,$db_user,$db_pass,$db_name);
if($link_id){
 echo "successful by oldboy lidao996! 库名字:$db_name 库用户:$db_user 库密码:$db_pass" ;
}else{
 echo "connection failed! 库名字:$db_name 库用户:$db_user 库密码:$db_pass" ;
}
?>
# nginx子配置文件
location ~* (testinfo|testmysq).php$ {
   allow 192.168.100.0/24;
   deny all; #仅允许内网访问
   fastcgi_pass 127.0.0.1:9000; 
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   include fastcgi_params;
}

Nginx 代理

概述

官网的文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

正向代理

正向代理代表客户端向服务器发送请求。它通常位于客户端和互联网之间,帮助客户端访问受限资源或提高访问效率。类似跳板机的功能,转发流量。

  • 应用
    – 突破网络访问限制
    – 加速数据传输
    – 隐藏客户端真实IP地址

  • 举例
    – 网络加速
    – 私有代理服务器

反向代理

反向代理代表服务器接收来自客户端的请求。它通常位于服务器和互联网之间,帮助服务器管理和分配客户端请求,提高服务器安全性和效率。有点类似防火墙的功能,隔离内外。

  • 应用
    – 负载均衡
    – SSL加密和解密
    – 防止DDoS攻击

  • 举例
    – Nginx
    – Apache Traffic Server
    – AWS CloudFront

区别
特征正向代理反向代理
代理对象客户端服务器
位置客户端和互联网之间服务器和互联网之间
功能帮助客户端访问互联网帮助服务器管理和分配客户端请求
安全性隐藏客户端真实IP地址保护服务器免受恶意攻击
应用场景突破网络访问限制、加速数据传输负载均衡、SSL加密和解密、防止DDoS攻击
常见实现技术网络加速、私有代理服务器Nginx、Apache Traffic Server、AWS CloudFront

反向代理实验(Proxy模块)

环境准备
role    主机名
-------------
proxy   lb01
web     front

域名:proxy.test.com
index:/app/code/proxy/index.html

所需nginx模块:
location模块    虚拟站点
proxy模块   代理
upstream模块    负载均衡
front配置
  1. 子配置文件和站点文件
[root@front conf.d]# cat proxy.test.com.conf
server {
        listen 80;
        server_name proxy.test.com;
        root /app/code/proxy;
        error_log /var/log/nginx/proxy-error.log notice;
        access_log /var/log/nginx/proxy-access.log main;

        location / {
                index index.html;
        }
}
[root@front conf.d]# mkdir -p /app/code/proxy
[root@front conf.d]# echo proxy > /app/code/proxy/index.html

lb01配置
  1. 安装nginx
[root@lb01 ~]# 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@lb01 ~]# yum install -y nginx

[root@lb01 ~]# nginx -v
nginx version: nginx/1.26.1

  1. 创建子配置文件
[root@lb01 conf.d]# cat proxy.test.com.conf
#lb01
server {
        listen 80;
        server_name proxy.test.com;
        # 不用写站点目录
        error_log /var/log/nginx/proxy-error.log notice;
        access_log /var/log/nginx/proxy-access.log main;

        location / {
                #收到的所有uri转发给192.168.100.148
                proxy_pass http://192.168.100.148:80;

                #proxy_set_header 请求头字段 内容(变量)
                #转发proxy时,保留host头
                proxy_set_header Host $http_host;
                #转发proxy时,保留用户的真实ip
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
测试
# 测试 访问的是lb01的ip
[root@lb01 conf.d]# curl -H Host:proxy.test.com http://192.168.100.153
proxy
流程梳理
  • 客户端访问proxy.test.com,访问的ip是lb01的ip

  • lb01收到用户发来的请求头,匹配子配置文件中的location,根据proxy模块转发到front主机

  • lb01在转发时,根据proxy模块的设置proxy_set_header Host,将host也保留转发到front
    – 报头可以携带X-Forwarded-For这个内容。这个内容不写默认传递是lb01ip,但可以通过proxy模块修改为用户的真实ipproxy_set_header X-Forwarded-For
    – 这个字段可以用两个变量:
    $remote_addr 是客户端ip
    $proxy_add_x_forwarded_for 是记录每个代理的ip,用于多层代理,类似多个$remote_addr

  • front收到请求后,匹配对应子配置文件,访问到站点目录的index.html,放回结果给lb01

  • lb01 收到结果后,再次转发给用户。

  • 整个请求过程,是两次http请求两次http响应

  • 不添加x_forwarded_for

[root@front conf.d]# cat /var/log/nginx/proxy-access.log
192.168.100.148 - - [09/Jun/2024:11:02:48 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.61.1" "-"

Nginx04-Nginx代理、反向代理实验、LNMP流程详解与排错思路插图(1)

  • 添加 x_forwarded_for
[root@front conf.d]# cat /var/log/nginx/proxy-access.log
192.168.100.153 - - [09/Jun/2024:17:05:30 +0800] "GET / HTTP/1.0" 200 6 "-" "curl/7.65.0" "192.168.100.1"

Nginx04-Nginx代理、反向代理实验、LNMP流程详解与排错思路插图(2)

总结
  • 生产中建议proxy模块指定以下参数:
proxy_pass              服务端ip url如http://192.168.100.148:80
proxy_set_header        Host            $http_host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
本站无任何商业行为
个人在线分享 » Nginx04-Nginx代理、反向代理实验、LNMP流程详解与排错思路
E-->