弄懂nginx看这一篇文章就够了

概述

Nginx(发音为“engine x”)是一款开源的、高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器。Nginx由伊戈尔·赛索耶夫(Igor Sysoev)于2004年首次公开发布,以其稳定性、丰富的功能集、简单的配置以及低资源消耗而闻名。

Nginx的主要用途包括但不限于:

  1. Web服务器:Nginx可以作为独立的Web服务器,处理来自客户端的HTTP请求,并返回相应的响应,如HTML页面、图片、样式表等。

  2. 反向代理:Nginx能够充当反向代理服务器,将客户端的请求转发到后端服务器群集中的一个或多个服务器上。这种机制有助于隐藏和保护后端服务器的真实地址,同时还可以实现负载均衡、缓存、SSL加密等功能。

  3. 负载均衡器:Nginx内置了强大的负载均衡功能,能够将客户端的请求智能地分发到后端服务器群集中的不同服务器上,以实现负载均衡,提高系统的整体性能和可靠性。

  4. HTTP缓存:Nginx可以配置为缓存服务器,缓存静态内容或动态内容的响应,以减少后端服务器的负载,加快客户端的访问速度。

  5. 安全功能:Nginx提供了多种安全功能,如SSL/TLS加密、访问控制、Web应用程序防火墙(WAF)等,以保护Web应用程序免受恶意攻击和数据泄露的威胁。

  6. 模块化设计:Nginx采用模块化设计,支持第三方模块的开发和扩展。这使得Nginx能够灵活地适应不同的应用场景和需求,并与其他软件和服务进行集成。

  7. 高并发处理能力:Nginx采用异步非阻塞的事件驱动模型,能够高效地处理大量的并发连接。这使得Nginx非常适合作为高并发的Web服务器或反向代理服务器。

  8. 轻量级和高效:与其他Web服务器相比,Nginx具有较低的内存占用和CPU消耗,能够在保证高性能的同时,降低系统的运行成本。

由于这些优点,Nginx在现代Web架构中得到了广泛的应用,成为许多大型网站和应用程序的首选服务器软件之一。

nginx安装

Nginx的安装可以通过多种方法完成,包括源码编译安装、使用包管理器(如yum)安装,以及通过Docker容器安装。以下是这几种安装方法的详细步骤:

一、源码编译安装

  1. 安装依赖

    • Nginx是用C语言编写的,因此需要安装GCC编译器。可以使用命令yum install -y gcc来安装。
    • Nginx在编译过程中还需要PCRE(Perl Compatible Regular Expressions)库、zlib库和OpenSSL库。这些库可以通过以下命令安装:
      yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel
      
  2. 下载Nginx源码

    • 访问Nginx官网下载页面(http://nginx.org/download/),找到需要的版本并下载。可以使用wget命令下载,如:
      wget http://nginx.org/download/nginx-版本号.tar.gz
      
  3. 解压源码并编译安装

    • 解压下载的Nginx源码包。
    • 进入解压后的目录,运行./configure脚本配置安装选项(如安装路径、模块等)。
    • 使用make命令编译源码。
    • 使用make install命令安装Nginx。
  4. 启动Nginx

    • 进入Nginx的安装目录(如/usr/local/nginx/sbin),运行./nginx命令启动Nginx服务。

二、使用yum安装

对于基于RPM的Linux发行版(如CentOS、Fedora等),可以使用yum包管理器来安装Nginx。

  1. 安装yum-utils(可选,但推荐):

    sudo yum install -y yum-utils
    
  2. 添加Nginx的yum仓库

    • 创建或编辑/etc/yum.repos.d/nginx.repo文件,添加Nginx的官方仓库。
    • 可以从Nginx官网获取仓库的URL和配置信息。
  3. 安装Nginx
    使用以下命令安装Nginx:

    yum install -y nginx
    
  4. 启动Nginx
    使用systemctl start nginx(对于systemd系统)或service nginx start(对于SysVinit系统)命令启动Nginx服务。

三、通过Docker安装

对于希望以容器化方式运行Nginx的用户,可以通过Docker来安装。

  1. 安装Docker

    • 如果系统中尚未安装Docker,需要先安装Docker。
  2. 拉取Nginx镜像
    使用docker pull nginx命令从Docker Hub拉取Nginx镜像。

  3. 启动Nginx容器
    使用docker run命令启动Nginx容器,并可以指定端口映射等参数。例如:

    docker run -d --name nginx -p 80:80 nginx
    
  4. 访问Nginx
    在浏览器中输入服务器的IP地址(或域名,如果配置了的话),即可访问Nginx的默认页面。

注意事项

  • 在安装Nginx之前,请确保系统已经更新到最新版本,以避免潜在的安全问题和兼容性问题。
  • 根据不同的安装方法和Linux发行版,安装步骤和命令可能会有所不同。请参考具体的官方文档或教程进行操作。
  • 安装完成后,建议阅读Nginx的官方文档,了解如何配置和管理Nginx服务。

nginx核心配置

Nginx的配置文件(通常是nginx.conf)是Nginx服务器运行的核心,它包含了Nginx运行所需的各种配置指令。Nginx的配置文件遵循简单的层次化结构,主要分为全局块、events块、http块等几个部分。下面是对Nginx配置文件的详细解析:

1. 全局块

全局块是Nginx配置文件的开始部分,主要设置一些影响Nginx全局运行的参数,如工作进程数、日志文件路径等。

  • user:指定Nginx工作进程运行的用户和用户组。例如,user nginx; 表示Nginx工作进程将以nginx用户身份运行。
  • worker_processes:设置Nginx工作进程的数量,通常设置为CPU核心数。例如,worker_processes auto; 表示自动检测CPU核心数并设置相应的工作进程数。
  • error_log:配置错误日志文件的路径和日志级别。例如,error_log /var/log/nginx/error.log warn; 表示将错误日志记录在/var/log/nginx/error.log文件中,并设置日志级别为warn。
  • pid:指定Nginx主进程的PID文件存放位置。例如,pid /var/run/nginx.pid; 表示将主进程的PID记录在/var/run/nginx.pid文件中。

2. events块

events块主要影响Nginx服务器与用户的网络连接,比如设置工作进程的最大连接数。

  • worker_connections:设置每个工作进程的最大连接数。例如,worker_connections 1024; 表示每个工作进程最多可以处理1024个并发连接。
  • use:指定事件驱动模型(如epoll、kqueue等)。这个指令通常根据操作系统的不同而有所差异,Nginx会自动选择最适合当前操作系统的模型。

3. http块

http块是Nginx配置中最复杂的部分,包含了服务器对HTTP请求的处理方式。它内部可以包含多个server块,每个server块定义了一个虚拟主机。

  • include:引入其他配置文件。例如,include /etc/nginx/mime.types; 表示引入MIME类型文件。
  • default_type:指定默认的MIME类型。例如,default_type application/octet-stream; 表示默认的MIME类型为二进制流。
  • log_format:自定义日志格式。这个指令允许用户定义自己的日志格式,以便更好地分析日志数据。
  • access_log:指定访问日志文件及使用的日志格式。例如,access_log /var/log/nginx/access.log main; 表示将访问日志记录在/var/log/nginx/access.log文件中,并使用前面定义的main日志格式。
  • sendfile:开启高效文件传输模式。例如,sendfile on; 表示开启sendfile功能,以提高文件传输的效率。
  • keepalive_timeout:指定连接超时时间。例如,keepalive_timeout 65; 表示连接超时时间为65秒。

4. server块

server块定义了虚拟主机的相关参数,包括监听的端口、服务器名称、根目录、默认文件等。

  • listen:指定监听端口。例如,listen 80; 表示监听80端口。
  • server_name:定义服务器名称。可以是一个或多个域名,用于匹配请求的Host头部字段。
  • root:设置根目录。Nginx将在这个目录下查找请求的文件。
  • index:指定默认文件。当请求的是目录时,Nginx会返回这些文件中的一个作为响应。

5. location块

location块用于配置URL匹配规则和处理方式。Nginx根据请求的URL与location块中的匹配规则进行匹配,并执行相应的处理指令。

  • location:定义URL匹配规则。匹配规则可以是精确匹配、前缀匹配或正则匹配。
  • try_files:尝试顺序文件访问。例如,try_files $uri $uri/ =404; 表示先尝试访问请求的URI对应的文件或目录,如果找不到则返回404错误。
  • alias:为特定目录指定路径别名。
  • proxy_pass:将请求转发到后端服务器。例如,proxy_pass http://backend; 表示将请求转发到名为backend的后端服务器。

总结

Nginx的配置文件通过全局块、events块、http块、server块和location块等层次化结构,实现了对Nginx服务器的全面配置。用户可以根据自己的需求,通过修改配置文件中的指令,来定制Nginx的行为和性能。

nginx几种主要功能配置

反向代理

  • 在Nginx配置文件中,找到http节点或在server节点下添加反向代理的配置。
  • 配置示例:
    server {
        listen 80;  # 监听80端口
        server_name example.com;  # 定义服务器名称
    
        location / {
            proxy_pass http://backend_server;  # 转发请求到后端服务器
            proxy_set_header Host $host;  # 传递客户端请求的主机名
            proxy_set_header X-Real-IP $remote_addr;  # 传递客户端的真实IP地址
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递客户端和所有代理服务器的IP地址
            proxy_set_header X-Forwarded-Proto $scheme;  # 传递使用的协议(http或https)
        }
    }
    

负载均衡

  • Nginx支持多种负载均衡算法,包括轮询(默认)、权重轮询、IP哈希等。
  • 配置示例(权重轮询):
    upstream backend_servers {
        server backend1.example.com weight=3;
        server backend2.example.com;
        server backend3.example.com;
    }
    
    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://backend_servers;
            # 其他配置...
        }
    }
    

