南琴浪博客

本博客 Nginx 配置(系列三) 完整篇

11/26/2017

这是本博客 Nginx 配置系列的第三篇了,在前面的两篇中我分别介绍了安全和性能的相关内容,这篇文章会对之前我所作的那些文章(所作的那些铺垫)做一个集合,以本站的配置为示例进行说明。

本文最后更新: 2018-03-24

编译安装

# 下载所需
apt-get install -y git

# pcre 8.42
# 更新至最新版 pcre
wget https://raw.githubusercontent.com/nanqinlang/Nginx/master/dependence/pcre-8.42.tar.gz && tar -zxf pcre-8.42.tar.gz
cd pcre-8.42 && ./configure && cd ..

# zlib-cloudflare
# 采用 cloudflare 维护的 zlib
git clone --depth=1 https://github.com/nanqinlang-fork-blog-nginx/zlib.git zlib-cloudflare
cd zlib-cloudflare && ./configure && cd ..

# 本站已启用 TLS 1.3,所以采用 openssl-draft-18 分支
# git clone -b tls1.3-draft-18 https://github.com/nanqinlang-fork/openssl.git openssl-draft-18
# 更新:本站不再使用 openssl 并不再启用 TLS1.3
# 本站已改用 LibreSSL 作为加密库
wget https://raw.githubusercontent.com/nanqinlang/Nginx/master/dependence/libressl-2.6.4.tar.gz && tar -zxf libressl-2.6.4.tar.gz

# 本站使用 Nginx mainline v1.13.9
wget https://nginx.org/download/nginx-1.13.9.tar.gz && tar -zxf nginx-1.13.9.tar.gz

# Nginx brotli module
git clone https://github.com/nanqinlang-fork-blog-nginx/ngx_brotli.git && cd ngx_brotli && git submodule update --init && cd ..

# Nginx CT module
# wget https://raw.githubusercontent.com/nanqinlang/Nginx/master/module/ct-module-1.3.2.tar.gz && tar -zxf ct-module-1.3.2.tar.gz
# 改用 LibreSSL 后不能再编译进 CT 模块

# Nginx substitutions filter module
git clone https://github.com/nanqinlang-fork/ngx_http_substitutions_filter_module.git

# 编译所需
apt-get install -y build-essential cmake clang

# 开始吧
./configure \
--prefix=/home/nginx \
--builddir=/home/nginx-installation/build \
--sbin-path=/home/nginx/sbin/nginx \
--modules-path=/home/nginx/modules \
--pid-path=/home/nginx/sbin/nginx.pid \
--conf-path=/home/nginx/conf/nginx.conf \
--error-log-path=/home/nginx/logs/error.log \
--http-client-body-temp-path=/home/nginx/temp/client_body \
--http-proxy-temp-path=/home/nginx/temp/proxy \
--with-pcre=/home/nginx-installation/pcre-8.42 \
--with-zlib=/home/nginx-installation/zlib-cloudflare \
--with-openssl=/home/nginx-installation/libressl-2.6.4 \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_gunzip_module \
--add-module=/home/nginx-installation/ngx_brotli \
--with-http_sub_module \
--add-module=/home/nginx-installation/ngx_http_substitutions_filter_module \
--with-http_stub_status_module \
--with-http_degradation_module \
--without-http_fastcgi_module \
--without-http_scgi_module \
--without-http_uwsgi_module \
--without-http_autoindex_module \
--without-http_charset_module \
--without-http_empty_gif_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module

make && make install

为了能够更方便地体会到新特性,在版本上我都选择了较新的版本,在 configure 中我详细的指定了各项目录、启用了较多模块。

--with-openssl-opt=enable-tls1_3 用于启用 TLS 1.3 本站已不再启用 TLS1.3。更多详细可以看我的 这篇文章

--add-module=.../ngx_brotli 用于启用 Brotli 压缩。更多详细可以看我的 这篇文章

--with-http_gzip_static_module 用于启用 Gzip 压缩,这个我在前面的 性能篇 中已有提过,且也有 一篇文章 专门讲述其配置。

--add-module=.../nginx-ct-1.3.2 用于 TLS 拓展方式启用 Certificate Transparency 特性,更多详细可以看我的 这篇文章

全局配置

Nginx 的全局配置位于 nginx.conf 中:

