nginx常见用法

1,464 阅读2分钟

这里会对nginx常见用法做一下基本介绍,其他请参考nginx文档

概述

ngnix是一个服务器,可以用来做

  • http服务器
  • http反向代理服务器
  • mail代理服务器
  • tcp/udp代理服务器

基本用法

这里假定已经下载完。
nginx有主进程和一些工作进程,主进程负责读取和计算配置以及维护工作进程,工作进程处理真正的请求,配置文件默认为/etc/nginx/nginx.conf

启动、停止和重启

相关操作要使用以下语法

nginx -s signal

其中signal可取

  • stop 强制立刻停止
  • quit 停止但是要等当前的请求处理完
  • reload 重启
  • reopen 重新打开日志记录,可用于旧日志文件移走后,重新生成日志文件

配置文件的结构

nginx包含很多模块,我们可以使用配置文件中的指令进行控制。
一个简单的指令包含空格分开的name和参数,最后加一个分号。
一个块指令(block directive)和一个简单指令类似,但是结尾的不是分号而是一个花括号,如果在花括号中有其他指令,则被称为一个上下文(context),比如 events, http, server, and location。任何上下文之外的地方被认为是主上下文(main context),其中events and http指令在主上下文,server 在http上下文,location在server上下文。

井号后的内容被认为是注释。

静态资源服务

web服务器可以用来提供静态资源访问,可以根据请求来访问不同路径, 比如在http上下文添加以下配置

server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}

location块指令的参数进行匹配,如果一个请求能匹配到多个路径则以最长的为准。
比如请求/就会匹配第一个,去/data/www/获取资源,请求/images/就会匹配第二个,到/data/images/中获取资源。

代理服务器

代理服务器是一个服务器,当收到请求,会把请求发到被代理的服务器,然后将获取的请求发送给客户端。

我们这里做一个简单的代理服务器,接收80端口的请求,其中图片使用本地目录,其他请求发送到8080端口。

在配置文件中使用两个server块指令,第一个监听80端口,对于图片我们使用正则检查相关后缀,正则前面要使用~

server {
    location / {
        proxy_pass http://localhost:8080;
    }

   location ~ \.(gif|jpg|png)$ {
    root /data/images;
  }
}

另一个监听8080端口,在这里server上下文中包含root字段,当location上下文中没有root参数时会默认使用这个。

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

nginx怎么处理一个请求

基于name的虚拟服务器

我们可以配置三个监听80端口的虚拟服务器

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

这个配置会对请求header中的host字段进行路由,如果没有匹配到,就会路由到默认服务器,默认服务器是第一个,也可以通过参数default_server指定

server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

如果不允许没有host字段的请求访问,则可以采用以下配置关闭连接,其中空字符的name可以对其进行匹配

server {
    listen      80;
    server_name "";
    return      444;
}

这里的server_name可以使用以下形式表示

  • 准确的name
  • 以星号开始,比如*.example.org
  • 以星号结尾,比如mail.*
  • 正则

使用http负载均衡

跨多个应用实例的负载均衡通常用于优化资源利用、最大化吞吐量、减少延迟和容错。
我们可以使用nginx作为一个有效的负载均衡器来将流量分配到多个应用服务器,来提高性能、稳定性和可靠性。

nginx负载均衡的方法有三种

  • round-robin 将请求轮流分配
  • least-connected 将请求分配给最小序号的活跃连接
  • 基于client的ip对应的hash值进行分配,这样可以保证同一个请求被同一个服务器处理

最简单的配置这样的

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

默认round-robin,如果要使用least-connected或ip_hash则在服务器组中添加指令

    upstream myapp1 {
        least_conn;#或ip_hash
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

配置https

需要添加ssl参数(http2参数可以开启http2),和指定相关证书和私钥

server {
    listen              443 ssl http2;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
 
    ...
}

为了将http请求转发给https所以,要把80端口的数据转发到https

    server {
        listen       80;
        rewrite ^(.*)$ https://$host$1 
    }

添加header

可以在 http, server, location上下文使用add_header添加响应header,语法

add_header name value [always];

比如

 location / {
           add_header    Cache-Control 0;
        }

完结