Bootstrap

分布式进阶(二十三):Nginx 服务器应用详解

一、前言

作为一个异步框架的 服务器,也可以用作反向代理,负载平衡器 和 缓存,下面本篇文章就来介绍一下反向代理、及域名配置。

基于公司中标某公司项目,作为项目产品组一员,前期负责服务器环境搭建部分。技术架构如下:

其中,主要实现点如下:

二、环境搭建

2.1 Nginx 安装

上传安装包到服务器

tar -zxvf nginx1.16.1.tar.gz
cd nginx1.16.1
yum localinstall *.rpm

2.2 Nginx 配置

  unzip nginx_config.zip -d nginx_config/

  tar -cz aimonitor-front -f aimonitor.tar.gz
  cp aimonitor.tar.gz /usr/share/nginx/html/
  tar -zxf aimonitor.tar.gz
  mv aimonitor-front AImonitor

  systemctl start nginx

如果启动成功,效果如下

  systemctl restart nginx(重启)

当修改了配置文件使用:

nginx -s reload

建议不要停止再重启,以防报错。

二、反向代理配置

2.1 什么是反向代理?

反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器。

反向代理(),其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

2.2 反向代理的好处

2.3 http 反向代理配置信息

反向代理配置步骤如下:

server {
  listen 80; #监听端口
  server_name www.zyjk.com; #域名可以有多个,用空格隔开
  charset utf-8; #编码方式
  #对‘/’启用反向代理
  location / {
    proxy_pass http://22.188.15.185; #必须要加http开头
    proxy_set_header X-Real-IP $remote_addr;
  }
  #对‘/images’启用反向代理
  location /images {
    proxy_pass http://22.188.15.186; #必须要加http开头
    proxy_set_header X-Real-IP $remote_addr;
    client_max_body_size 10m; #最大消息体
    client_body_buffer_size 128k; #最大缓存消息体
    proxy_connect_timeout 30; #nginx将一个请求发送至upstream server之前等待的最大时长
    proxy_send_timeout 30; # 在连接断开之前两次发送至upstream server写操作的最大间隔时长
    proxy_read_timeout 30; #在连接断开之前两次从接收upstream server读操作的最大间隔时长
  }
}

三、反向代理集群搭建(待补充)

四、正向代理配置

4.1 什么是正向代理?

前面提到过,正向代理代理客户端,反向代理代理服务器

理解正向代理反向代理这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。

4.2 http 正向代理配置信息

正向代理:如果把局域网外的想象成一个巨大的资源库,则局域网中的客户端要访问,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

配置如下:

server {
    resolver 8.8.8.8;
    resolver_timeout 5s;
    listen 0.0.0.0:80;
    access_log  /home/reistlin/logs/proxy.access.log;
    error_log   /home/reistlin/logs/proxy.error.log;
    location / {
        proxy_pass $scheme://$host$request_uri;
        proxy_set_header Host $http_host;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout 30;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 301 1h;
        proxy_cache_valid any 1m;
    }
}

Nginx 正向代理配置说明

  resolver 8.8.8.8;
  resolver_timeout 5s;

  proxy_pass $scheme://$host$request_uri;
  
  proxy_set_header Host $http_host;

  proxy_buffers 256 4k;
  
  proxy_max_temp_file_size 0;
  
  proxy_connect_timeout 30;

  proxy_cache_valid 200 302 10m;
  
  proxy_cache_valid 301 1h;
  
  proxy_cache_valid any 1m;

注意⚠️:nginx正向代理不支持代理 网站。

因为 不支持 ,所以无法正向代理 网站。如果访问 网站,比如:, 日志如下:


 "CONNECT www.google.com:443 HTTP/1.1" 400

配置完之后, 重新加载配置。

如果出现端口被占用, 查看80端口的进程号,然后用,删除进程,再重启服务。

查看方法

cat /etc/resolv.conf 

4.3 正向代理使用

在需要访问外网的机器上(Linux系统)执行以下操作之一即可:

export http_proxy=http://yourproxyaddress:proxyport 

gedit ~/.bashrc  
export http_proxy=http://yourproxyaddress:proxyport 

其中,yourproxyaddress也就是你的服务器的ip了,就是上面配置中的80,可以根据自己的需要修改。

4.4 Nginx 支持正向代理 https

本身是不支持协议请求转发,为了让能达到这一效果需要借助第三方模块。首先下载这一模块到服务器,然后准备环境。