# 运行 Nginx 的用户组和用户
user                  naive naive;
# 进程数,一般设置为 CPU 核心数的两倍,推荐使用 auto 即可
worker_processes      auto;
# 错误日志路径
error_log             /home/nginx/logs/error.log crit;
# pid 路径
pid                   /home/nginx/sbin/nginx.pid;
# 最大访问文件数限制
worker_rlimit_nofile  4096;

events {
    # nginx 处理请求的方法
    use                 epoll;
    # 单个 worker process 的最大链接数
    worker_connections  4096;
    # 让 nginx worker 进程尽可能多的接受请求
    multi_accept        off;
}

http {
    include         mime.types;
    charset         UTF-8;
    default_type    application/octet-stream;

    # 隐藏 Nginx 版本信息
    server_tokens   off;
    # 连接日志记录的格式
    log_format logformat '[$time_local] [ $remote_addr $http_user_agent] [$status $request_time] [$http_host $request] [$http_referer]';

    # 限制并发连接数,需要在站点配置中写入剩下的配置项
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name        zone=perserver:100m;

    # TCP 优化
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   60s;

    # Gzip 压缩
    gzip  on;
    gzip_vary  on;
    gzip_min_length  1000;
    gzip_buffers  16 10k;
    gzip_comp_level  3;
    gzip_proxied  any;
    gzip_types  text/plain text/html;
    gzip_http_version  1.0;
    gzip_disable  "msie6";
    gzip_static always;
    gunzip on;

    # open_file_cache
    open_log_file_cache         max=4096 inactive=30m min_uses=3 valid=30m;
    open_file_cache             max=4096 inactive=12h;
    open_file_cache_valid       12h;
    open_file_cache_min_uses    3;
    open_file_cache_errors      off;

    # TLS 会话恢复
    ssl_session_tickets     on;
    # 如果只是单机站点,不需配置 ticket_key 这项
    ssl_session_ticket_key  /home/site/crt/ssl_session_ticket.key;
    ssl_session_cache       shared:SSL:10m;
    ssl_session_timeout     30m;

    # 引入我的站点配置
    include sometimesnaive.conf;
}

站点配置

本博客站点配置位于 sometimesnaive.conf

server {
    listen 443 ssl spdy http2 fastopen=3 reuseport;

    root   /home/site/blog;
    index  index.html;

    server_name  sometimesnaive.org;

    # 连接日志
    access_log      /home/site/access-log/access.log logformat;
    log_not_found   off;

    # 限制并发连接数
    limit_conn  perip 10;
    limit_conn  perserver 100;

    #ssl_protocols TLSv1.3 TLSv1.2;
    #本博客已取消启用 TLS 1.3
    ssl_protocols  TLSv1.2;

    # 本站已启用 ECC & RSA 双证书
    ## Let's Encrypt 的 ECC 证书
    ssl_certificate      /home/site/crt/ecc/LetsEncryptecc-chained.cer;
    ssl_certificate_key  /home/site/crt/ecc/LetsEncryptecc.key;
    ## 本站已启用 Certificate Transparency
    ssl_ct  on;
    ssl_ct_static_scts   /home/site/crt/ecc;
    # Let's Encrypt的 RSA 证书
    ssl_certificate      /home/site/crt/rsa/LetsEncryptrsa-chained.cer;
    ssl_certificate_key  /home/site/crt/rsa/LetsEncryptrsa.key;
    ssl_ct_static_scts   /home/site/crt/rsa;

    ssl_prefer_server_ciphers  on;
    ssl_dhparam  /home/site/crt/dh-4096.pem;
    ssl_ciphers  'ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-ECDSA-CHACHA20-POLY1305 ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-CHACHA20-POLY1305 ECDHE-RSA-AES256-GCM-SHA384';

    # OCSP Stapling
    ssl_stapling             on;
    ssl_stapling_verify      on;
    ssl_trusted_certificate  /home/site/crt/LetsEncryptocsp.cer;
    resolver  208.67.222.222 valid=300s;
    resolver_timeout         5s;

    # HTTP 响应头
    add_header  Strict-Transport-Security  "max-age=31536000; preload; includeSubDomains" always;
    add_header  X-Frame-Options            "deny" always;
    add_header  X-Content-Type-Options     "nosniff" always;
    add_header  X-Xss-Protection           "1; mode=block" always;
}

以上配置,分别解释在我的以下文章。以下列表,按照“站点配置中的配置项目”,从上至下依次排列: