Nginx安装配置备忘

2016-10-21 Meng Lei 更多博文 » 博客 » GitHub »

Nginx HTTPS

原文链接 http://menglei.tk/2016/10/21/nginx/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


Nginx是一个俄罗斯开发的高性能HTTP服务器和反向代理服务器,功能丰富、性能强悍、运行稳定、应用广泛,完全使用C语言编写,可运行于各种Unix Like OS,并有Windows移植版本(不推荐用于生产环境)。

安装

在Ubuntu中,可以直接使用sudo apt-get install nginx 命令安装nginx,安装之后,默认的配置文件保存在 /etc/nginx 文件夹内,默认提供http服务的目录位置在 /usr/local/nginx/html

配置

nginx的主配置文件是:nginx.conf

user www-data;  #用户与用户组
worker_processes 4;  #对外提供服务的worker进程数量,取值取决因素包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。默认可设置为CPU内核数或者可设置为“auto”。
worker_rlimit_nofile 30000;   #worker进程最大打开文件数量限制
pid /var/run/nginx.pid;     #pid文件保存位置

events {
        worker_connections 10000;   #单个worker可以最大打开的连接数
        # multi_accept on;    #收到一个新连接通知后是否接受尽可能多的连接
}
http {

        ##
        # Basic Settings
        ##

        sendfile on;     #sendfile特性,提高文件访问的效率
        tcp_nopush on;   #在一个tcp数据包里发送所有的头文件
        tcp_nodelay on;  #不要缓存数据,立即发送
        keepalive_timeout 65;    #客户端keep-alive连接的超时时间
        types_hash_max_size 2048;
        # server_tokens off;   #是否关闭错误页面中的nginx版本显示

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;   #特定后缀使用mime types的配置
        default_type application/octet-stream;   #默认文件mime types
        client_max_body_size 200m;      #上传文件最大体积

        ##
        # Logging Settings
        ##

        access_log off;   #访问日志记录文件路径
        error_log /var/log/nginx/error.log;    #错误日志记录文件

        ##
        # Gzip Settings
        ##

        gzip on;    #是否启用gzip压缩(可减少流量,增大服务器负载)
        gzip_disable "msie6";    #指定客户端禁用gzip

        gzip_vary on;
        gzip_proxied any;  #允许或者禁止压缩基于请求和响应的响应流。设置为any,意味着将会压缩所有的请求。
        gzip_comp_level 6;  #压缩等级
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; #设置需要压缩的数据格式

        server{  #服务器配置
            listen  80; #端口
            server_name  example.com;  #域名  
            location / {
                root /usr/local/nginx/html;  #根目录
                index index.html index.htm index.php;  #默认主页文件
            }
        }



        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;    #配置
        include /etc/nginx/sites-enabled/*;  #virutal host配置
}

virutal host 配置

nginx作为反向代理服务器,可以根据域名不同将用户的请求分发给不同的后端服务器,配置文件放置在site-available目录中,如果要启用某一个特定的配置文件,需要在site-enabled目录中建立一个对应的软连接。

我们想要配置一个api.example.com的虚拟服务器,将特定/api路径下的所有请求转发到后端的api服务器,其他请求直接访问对应的静态文件目录,同时支持HTTP和HTTPS访问,配置如下

server {
    server_name api.example.com;  #域名,只有访问这个域名的请求才会被转发到这里
    listen 80;  #监听端口
    listen 443 ssl;   #HTTPS监听端口
    ssl on;   #是否启用HTTPS
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;   #HTTPS证书公钥地址,此处为Let's Encrypt申请的证书
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; #HTTPS证书私钥地址,此处为Let's Encrypt申请的证书
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   #HTTPS协议版本
    ssl_prefer_server_ciphers on;   #服务器加密优先于客户端加密
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';   #加密算法
    location ^~ /api/ {  #所有匹配到/api路径下的访问,全部转发
        proxy_pass http://127.0.0.1:8051/rest/;
        proxy_set_header Host $http_host;  #转发的请求,HOST取值为客户端访问的host值
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  #增加x-Forwarded-for
        proxy_set_header X-Real-IP $remote_addr;  #增加x-real-ip,取值为访问用户的真实IP,供后端获取客户IP使用
    }
    location = /upload {  #只有访问路径等于 /upload 的请求,才会转发到这里
        proxy_pass http://127.0.0.1:8052/upload/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        client_max_body_size 200m;  #设置最大上传文件体积,单位可以是k、m、g
    }
    location ~ /.well-known {   #letsencrypt申请证书验证域名使用的配置目录
        root /usr/share/nginx/.well-known;
        index index.html;
    }
    location / {  #所有不匹配上面各种条件的请求,都转发到这里
        root /var/webroot;
        index index.html index.htm;
    }
}

将以上配置保存为 /etc/nginx/sites-available 目录中的 api.example 文件,然后进入site-enabled目录,执行 ln -s ../sites-available/api.example api.example 在sites-enabled中建立其对应的软连接,然后执行 service nginx reload 重新加载nginx的配置,即可生效。

nginx配置强制跳转HTTPS

很多网站都要求所有HTTP的访问都强制跳转到HTTPS,其配置方法有很多种,可以按照以下配置思路:

我们有一个仅支持HTTPS访问的配置好的virtual host:

server {
    server_name www.example.com;
    listen 443 ssl;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

    location / {
        root /var/webroot;
        index index.htm index.html;
    }
}

新建一个配置文件www.redirect:

server {
    server_name www.example.com;
    listen 80;
    location ~ /.well-known { #letsencrypt申请证书验证域名使用的配置目录
        root /usr/share/nginx/.well-known;
        index index.html;
    }
    location / { #默认请求
        root /noexists;  #一个不存在的目录
        index index.html;  
    }
    error_page 404 https://www.example.com/;  #访问文件不存在时,跳转的链接
}

在sites-enabled 目录中为以上配置文件设置一个软链接,然后reload nginx即可。

其思路主要是利用了nginx的404页面,我们为http server配置了一个不存在的路径,这样在访问http服务器的时候,其index.html文件是不存在的,这样nginx就会给用户返回特定的404 Not Found 页面,我们将对应的HTTPS链接指定为其对应的404页面,这样在访问http server的时候,就会被自动redirect到相应的HTTPS页面了。