SSL配置

  • 在反向代理处处理SSL加密和解密,减轻后端服务器负担。
  • 配置示例:
    server {
        listen 443 ssl;
        server_name example.com;
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
    
        location / {
            proxy_pass http://backend_server;
            # 其他配置...
        }
    }
    

连接管理

  • 设置连接池和超时参数以优化与后端服务器的连接。
  • 示例配置包括keepaliveproxy_connect_timeoutproxy_send_timeoutproxy_read_timeout等指令。

压缩

  • 启用gzip压缩以减少传输数据的大小,提高响应速度。
  • 配置示例:
    http {
        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        # 其他配置...
        server {
            # ...
        }
    }
    

静态文件缓存

http {  
    # 其他配置...  
  
    server {  
        listen 80;  
        server_name yourdomain.com;  
  
        # 缓存路径配置  
        proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=10g inactive=60m;  
  
        location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {  
            # 开启缓存  
            proxy_cache static_cache;  
            # 设置缓存有效期  
            proxy_cache_valid 200 302 304 365d;  
            # 对于其他状态码,可以设置较短的缓存时间  
            proxy_cache_valid any 1m;  
  
            # 设置HTTP头部信息,指示浏览器缓存  
            expires 365d;  
            add_header Cache-Control "public, max-age=31536000";  
  
            # 其他配置...  
            # 例如,可以添加try_files指令来尝试直接服务文件,而不是通过代理  
            # try_files $uri $uri/ =404;  
        }  
  
        # 其他location块...  
    }  

    # 其他server块...  
}
  • 注意:
    • proxy_cache_path指令用于定义缓存的路径、缓存的层数、缓存区域的大小、最大缓存大小以及 缓存项在多久未被访问后会被视为不活跃。
    • proxy_cache指令用于在location块中启用缓存。
    • proxy_cache_valid指令用于为不同的HTTP状态码设置不同的缓存时间。
    • expires和add_header Cache-Control指令用于设置HTTP响应头,以指示浏览器缓存静态文件。

地址重写

Nginx的地址重写功能主要通过rewrite指令实现,它允许你将传入的Web请求重定向到其他URL。下面将详细介绍如何在Nginx中配置地址重写。

一、基本语法

rewrite指令的语法如下:

rewrite regex replacement [flag];
  • regex:表示正则匹配规则,用于匹配请求的URL。
  • replacement:表示重写后的内容,即匹配成功后要替换成的URL。
  • flag:表示rewrite支持的flag标记,用于控制重写后的行为。常见的flag有lastbreakredirectpermanent等。
二、配置步骤
  1. 打开Nginx配置文件
    Nginx的配置文件通常位于/etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf

  2. 编辑配置文件
    在server块或location块中添加rewrite指令。rewrite指令可以放在server {}、location {}、if {}配置段中。

  3. 配置rewrite指令
    根据需求编写rewrite指令,包括正则表达式、替换字符串和flag。

  4. 保存并测试配置
    保存配置文件后,使用nginx -t命令测试配置文件的正确性。如果显示成功,则重新加载Nginx配置,使其生效。

