nginx 反向代理及 https 证书配置

author: yunqimg(ccxtcxx0)

1. 编译安装nginx

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
  • 编译时注意添加 SSL 模块, 否则配置 https 时会失败.
  • 安装完成后, nginx 程序默认保存在 /usr/local/nginx/sbin/ 目录下, 启动 nginx 命令如下
/usr/local/nginx/sbin/nginx -c /home/nginx/nginx.conf

推荐使用指定 配置文件路径方式启动, 这样在 docker 方式部署时方便修改配置文件.

2. 反向代理配置

  • 基本配置范例:
## Basic reverse proxy server ##
upstream backend {
server 127.0.0.1:8080; # local server
} server {
location / {
proxy_pass http://backend;
}
}

upstream 节点记录后端服务器地址, backend 是节点名称.

Nginx 反向代理的指令不需要新增额外的模块,默认自带 proxy_pass 指令,只需要修改配置文件就可以实现反向代理。

  • Nginx 反向代理模板
## Basic reverse proxy server ##
upstream tornado {
server 127.0.0.1:8080; # local server
} server {
listen 80;
server_name example.com; access_log /home/nginx/log/access.log main;
error_log /home/nginx/log/error.log; root html;
index index.html index.htm index.php; ## send request back to tornado ##
location / {
proxy_pass http://tornado; # Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

nginx反向代理配置模块, 推荐使用独立的文件保存配置, 例如: 将上面提到的模板保存 到tornado.conf 文件中, 再在 nginx.conf 文件中添加 include /home/nginx/tornado.conf; 即可将两个配置文件关联.

添加位置如下

http {
include mime.types;
default_type application/octet-stream; # xxx
# xxx
# ...
include /home/nginx/tornado.conf;
}

如何获取HTTPS证书

详情说明请参考 NGINX 配置 HTTPS 服务器

主要参考 使用 OpenSSL 生成 SSL Key 和 CSR 文件 这一段

HTTPS 基础配置

要开启 HTTPS 服务,在配置文件信息块(server block),必须使用监听命令 listen 的 ssl 参数和定义服务器证书文件和私钥文件,如下所示

server {
# ssl参数
listen 443 ssl;
server_name example.com;
# 证书文件
ssl_certificate example.com.crt;
# 私钥文件
ssl_certificate_key example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
#...
}

example.com.crt 和 example.com.key 可以是任意名称, 只要配置文件与实际文件名对应即可.

若只填写证书文件和私钥文件的文件名无法正常工作, 可尝试填写完整文件路径. 如: ssl_certificate /home/nginx/example.com.crt

证书文件会作为公用实体發送到每台连接到服务器的客戶端,私钥文件作为安全实体,应该被存放在具有一定权限限制的目录文件,并保证 Nginx 主进程有存取权限。

私钥文件也有可能会和证书文件同放在一個文件中,如下面情況:

ssl_certificate     www.example.com.cert;
ssl_certificate_key www.example.com.cert;

这种情況下,证书文件的的读取权限也应该加以限制,尽管证书和私钥存放在同一个文件里,但是只有证书会被发送到客戶端

命令 ssl_protocols 和 ssl_ciphers 可以用来限制连接只包含 SSL/TLS 的加強版本和算法,默认值如下

ssl_protocols   TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

加强 HTTPS 安全性

HTTPS 基础配置采取的默认加密算法是 SHA-1,这个算法非常脆弱,安全性在逐年降低,在 2014 年的时候, Google 官方博客就宣布在 Chrome 浏览器中逐渐降低 SHA-1 证书的安全指示,会从 2015 年起使用 SHA-2 签名的证书,可参阅 Rabbit_Run 在 2014 年发表的文章:《为什么Google急着杀死加密算法SHA-1》

为此,主流的 HTTPS 配置方案应该避免 SHA-1,可以使用 迪菲-赫尔曼密钥交换(D-H,Diffie–Hellman key exchange)方案。

首先在目录 /etc/ssl/certs 运行以下代码生成 dhparam.pem 文件

openssl dhparam -out dhparam.pem 2048

然后加入 Nginx 配置

#优先采取服务器算法
ssl_prefer_server_ciphers on;
#使用DH文件
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#定义算法
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

如果服务器夠強大,可以使用更为复杂的 4096 位进行加密。

一般情況下还应该加上以下几个增强安全性的命令

#减少点击劫持
add_header X-Frame-Options DENY;
#禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;
#防XSS攻击
add_header X-Xss-Protection 1;

这几个安全命令在 Jerry Qu 大神的文章《一些安全相关的HTTP响应头》有详细的介紹。

优化后的综合配置

worker_processes auto;

http {

    #配置共享会话缓存大小,视站点访问情况设定
ssl_session_cache shared:SSL:10m;
#配置会话超时时间
ssl_session_timeout 10m; server {
listen 443 ssl;
server_name www.example.com; #设置长连接
keepalive_timeout 70; #证书文件
ssl_certificate www.example.com.crt;
#私钥文件
ssl_certificate_key www.example.com.key; #优先采取服务器算法
ssl_prefer_server_ciphers on;
#使用DH文件
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#定义算法
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
#减少点击劫持
add_header X-Frame-Options DENY;
#禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;
#防XSS攻擊
add_header X-Xss-Protection 1;
#...

强制使用 HTTPS

为了兼容原来80端口的HTTP方式的访问,可以将80端口的访问请求全部转发到443端口上,在 upstream 与 server 之间增加配置如下

## your-domain.com ##
server {
listen 80;
server_name your-domain.com; location = / {
rewrite ^/(.*) https://your-domain.com/$1 permanent; # force redirect http to https
} location / {
rewrite ^/(.*) https://your-domain.com/ permanent; # force redirect http to https
}
}

参考

https://www.cnblogs.com/ghjbk/p/6744131.html

HttpUpstream-Nginx中文文档

nginx反向代理原理和配置讲解

nginx反向代理

single_http_https_server

Nginx配置upstream实现负载均衡

Nginx安装部署之反向代理配置与负载均衡

Nginx 配置 HTTPS 服务器

Nginx+Https配置

一些安全相关的HTTP响应头

nginx强制使用https访问(http跳转到https)

Nginx配置HTTPS

nginx的location配置详解

解决Nginx报错The plain HTTP request was sent to HTTPS port

The plain HTTP request was sent to HTTPS port

SSL For Free网站获取Let's Encrypt免费SSL证书

nginx 反向代理及 https 证书配置的更多相关文章

  1. Nginx反向代理实现负载均衡配置图解

    Nginx反向代理实现负载均衡配置图解 [导读] 负载均衡配置是超大型机器需要考虑的一些问题,同时也是数据安全的一种做法,下面我来介绍在nginx中反向代理 负载均衡配置图解,大家可参考本文章来操作. ...

  2. nginx反向代理跨域基本配置与常见误区

    最近公司前后端分离,前端独立提供页面和静态服务很自然的就想到了用nginx去做静态服务器.同时由于跨域了,就想利用nginx的反向代理去处理一下跨域,但是在解决问题的同时,发现网上有些方案的确是存在一 ...

  3. nginx 反向代理实现负载均衡*配置实战

    重要点: 1配置反向代理多虚拟主机节点服务器 2经过反向代理后的节点服务器记录用户IP 3与反向代理配置相关的更多参数说明 4根据URL目录地址转发 (1)根据URL中的目录地址实现代理转发(动静分离 ...

  4. Nginx反向代理以及负载均衡配置

    项目地址:http://git.oschina.net/miki-long/nginx 前提:最近在研究nginx的用法,在windows上小试了一下,由于windows下不支持nginx缓存配置,所 ...

  5. nginx反向代理负载均衡初次配置

    反向代理,我个人理解是通过一台反向代理服务器,把客户端的把有请求按照一定的规则分发给后台的服务器.nginx作反向代理服务器的虚拟机配置如下: upstream itest { #正常情况下应该作如下 ...

  6. docker 安装 wordpress,通过nginx反向代理,绑定域名,配置https

    假设docker已经安装好了,如果没有安装,可以照着 5分钟安装docker教程. 一. 下载镜像 默认下载最新版本,如果想指定对应版本,可以用冒号后加版本,像这样mysql:5.7: docker ...

  7. IIS反向代理/Rewrite/https卸载配置

    目标,使IIS具有类似与Nginx的功能,将指定域名的请求重定向到IIS内.IIS外.其他机器上的其他端口,并且实现https卸载功能 重点预告: 1.安装最新版urlrewrite(微软开发的)插件 ...

  8. Nginx反向代理与Backend直接配置长连接

    使用了Nginx的反向代理配置如下: upstream test{ keepalive 1; server 192.168.1.63:4000; } server { listen 4000; ser ...

  9. 002-nginx-在 nginx 反向代理中使用域名,配置动态域名解析

    一.概述 代理(proxy),即中间人,它代替客户端发送请求给服务器,收到响应后再转给客户端.通常意义上的代理是从用户的角度讲的,用户通过某个代理可以访问多个网站,这个代理是靠近用户的,比如某些公司可 ...

随机推荐

  1. springcloud 依赖版本问题

    SpringCloud 版本: 版本名称 版本 Finchley snapshot版 Edgware snapshot版 Dalston SR1 当前最新稳定版本 Camden SR7 稳定版本 Br ...

  2. 今天你上班了吗?来聊聊一个隐蔽了 5 年的BUG!

    前言 今天,我们要揭晓一个 FineUI 隐藏最深的一个BUG,这个问题从 2014-07-30 发布 FineUIPro v1.0.0 就一直存在,直到最新于 2020-01-10 发布的 v6.1 ...

  3. POJ_2185_二维KMP

    http://poj.org/problem?id=2185 求最小覆盖矩阵,把KMP扩展到二维,行一次,列一次,取最小覆盖线段相乘即可. #include<iostream> #incl ...

  4. CCF_ 201509-3_模板生成系统

    又是一道考验细心和耐心的题,不知道哪里出问题了,一直只有90分 = =! #include<cstdio> #include<iostream> #include<cst ...

  5. CCF_ 201409-3_字符串匹配

    水. #include<cstdio> #include<iostream> #include<cstring> using namespace std; int ...

  6. HDU6183 Color it (线段树动态开点)

    题意: 一个1e6*1e6的棋盘,有两个操作:给(x,y)加上颜色c,或查找(1,y1)到(x,y2)内的颜色种类数量,最多有50种颜色 思路: 建立50颗线段树,对每个颜色的线段树,维护每个y坐标上 ...

  7. 使用 Visual Studio 2015 + Python3.6 + tensorflow 构建神经网络时报错:'utf-8' codec can't decode byte 0xcc in position 78: invalid continuation byte

    使用 Visual Studio 2015 + Python3.6 + tensorflow 构建神经网络时报错:'utf-8' codec can't decode byte 0xcc in pos ...

  8. AtCoder Beginner Contest 156

    https://atcoder.jp/contests/abc156/tasks A - Beginner #include <bits/stdc++.h> #define ll long ...

  9. 获取本机网卡ip地址

    import sys, os import socket, struct, fcntl import six import psutil def get_ip(iface="enp0s3&q ...

  10. Linux系统下常见的数据盘分区丢失的问题以及对应的处理方法

    在修复数据前,您必须先对分区丢失的数据盘创建快照,在快照创建完成后再尝试修复.如果在修复过程中出现问题,您可以通过快照回滚将数据盘还原到修复之前的状态. 前提条件 在修复数据前,您必须先对分区丢失的数 ...