Nginx 反向代理配置 HTTP 和 HTTPS

Nginx 配置 HTTP 和 HTTPS

Nginx 的配置文件 nginx.conf 中有一些顶级指令(即上下文)用来分组适用于不同流量类型的指令:

  • events,通用的连接处理。
  • http,HTTP 流量。
  • mail,Mail 流量。
  • stream,TCP 流量。

放置在这些上下文之外的指令(directives)被认为是放置在主上下文(main context)中。在每个流量处理上下文中,可以放置一个或多个 server 上下文来定义用于控制请求处理的虚拟服务器(virtual servers)。
在 http 上下文中,每个 server 上下文负责对一个特定域名或 IP 地址的资源的请求进行处理,server 上下中的一个或多个 location 上下文用来定义如何处理特定的 URI 集合。 对于 mail 和 stream 上下文,每个 server 上下文负责对特定 TCP 端口或 UNIX 套接字上的流量进行处理。

nginx.conf 配置文件的一个大致框架如下所示:

user nobody; # 位于主上下文的指令

events {
    # 连接处理的配置
}

http {
    # 对 HTTP 请求的配置,会影响所有的虚拟服务器

    server {
        # 对第一台 HTTP 虚拟服务器的配置

        location /one {
            # 配置该如何处理以 /one 开始的 URI
        }
    }
}

stream {
    # 对 TCP 请求的配置,会影响所有的虚拟服务器

    server {
        # 对第一台 TCP 虚拟服务器的配置
    }
}

基本配置

在 nginx.conf 文件中的配置可分为三个部分:配置主上下文、配置 events 上下文和配置 http 上下文。

主上下文的配置是全局设置,具体配置如下:

user nginx nginx;
worker_processes 2;
error_log /var/log/nginx/error.log  notice;
worker_rlimit_nofile 1024;
  • user,指定运行 worker process 的用户和用户组,默认由 nginx 用户运行。
  • worker_processes,指定 Nginx 开启的子进程(worker process)数量。
  • error_log,指定全局错误日志文件。
    根据包含的日志信息详细度递减,分别 debug、info、notice、warn、error 和 crit 级别可供选择。
  • worker_rlimit_nofile,指定一个 Nginx 进程最多可打开的文件描述符数量。
    Linux 中可打开的文件描述符数量通过 ulimit -n 1024 命令来设置。

events 上下文用来指定 Nginx 的工作模式以及连接上限,具体配置如下:

events {
    use epoll;
    worker_connections 1024;
}
  • use,指定 Nginx 的工作模式。
    Nginx 支持的工作模式有 select、poll、kqueue、epoll、rtsig 和 /dev/poll。其中 select 和 poll 是标准工作模式,kqueue 和 epoll 是高效工作模式。 epoll 用于 Linux 平台上,而 kqueue 则用于 BSD 系统。
  • worker_connections,指定 Nginx 中每个进程的最大连接数(即接收客户端的最大请求数)。
    最大客户端连接数由 worker_processes 和 worker_connections 共同决定,即 Max_clients = worker_processes*worker_connections。进程接受的最大连接数受 Linux 系统进程的最大可打开文件描述符限制,可通过 ulimit 命令来修改。

http 上下文是 Nginx 中最核心的模块,它负责 HTTP 服务器相关的属性配置。具体配置如下:

http {
    include mime.types;
    default_type application/octet-stream;
    
    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 10;
    
    server {
        # 配置 HTTP 虚拟服务器
    }
}
  • include,包含 /etc/nginx/mime.type 文件,此文件用于设定文件的 mime 类型以便于 Nginx 识别。

  • default_type,设置默认文件类型为二进制流。
    当文件类型在 mime.type 文件中未指定时默认为二进制流,此时访问该文件,Nginx 不会解析,而是直接下载。

  • log_format,设置日志格式以及记录哪些信息。

  • access_log,此 http 上下文中的全局访问日志。
    后面的 main 指定日志格式,即使用 log_format 中定义的格式。

  • sendfile,开启高效的文件传输模式。
    设置 tcp_nopush 和 tcp_nodelay 为 on 是为防止网络阻塞。

  • keepalive_timeout,设置客户端连接保持活动的超时时间。

http 中的 server 上下文用于配置 HTTP 虚拟服务器,具体配置如下:

server {
    listen 80;
    server_name localhost 192.168.0.99 www.hao.com;

    root /www/nginx;
    index index.html index.jsp;
        
    charset utf-8;
    access_log /var/log/nginx/host.access.log  main;
    error_log /var/log/nginx/host.error.log  error;
        
    location / {
        # 配置如何处理特定的 URI 集合
    }
}
  • listen,此虚拟服务器监听的端口。不同的虚拟服务器可监听不同的端口。
  • server_name,指定 IP 地址或域名。
  • root,定义此虚拟服务器的根目录。
  • index,定义此虚拟服务器的默认首页地址。按序依次访问定义的文件。
  • charset,设置网页的默认编码格式。
  • access_log,此虚拟服务器的访问日志。
  • error_log,此虚拟服务器的错误日志。

server 中的 location 上下文用于配置处理特定的 URI 集合,具体配置如下:

location / {
    root /home/nginx;
    index index.html index.jsp;
}
  • location /,匹配访问路径为以 / 开始的 URI。

  • root,以 / 开始的 URI 在当前 location 上下文中的根目录。
    可与 server 上下文中的根目录相同,也可自定义一个新的根目录。

  • index,当前 location 上下文中默认的首页地址。