// 下载gcc,之后还可能有一些安装包要下
yum -y install pcre-devel zlib-devel gcc gcc+c++ make openssl-devel pcre-devel  zlib-devel patch   
tar xf nginx-1.6.0.tar.gz
unzip /root/ngx_http_proxy_connect_module-master.zip
cd  /root/nginx-1.6.0/
patch  -p1 < /root/ngx_http_proxy_connect_module-master/proxy_connect.patch  
./configure --add-module=/root/ngx_http_proxy_connect_module-master/ngx_http_proxy_connect_module
make &&  make install

编译安装成功后,配置正向代理:

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
 
server {
        listen 88;                #监听端口
        resolver 183.60.82.98;   #dns解析地址
        server_name  _;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
             proxy_pass https://$host$request_uri;     #设定http代理服务器的协议和地址
             proxy_set_header HOST $host;
             proxy_buffers 256 4k;
             proxy_max_temp_file_size 0k;
             proxy_connect_timeout 30;
             proxy_send_timeout 60;
             proxy_read_timeout 60;
             proxy_next_upstream error timeout invalid_header http_502;
            #root   html;
            #index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root  html;
        }
    }
 
server {
       resolver 8.8.8.8;   #dns解析地址
       listen 89;          #代理监听端口
       proxy_connect;
       proxy_connect_allow            443 563;
       location / {
             proxy_pass https://$host$request_uri;     #设定https代理服务器的协议和地址
             proxy_set_header HOST $host;
             proxy_buffers 256 4k;
             proxy_max_temp_file_size 0k;
             proxy_connect_timeout 30;
             proxy_send_timeout 60;
             proxy_read_timeout 60;
             proxy_next_upstream error timeout invalid_header http_502;
       }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }  
}  

当配置文件配置好之后保存即可,重启,进行测试:

重新加载配置。

去内网服务器里,可以在环境变量里添加代理:

vim  /etc/profile

...
...
#export https_proxy=正向代理IP:端口
export https_proxy=192.168.3.17:89

另一种方式不用加环境变量,临时代理

#curl -i  --proxy 代理IP:端口      要访问域名
curl -i  --proxy 192.168.3.17:89      www.baidu.com

4.4 正向、反向代理对比

通过四、五章节的讲解,正向代理代理客户端,反向代理代理服务器。可以看到反向代理服务器对客户端透明,客户端无需任何配置,只需访问反向代理服务器IP,即可实现访问内网服务。Nginx反向代理服务器只需配置相应的代理规则即可。

正向代理代理客户端,需要在作为Nginx正向代理服务器中配置相应的代理规则,配置方式与反向代理基本一致,同一服务器既作为反向代理服务器、又作为正向代理服务器,是由监听端口转发。Nginx作为正向代理服务器无法代理Https,若需支持的话,需要额外安装第三方模块。

五、SSL 配置

5.1 敲黑板

随着互联网的快速发展,给我们的生活带来便利的同时,也伴随着网络钓鱼、信息泄露、网络诈骗等网络安全事件的频繁发生,企业网站被钓鱼网站仿冒,遭受经济损失,影响品牌形象。

如果网站不使用证书,数据以明文传输,极容易被第三方监听、截取和篡改,而导致用户信息被泄露,给在线用户带来直接损失。通过部署证书后能确保信息传输的安全性,可防止信息泄露。

SSL(安全套接字协议),及其继任者传输层安全(,)是为网络通信提供安全及数据完整性的一种安全协议。与在传输层应用层之间对网络连接进行加密。

证书是数字证书(数字证书包括:SSL证书客户端证书代码签名证书等)的一种,因为配置在服务器上也称为。就是遵守协议,由受信任的数字证书颁发机构(如:沃通CA)在验证服务器身份后颁发的一种数字证书,它使用协议在浏览器和之间建立一条安全通道,数据信息在与之间的安全传输.。

的特点:

的功能 :

使用的优势:

  • 用于实现数据加密传输,防止数据被泄露和篡改;

  • 用于认证服务器身份,防范被钓鱼网站攻击;

  • 用于消除浏览器地址栏发出的“不安全”警告;

  • 提高搜索引擎排名;

  • 提升用户对网站的信任;

  • 有助于提高网站的在线销售业绩;

配置模块首先需要证书,证书可以自己手动颁发也可以在阿里云申请。

默认情况下模块并未被安装,如果要使用该模块则需要在编译时指定参数。

