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
相关推荐
一心0921 小时前
ubuntu 20.04.6 sudo 源码包在线升级到1.9.17p1
运维·ubuntu·sudo·漏洞升级
好好学习啊天天向上1 小时前
世上最全:ubuntu 上及天河超算上源码编译llvm遇到的坑,cmake,ninja完整过程
linux·运维·ubuntu·自动性能优化
你想考研啊2 小时前
三、jenkins使用tomcat部署项目
运维·tomcat·jenkins
代码老y2 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器
典学长编程3 小时前
Linux操作系统从入门到精通!第二天(命令行)
linux·运维·chrome
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
你想考研啊5 小时前
四、jenkins自动构建和设置邮箱
运维·jenkins
Code blocks5 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
饥饿的半导体6 小时前
Linux快速入门
linux·运维
还是奇怪8 小时前
Linux - 安全排查 2
linux·运维·安全