三、常见应用场景
  1. 域名跳转
    当用户访问旧域名时,自动跳转到新域名。

    server {
        listen 80;
        server_name old.example.com;
        rewrite ^(.*)$ http://new.example.com$1 permanent;
    }
    
  2. URL伪静态化
    将动态页面显示为静态页面,提升SEO效果。

    location / {
        rewrite ^/news/(\d+)\.html$ /news/index.php?id=$1 last;
    }
    
  3. 路径调整
    调整用户访问的路径,使其更加规范。

    location /old-path {
        rewrite ^/old-path(.*)$ /new-path$1 last;
    }
    
  4. 防盗链
    防止其他网站直接链接到你的静态资源。

    location ~* \.(jpg|jpeg|png|gif|swf)$ {
        valid_referers none blocked server_names *.example.com ~\.google\. ~\.baidu\.;
        if ($invalid_referer) {
            rewrite ^/ http://error.example.com/403.html;
        }
    }
    
四、注意事项
  1. 正则表达式
    编写正则表达式时,要注意Nginx对正则表达式的支持和限制。

  2. flag的选择
    根据实际情况选择合适的flag,比如永久重定向使用permanent,临时重定向使用redirect

  3. 性能影响
    大量的地址重写可能会对Nginx的性能产生影响,需要合理控制重写规则的数量和复杂度。

  4. 安全性
    确保重写规则不会造成安全漏洞,比如避免重定向到恶意网站。
    通过以上步骤和注意事项,你可以在Nginx中灵活地配置地址重写,以满足不同的Web应用需求。

其他

指定日志格式

在Nginx中,你可以通过定义自定义的日志格式来记录你需要的具体信息。这通过log_format指令在Nginx的配置文件(通常是nginx.conf或者包含在nginx.conf中的其他配置文件)中完成。一旦定义了日志格式,你就可以在serverlocation块中使用access_log指令来指定日志文件的位置,并应用之前定义的日志格式。

下面是一个如何定义和使用自定义日志格式的例子:

1. 定义日志格式

在Nginx的配置文件中(通常在http块内),你可以使用log_format指令来定义一个或多个自定义的日志格式。每个格式都有一个名称,之后跟着具体的格式定义。

http {
    # 定义日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 定义另一个自定义日志格式
    log_format  custom  '$remote_addr - $remote_user [$time_iso8601] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';

    # ... 其他配置 ...
}

在这个例子中,我们定义了两个日志格式:main(Nginx的默认日志格式)和custom(一个包含更多上游请求时间相关信息的自定义格式)。

2. 使用自定义日志格式

定义了日志格式后,你可以在serverlocation块中使用access_log指令来指定日志文件的位置,并应用之前定义的日志格式。

server {
    listen       80;
    server_name  localhost;

    # 使用自定义的日志格式
    access_log  /var/log/nginx/access.custom.log  custom;

    # ... 其他配置 ...
}

在这个例子中,所有的访问日志都将按照custom日志格式写入/var/log/nginx/access.custom.log文件中。

注意事项
  • 日志格式中的变量(如$remote_addr$time_local等)是Nginx预定义的,你可以根据需要选择使用。
  • log_format指令必须在http块中定义,但可以在serverlocation块中通过access_log指令被引用。
  • 更改Nginx配置后,需要重载或重启Nginx服务以使更改生效。你可以使用nginx -s reload命令来重载配置,而无需完全重启Nginx服务。

nginx服务的启停

Nginx的启停服务命令行主要包括启动、停止和重启等几种操作。以下是详细的命令行操作说明:

启动Nginx服务
  • 基本命令nginx
  • 说明:直接运行nginx命令即可启动Nginx服务器。该命令会加载Nginx的配置文件(默认位置为/etc/nginx/nginx.conf),并启动监听端口。
停止Nginx服务
  • 优雅停止nginx -s quit
    • 说明:此命令会优雅地关闭Nginx服务器,即允许所有当前正在处理的请求完成后再停止服务。这有助于确保不会丢失任何正在进行的连接或数据。
  • 快速停止nginx -s stopsystemctl stop nginx(Systemd系统)
    • 说明nginx -s stop命令会立即停止Nginx服务器,可能会中断正在处理的请求。而在使用Systemd的系统上,也可以通过systemctl stop nginx命令来停止Nginx服务,这同样会尝试优雅地停止服务,但可能不如nginx -s quit那样精细控制。
重启Nginx服务
  • 重新加载配置nginx -s reload
    • 说明:此命令会重新加载Nginx的配置文件,并应用新的配置,而无需停止和重新启动Nginx服务。这允许Nginx在不停机的情况下更新配置。
  • 完全重启:虽然Nginx没有直接的重启命令(如nginx -s restart),但你可以通过先停止服务再启动服务的方式来达到重启的目的。不过,在大多数情况下,推荐使用nginx -s reload来避免不必要的服务中断。