HTTPS 配置

  • Nginx开启SSL模块
    切换到源码包:
    cd /usr/local/src/nginx-1.11.3
    查看nginx原有的模块
    /usr/local/nginx/sbin/nginx -V
    在configure arguments:后面显示的原有的configure参数如下:
    --prefix=/usr/local/nginx --with-http_stub_status_module
    那么我们的新配置信息就应该这样写:
    ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
    运行上面的命令即可,等配置完
    配置完成后,运行命令
    make
    这里不要进行make install,否则就是覆盖安装
    然后备份原有已安装好的nginx
    cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
    然后将刚刚编译好的nginx覆盖掉原有的nginx(这个时候nginx要停止状态)
    cp ./objs/nginx /usr/local/nginx/sbin/
    然后启动nginx,仍可以通过命令查看是否已经加入成功
    /usr/local/nginx/sbin/nginx -V

  • SSL 证书
    首先在 nginx 的安装目录下创建一个 ssl 目录。
    mkdir /etc/nginx/ssl
    然后在 ssl 目录中创建 SSL 证书,如下是创建一个有效期 10 年,加密强度为 RSA2048 SSL 密钥 nginx.key 和 X509 证书文件 nginx.crt。
    openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout nginx.key -out nginx.crt

    • -x509 指定使用 X.509 证书签名请求(Certificate Signing Request,CSR)管理。
    • -node 告诉 openssl 在生成证书时忽略密码环节(此处需要 Nginx 自动读取此文件,而非是以用户交互的形式)。
    • -day 指定证书的有效期。
    • -newkey rsa:2048 表示生成一个新证书和一个新的 SSL key(加密强度为 RSA 2048)。
    • -keyout 指定 SSL 输出文件名。
    • -out 指定生成的证书文件名。

    执行上述命令后,会要求填入下述信息。

    Generating a 2048 bit RSA private key
    writing new private key to '/etc/nginx/ssl/nginx.key'
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:Beijing
    Locality Name (eg, city) [Default City]:Beijing
    Organization Name (eg, company) [Default Company Ltd]:hao
    Organizational Unit Name (eg, section) []:hao
    Common Name (eg, your name or your server's hostname) []:www.hao.com
    Email Address []:admin@hao.com
    

SSL 创建完成后,第二部就是配置 Nginx 使用 SSL。首先是配置将 HTTP 请求的重定向到 HTTPS。

server {
    listen 80;
    server_name localhost 192.168.0.99 www.hao.com;

    # HTTPS 配置
    rewrite ^ https://$http_host$request_uri? permanent;
}
  • rewrite,对 URL 进行重写。
    • 语法:rewrite 规则 定向路径 重写类型;
      规则,匹配目标 URL 的字符串或正则表达式。
      定向路径,匹配到规则后要定向的路径。
      $http_host 表示主机地址。
      $request_uri 表示 URI。
    • 重写类型
      last,完成 rewrite 后,浏览器地址栏的 URL 不变。
      break,本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏的 URL 不变。
      redirect,返回 302 临时重定向,浏览器地址会显示跳转后的 URL。
      permanent,返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL。

然后配置对 HTTPS 请求的处理。

server {
    listen 443 ssl;
    server_name www.hao.com;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /www/nginx/https;
    index index.html index.jsp;
        
    keepalive_timeout 70;
        
    server_tokens off;

    access_log /var/log/nginx/www.hao.com.access.log;
    error_log /var/log/nginx/www.hao.com.error.log;
}
  • listen,监听 443 端口并使用 ssl 参数。
  • ssl_certificate,指定服务器证书的路径。
  • ssl_certificate_key,指定私钥的路径。
  • ssl_protocols,指定 SSL 协议(Nginx 默认使用)。
  • ssl_ciphers,以 OpenSSL 库理解的格式指定密码(Nginx 默认使用)。
  • server_tokens,关闭(显示)Nginx 版本号。

最后重启 Nginx 以使用新的配置文件。
./nginx -s reload

也可配置一个同时处理 HTTP/HTTPS 的服务器,server 上下文中的配置如下:

server {
    listen 80;
    listen 443 ssl;
    server_name 192.168.0.99;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    root /www/nginx;
    index index.html index.jsp;
        
    keepalive_timeout 70;
        
    server_tokens off;

    access_log /var/log/nginx/www.hao.com.access.log;
    error_log /var/log/nginx/www.hao.com.error.log;   
}
  • HTTPS 服务器优化

SSL 连接会占用更多的更多的 CPU 资源(例如 SSL 握手),因此在多处理器系统上,应多运行几个工作进程(worker process)。有两种方法可以减少每个客户端执行 SSL 握手的操作:

  • 首先使连接 keep-alive,然后通过一个连接发送多个请求。
  • 然后是重用 SSL session 参数,以避免并行和后续连接的 SSL 握手。

Session 存储在 worker 共享的 SSL session 高速缓存中,并可通过 ssl_session_cache 指令配置。在 http 上下文中对 session 的配置如下所示。

http {
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
}
  • ssl_session_cache,指定 SSL 共享缓存的大小为 10M。
  • ssl_session_timeout,指定 SSL 共享缓存的超时为 10 mins。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值