Nginx 反向代理

介绍

Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应

作为负载均衡服务器 :Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

方便卸载并发,延迟处理,SSL(安全套接字层),静态内容,压缩和缓存,连接和请求限制所需的关键功能,甚至可以从应用程序中传输HTTP媒体流层到更有效的Web服务器层

Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器 ,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。

常使用:

Web服务器:Nginx 首先是一个 Web 服务器,用于托管网站内容,包括静态内容(如 HTML 文件、图片等)和动态内容(通过代理到后端应用服务器)。

反向代理:Nginx 常用作反向代理服务器,它可以接收来自 Internet 的请求并转发到内部网络的后端服务器(如应用服务器、API 服务器等),然后将响应返回给客户端。这个过程包括负载均衡、SSL 终止、缓存、压缩等优化响应的功能。

内容缓存:Nginx 可以缓存后端服务器的响应,减少对后端服务器的请求,提高响应速度。

负载均衡:Nginx 可以在多个后端服务器之间分配请求,提高网站的可用性和响应速度。

Nginx 主要工作在应用层 ,提供 HTTP 相关的服务,而 NAT 主要工作在网络层,处理 IP 地址的映射和转换。

安装

ubuntu安装:

bash 复制代码
sudo apt install nginx
sudo systemctl status nginx

相关重要文件位置

直接输入whereis nginx

nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz

ubuntu安装位置:

安装后的目录结构为:

所有的配置文件都在/etc/nginx下 ,虚拟主机在/etc/nginx/sites-available

程序文件在/usr/sbin/nginx

日志放在了/var/log/nginx

并已经在/etc/init.d/下创建了启动脚本nginx

默认的虚拟主机的目录设置在了/var/www/html

修改完nginx.conf文件后:

bash 复制代码
/etc/nginx/nginx.conf

sudo nginx -t
sudo systemctl reload nginx 

nginx -s signal

bash 复制代码
信号的值可以是以下之一:

- `quit` -- 正常地关闭
- `reload` -- 重新加载配置文件
- `reopen` -- 重新打开日志文件
- `stop` -- 立即关闭(快速关闭)

命令解释

bash 复制代码
user root;

这条指令设定了 Nginx 工作进程运行的用户身份。在这里,user root 指的是 Nginx 的工作进程将以 root 用户的权限运行。

运行 Nginx 作为 root用户通常不推荐,特别是在生产环境中,因为这会增加安全风险。如果工作进程受到攻击,攻击者可能会获得 root 用户的完全系统访问权限。

bash 复制代码
worker_processes auto;

worker_processes指定了 Nginx 将启动多少个工作进程来处理请求。设置为 auto表示 Nginx 将自动根据可用的 CPU 核心数量来启动相应数量的工作进程。

这个设置是优化性能的关键,因为它允许 Nginx 平行处理更多的连接和请求。

bash 复制代码
 error_log /var/log/nginx/error.log;

这个指令指定了 Nginx 的错误日志文件的位置。在这里,所有的错误信息将被记录到 /var/log/nginx/error.log。

错误日志对于诊断和解决运行时问题非常重要,因为它提供了关于服务器错误和配置问题的详细信息。

bash 复制代码
 pid /run/nginx.pid;

这条指令设置了 Nginx 主进程的 PID(进程标识符)文件的存放路径。这个文件包含了 Nginx 主进程的进程号。

PID 文件通常用于脚本控制,如启动、停止和重启服务。通过读取这个文件中的进程号,管理脚本可以准确地发送信号到 Nginx 主进程。

events块设置影响 Nginx 的网络连接处理。其中的 worker_connections 指令指定了每个 worker 进程允许的最大同时打开的连接数。这个数字不直接对应于用户数,而是指单个工作进程可以同时处理的网络连接的数量。这里是配置的详细解释:

bash 复制代码
worker_connections 1024;
  • 1024 是这个指令设定的值,意味着每个工作进程可以同时管理最多 1024 个连接。这包括来自客户端的请求连接以及到上游服务器的连接(如果 Nginx 用作反向代理)。

用户连接数与 worker_connections 的关系:

连接数:一个用户可能会打开多个连接到服务器(例如,浏览一个 HTTPS 网页通常会开启多个 TCP 连接来加载页面上的资源)。因此,worker_connections的数值并不直接等于服务的最大用户数。

多进程:Nginx 通常配置为多进程运行(由 worker_processes 指令控制)。如果你的服务器配置了多个 worker 进程(例如,设置为 auto 或指定一个数值),总的可处理连接数将是单个进程的 worker_connections 值乘以进程数。

总体性能影响:

性能与资源:worker_connections 的最优设置依赖于服务器的硬件资源(如 CPU 和内存)、网络环境和具体的负载类型。过高的值可能会使系统资源耗尽,而过低的值可能会导致未充分利用系统资源。

配置示例:如果你的服务器配置了 worker_processes 4;并且每个进程的 worker_connections设置为 1024,那么你的服务器总共可以处理 4 × 1024 = 4096 个同时打开的连接。

http { ... } 块用于封装所有与 HTTP 相关的配置指令。这个块是 Nginx 处理 HTTP 请求的核心配置区域,其中可以包括服务器的监听设置、位置块(location)、MIME 类型定义、日志定义、以及其他与 HTTP 服务相关的多种指令。

【MIME 类型:(多用途互联网邮件扩展类型,MIME standing for Multipurpose Internet Mail Extensions)是一种标准,用来描述文件的内容类型 。这种类型标准在互联网上发送文件或数据时非常关键,因为它告诉接收系统或软件如何处理传入的数据。最初设计用于电子邮件系统,但后来在 HTTP 传输中也被广泛使用来描述网页中传输的数据类型。类型(Type):这是更广泛的类别,如 text、image、video、application 等。子类型(Subtype):这是在类型内部进一步定义数据的具体格式,例如 text/plain、text/html、image/jpeg、application/json 等】

bash 复制代码
log_format main '$remote_addr - $remote_user [$time_local] "$request" '$status $body_bytes_sent "$http_referer" '"$http_user_agent" "$http_x_forwarded_for"';
  • 这条指令定义了一个名为 main的日志格式。它指定了 Nginx 如何记录访问日志的每一条记录的格式:
    • $remote_addr:客户端的 IP 地址。
    • $remote_user:如果使用 HTTP 基本认证,这里是认证的用户名。
    • $time_local:访问时间和时区。
    • $request:客户端的请求行。
    • $status:请求返回的状态码。
    • $body_bytes_sent:发送给客户端的字节数,不包括响应头。
    • $http_referer:引用页面。
    • $http_user_agent:客户端的用户代理。
    • $http_x_forwarded_for:代理服务器传递的原始客户端 IP。

样例nginx.conf

bash 复制代码
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    server {
        listen 80;
        server_name www.yourdomain.cn;
        return 301 https://test.yourdomain.cn;
    }

    server {
        listen 443;
        server_name www.yourdomain.cn;
        ssl_certificate /etc/nginx/ssl/yourdomaincn.crt;
        ssl_certificate_key /etc/nginx/ssl/yourdomaincn-private.key;
        return 301 https://test.yourdomain.cn;
    }

    server {
        listen 80;
        server_name test.yourdomain.cn;
        return 301 https://yourdomain.cn$request_uri;
    }

    server {
        listen 80;
        listen [::]:80;
        server_name _;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name test.yourdomain.cn;
        ssl_certificate /etc/nginx/ssl/yourdomaincn.crt;
        ssl_certificate_key /etc/nginx/ssl/yourdomaincn-private.key;
        gzip on;
        gzip_proxied any;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_comp_level 1;

        location / {
            proxy_pass http://localhost:3008;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }


    }


    server {
        listen 443 ssl;
        server_name testback.yourdomain.cn;
        ssl_certificate /etc/nginx/ssl/yourdomaincn.crt;
        ssl_certificate_key /etc/nginx/ssl/yourdomaincn-private.key;
        gzip on;
        gzip_proxied any;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_comp_level 1;

        location /static/ {
            alias /home/syner/project/e-choice-backend/static/;
        }


        location ~* ^/media/(.+\.(jpg|jpeg|png|webp|svg|gif))$ {
            alias /home/syner/project/e-choice-backend/media/$1;
        }



        location / {
            proxy_pass http://localhost:8005;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_buffering off;
            proxy_http_version 1.1;
            proxy_set_header Connection "";

            proxy_read_timeout 300s;
            proxy_connect_timeout 300s;
            proxy_send_timeout 300s;

            client_max_body_size 101M;
        }
    }

    server {
        listen 443 ssl;
        server_name yourdomain.cn;
        ssl_certificate /etc/nginx/ssl/yourdomaincn.crt;
        ssl_certificate_key /etc/nginx/ssl/yourdomaincn-private.key;
        gzip on;
        gzip_proxied any;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_comp_level 1;

        location / {
            proxy_pass http://localhost:8898;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }


    }
}

域名与证书的配置:

bash 复制代码
1. 购买Https证书,下载

2. 将形如 XXXX.crt, xxxxx.crt 的文件传到服务器上某个临时文件夹

3. 将私钥 generated-private-key.txt 传到服务器上临时文件夹

4. 使用以下命令,将两个证书文件合并
cat XXXX.crt XXXX.crt >> XXXX.crt

5. 将 generated-private-key.txt 重命名为 XXXXcrt.key

6. 使用以下命令检查文件开头是否包含 utf8 BOM
file XXXXcrt.key

7. 如果文件包含 utf8 BOM,使用以下命令去除
sudo sed -i '1s/^\xEF\xBB\xBF//' XXXXcrt.key

8. 将 XXXXcrt.key,XXXX.crt 拷贝到 **/etc/nginx/ssl** 文件夹下

9. 使用ll命令检查文件所有权,如果是root,则需要运行以下命令修改所有权
sudo chown nginx:nginx /etc/nginx/ssl/XXXX.crt
sudo chown nginx:nginx /etc/nginx/ssl/XXXXcrt.key

10. 使用如下命令修改私钥权限
sudo chmod 600 XXXXcrt.key
相关推荐
学Linux的语莫3 分钟前
搭建服务器VPN,Linux客户端连接WireGuard,Windows客户端连接WireGuard
linux·运维·服务器
黑牛先生10 分钟前
【Linux】进程-PCB
linux·运维·服务器
Karoku06616 分钟前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
打码人的日常分享2 小时前
商用密码应用安全性评估,密评整体方案,密评管理测评要求和指南,运维文档,软件项目安全设计相关文档合集(Word原件)
运维·安全·web安全·系统安全·规格说明书
追风赶月、3 小时前
【Linux】线程概念与线程控制
linux·运维·服务器
CP-DD3 小时前
Docker 容器化开发 应用
运维·docker·容器
努力的悟空4 小时前
国土变更调查拓扑错误自动化修复工具的研究
运维·自动化
周末不下雨5 小时前
win11+ubuntu22.04双系统 | 联想 24 y7000p | ubuntu 22.04 | 把ubuntu系统装到1T的移动固态硬盘上!!!
linux·运维·ubuntu
耗同学一米八6 小时前
2024 年河北省职业院校技能大赛网络建设与运维赛项样题四
运维·网络