5.2 CA 证书生成

本小节主要讲述如何通过证书签名生成CA证书。

首先确认服务器已经安装和已经编译的模块。

生成秘钥和CA证书步骤:

  • 步骤1:生成key秘钥

  • 步骤2:生成证书签名请求文件(csr文件)

  • 步骤3:生成证书签名文件(CA文件)

5.2.1 生成 key 秘钥

首先,创建一个用来存放秘钥的文件夹。

输入加密算法:

回车,会让输入密码,这里设置为123456,完成后会生成一个的文件

5.2.2 生成证书签名请求文件(csr 文件)

openssl req -new -key jesonc.key -out jesonc.csr

5.2.3 生成证书签名文件(CA 文件)

打包:

 -days 3650:证书过期时间,10年

5.3 https 反向代理配置信息

默认采用 算法,非常脆弱。我们可以使用迪菲-赫尔曼密钥交换。

我们在 目录下生成 文件

openssl dhparam -out dhparam.pem 2048

下面的配置 和 是用来限制连接只包含 的加強版本和算法。

进入

server
{
  listen 443;
  server_name 192.168.1.141 jeson.t.imooc.io;
  ssl on;
  ssl_certificate /etc/nginx/ssl_key/jesonc.crt;
  ssl_certificate_key /etc/nginx/ssl_key/jesonc.key;
  #ssl_certificate_key /etc/nginx/ssl_key/jesonc_nopass.key;
  ssl_session_cache    shared:SSL:10m; # 配置共享会话缓存大小
  ssl_session_timeout  10m; # 配置会话超时时间
  # 优先采取服务器算法
  ssl_prefer_server_ciphers on;
    # 使用 DH 文件
    ssl_dhparam       ssl/dhparam.pem;
  # 协议版本
    ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
    # 定义算法
    ssl_ciphers     EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
 
   # 启用 HSTS,允许 https 网站要求浏览器总是通过 https 来访问
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; 
    add_header X-Frame-Options DENY; # 减少点击劫持
    add_header X-Content-Type-Options nosniff; # 防XSS攻擊
    add_header X-Xss-Protection 1;

  index index.html index.htm;
  location / {
    root /opt/app/code;
  }
}

如果要实现强制跳转到,可以添加下面配置段:

server {
    listen       80;       
    server_name www.ydyw.com;
    # 跳转到HTTPS
    return 301 https://$server_name$request_uri;
}

注意⚠️:网上也有许多使用 来重定向,但是 指令简单高效,建议尽量使用 。

配置好之后,重新加载配置。

确认已启用443的监听:

上面部分第2-5项是关键。这些配置放在 块就可以对其中的所有 生效了,并且同时支持 和 。或者把 和 分开配置也很常见。

5.3.1 合并证书配置文件

和配置不同,需要将服务器证书ca证书链合并到一个文件中,作为 配置内容。例如,按照证书链从下向上的顺序,我有三个证书:

  • (自己域名的服务器证书)

  • ( 的一类证书)

  • ( 的根证书)把它们的内容按顺序连接到的一个文件中,每个内容另起一行,中间没有空行或空格。

5.3.2 避免启动时输入密码

配好之后,启动 会要你输入密钥的密码。这是因为 配置对应的文件(也就是 给你的私钥文件)内容是加密的,需要输入你创建这个时设置的密码才能解密。这样私钥虽然很安全,但是每次重启服务都要输入一次密码也太麻烦了。其实,只要证书改为解密了的内容,就可以避免每次输入密码。用如下命令即可: 输入密码,就生成了解密后的私钥内容,使用这个就OK了。

但是就像前面说的,一定要在服务器上保护好它,例如:

chmod 400 ssl.key (仅root可读)

5.3.3 优化 SSL 配置

很消耗 资源,尤其是在建立连接的握手阶段。一是通过开启 可以重用连接。二是可以重用和共享,见上面相关配置。

会话存储在工作人员之间共享的 会话缓存中,并由 参数配置。1 兆字节的缓存包含大约 4000 个会话。默认缓存超时为 5 分钟。它可以通过使用增加 指令。

六、域名申请(待补充)

七、拓展阅读

  • 快速停止

  • 完整停止

  • 重新加载配置

  • 查看进程id

  • option: (1) -9强制杀死; (2)TERM或INT快速停止服务; (3)QUIT平缓停止

  • 查看版本

  • 检查配置文件关闭:启动:

八、延伸阅读