其他常用命令
  • 检查配置文件语法nginx -t
    • 说明:此命令用于检查Nginx配置文件的语法是否正确。如果配置文件有错误,它会提示错误信息;否则,会提示配置成功。
  • 查看Nginx版本nginx -v
    • 说明:此命令会显示Nginx的版本信息。
注意事项
  • 在执行任何Nginx的命令行操作之前,请确保你有足够的权限(通常是root权限)。
  • 如果Nginx是以服务的形式安装的(如通过Systemd、System V init等),那么你可以使用相应的服务管理命令(如systemctlservice等)来管理Nginx服务。
  • 在修改Nginx配置文件后,应使用nginx -t命令检查配置文件的语法是否正确,然后再使用nginx -s reload命令重新加载配置。这样可以避免因配置文件错误而导致Nginx服务无法启动或运行异常。

nginx预定义变量

Nginx提供了一系列预定义变量,这些变量可以在Nginx的配置文件中使用,以提供关于请求、连接、服务器等信息的访问。以下是Nginx的一些主要预定义变量列表及其描述:

  1. 请求相关变量

    • $arg_PARAMETER:GET请求中变量名PARAMETER参数的值。
    • $args:请求中的参数字符串,等同于$query_string
    • $binary_remote_addr:客户端IP地址(二进制格式)。
    • $content_length:请求头中的Content-Length字段。
    • $content_type:请求头中的Content-Type字段。
    • $cookie_COOKIE:请求中的指定Cookie值。
    • $document_root:当前请求的根目录。
    • $document_uri$uri:请求的URI(不包含参数)。
    • $host:请求中的主机头字段(Host),如果请求头中没有Host字段,则为处理该请求的server的server_name。
    • $hostname:请求到达的服务器的机器名(使用gethostname系统调用的值)。
    • $http_HEADER:请求头中的指定字段值,HEADER为HTTP请求中的内容转为小写,-变为_(如$http_user_agent表示User-Agent的值)。
    • $query_string:请求的查询字符串。
    • $request:完整的HTTP请求行(如GET /index.html HTTP/1.1)。
    • $request_body:请求的主体内容(在0.7.58+版本中可用,对proxy_pass或fastcgi_pass指令的location有意义)。
    • $request_body_file:客户端请求主体信息的临时文件名(如果请求体被保存到临时文件中)。
    • $request_completion:如果请求成功,设为"OK";如果请求未完成或不是一系列请求中最后一部分,则设为空。
    • $request_filename:当前连接请求的文件路径,由root或alias指令与URI请求生成。
    • $request_length:请求的长度(包括请求行、头部和主体)。
    • $request_method:HTTP请求方法(如GETPOST)。
    • $request_time:请求处理时间(秒)。
    • $request_uri:请求的URI(包括参数)。
    • $scheme:请求的协议(如httphttps)。
  2. 连接和服务器相关变量

    • $connection:连接序列号。
    • $connection_requests:已处理的当前连接的请求数量。
    • $limit_rate:用于限制客户端请求速率的值(可修改)。
    • $nginx_version:当前Nginx的版本号。
    • $pid:当前Nginx进程的ID。
    • $remote_addr:客户端IP地址。
    • $remote_port:客户端端口号。
    • $remote_user:已通过Auth Basic Module验证的用户名(如果配置了HTTP认证)。
    • $server_addr:服务器IP地址(在完成一次系统调用后确定)。
    • $server_name:服务器名称,即server_name指令的值。
    • $server_port:请求到达服务器的端口号。
    • $server_protocol:请求使用的协议(如HTTP/1.1)。
  3. 时间和版本相关变量

    • $msec:当前时间戳(毫秒级)。
    • $time_iso8601$time_local:当前时间,分别以ISO 8601格式和本地时间格式表示。
  4. 响应和连接状态相关变量

    • $sent_http_HEADER:发送给客户端的响应头字段值,HEADER为HTTP响应中的内容转为小写,-变为_(如$sent_http_cache_control)。
    • $status:服务器响应的HTTP状态码。
  5. TCP连接信息

    • $tcpinfo_rtt:客户端到服务器的往返时延(RTT)。
    • $tcpinfo_rttvar:RTT方差。
    • $tcpinfo_snd_cwnd:发送方拥塞窗口大小。

这些预定义变量在Nginx配置中非常有用,可以用于记录访问日志、设置重定向、控制访问权限等多种场景。通过灵活使用这些变量,可以使Nginx的配置更加强大和灵活。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

问道飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值