Nginx
作为一个异步框架的 Web
服务器,也可以用作反向代理,负载平衡器 和 HTTP
缓存,下面本篇文章就来介绍一下Nginx
反向代理、SSL
及域名配置。
基于公司中标某公司项目,作为项目产品组一员,前期负责服务器环境搭建部分。技术架构如下:
其中,主要实现点如下:
nginx
反向代理解决。nginx
正向代理解决。SSL
传输加密处理。上传Nginx
安装包到服务器
tar -zxvf nginx1.16.1.tar.gz
cd nginx1.16.1
yum localinstall *.rpm
nginx_config.zip
解压。unzip nginx_config.zip -d nginx_config/
nginx.conf
和conf.d/default.conf
替换至服务器/etc/nginx/
中的相应文件。aimonitor-front
的前端文件夹压缩,并复制至nginx安装目录(/usr/share/nginx/html/
),改名为AImonitor
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
nginx.conf
和conf.d/default.conf
中的IP信息。nginx
systemctl start nginx
如果启动成功,效果如下
javascript systemctl restart nginx(重启)
当修改了配置文件使用:
nginx -s reload
建议不要停止再重启,以防报错。
反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器。
反向代理(Reverse Proxy
),其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
nginx
反向代理http
配置步骤如下:
vi /etc/nginx/nginx.conf
新增如下配置信息: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读操作的最大间隔时长
}
}
nginx -s reload
重新加载配置。前面提到过,正向代理代理客户端,反向代理代理服务器。
理解正向代理、反向代理这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。
正向代理:如果把局域网外的Internet
想象成一个巨大的资源库,则局域网中的客户端要访问Internet
,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
Nginx
配置如下:
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 正向代理配置说明:
DNS
解析 IP
地址,比如 Google Public DNS
,以及超时时间(5秒)。resolver 8.8.8.8;
resolver_timeout 5s;
Nginx
变量组成。其中 proxy_set_header
部分的配置,是为了解决如果 URL
中带 “.
”(点)后 Nginx
503 错误。proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
I/O
,以及代理连接超时时间。proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
Http
状态缓存时间。proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
注意⚠️:nginx正向代理不支持代理 Https
网站。
因为 Nginx
不支持 CONNECT
,所以无法正向代理 Https
网站。如果访问 Https
网站,比如:https://www.google.com
,Nginx access.log
日志如下:
"CONNECT www.google.com:443 HTTP/1.1" 400
配置完nginx
之后, nginx -s reload
重新加载配置。
如果出现80
端口被占用,Lsof -i :80
查看80端口的pid
进程号,然后用Kill -9 +进程号
,删除进程,再重启服务。
查看dns
方法
cat /etc/resolv.conf
在需要访问外网的机器上(Linux系统)执行以下操作之一即可:
export http_proxy=http://yourproxyaddress:proxyport
gedit ~/.bashrc
export http_proxy=http://yourproxyaddress:proxyport
其中,yourproxyaddress也就是你的Nginx
服务器的ip了,proxyport
就是上面配置中的80,可以根据自己的需要修改。
nginx
本身是不支持https
协议请求转发,为了让nginx
能达到这一效果需要借助第三方模块ngx_http_proxy_connect_module。首先下载这一模块到服务器,然后准备nginx
环境。
// 下载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
编译安装成功后,配置nginx
正向代理:
#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;
}
}
}
当配置文件配置好之后保存即可,重启nginx
,进行测试:
nginx -s reload
重新加载配置。
去内网服务器里curl
,可以在环境变量里添加代理:
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
通过四、五章节的讲解,正向代理代理客户端,反向代理代理服务器。可以看到反向代理服务器对客户端透明,客户端无需任何配置,只需访问反向代理服务器IP,即可实现访问内网服务。Nginx反向代理服务器只需配置相应的代理规则即可。
正向代理代理客户端,需要在作为Nginx正向代理服务器中配置相应的代理规则,配置方式与反向代理基本一致,同一服务器既作为反向代理服务器、又作为正向代理服务器,是由监听端口转发。Nginx作为正向代理服务器无法代理Https,若需支持的话,需要额外安装第三方模块ngx_http_proxy_connect_module
。
随着互联网的快速发展,给我们的生活带来便利的同时,也伴随着网络钓鱼、信息泄露、网络诈骗等网络安全事件的频繁发生,企业网站被钓鱼网站仿冒,遭受经济损失,影响品牌形象。
如果网站不使用SSL
证书,数据以HTTP
明文传输,极容易被第三方监听、截取和篡改,而导致用户信息被泄露,给在线用户带来直接损失。通过部署SSL
证书后能确保信息传输的安全性,可防止信息泄露。
SSL(Secure Sockets Layer
安全套接字协议),及其继任者传输层安全(Transport Layer Security
,TLS
)是为网络通信提供安全及数据完整性的一种安全协议。TLS
与SSL
在传输层与应用层之间对网络连接进行加密。
SSL
证书是数字证书(数字证书包括:SSL证书、客户端证书、代码签名证书等)的一种,因为配置在服务器上也称为服务器SSL证书
。SSL证书
就是遵守SSL
协议,由受信任的数字证书颁发机构CA
(如:沃通CA)在验证服务器身份后颁发的一种数字证书,它使用ssl
协议在浏览器和web server
之间建立一条安全通道,数据信息在client
与server
之间的安全传输.。
SSL协议
的特点:
SSL协议
可用于保护正常运行于TCP
之上的任何应用协议,如HTTP、FTP、SMTP
或Telnet
的通信,最常见的是用SSL
来保护HTTP
的通信。SSL协议
的优点在于它是与应用层协议无关的。高层的应用协议(如HTTP、FTP、Telnet
等)能透明地建立于SSL协议
之上。SSL协议
在应用层协议之前就已经完成加密算法、通信密钥的协商以及服务器的认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的安全性。SSL
的功能 :
SSL
服务器允许客户的浏览器使用标准的公钥加密技术和一些可靠的认证中心(CA
)的证书,来确认服务器的合法性。SSL
要求客户与服务器之间所有发送的数据都被发送端加密、接收端解密,同时还检查数据的完整性。使用SSL证书
的优势:
SSL证书
用于实现数据加密传输,防止数据被泄露和篡改;SEO
搜索引擎排名;配置SSL
模块首先需要CA
证书,CA
证书可以自己手动颁发也可以在阿里云申请。
默认情况下ssl
模块并未被安装,如果要使用该模块则需要在编译nginx
时指定–with-http_ssl_module
参数。
本小节主要讲述如何通过证书签名生成CA证书。
首先确认nginx
服务器已经安装openssl
和nginx
已经编译ssl
的模块。
生成秘钥和CA证书步骤:
首先,创建一个用来存放秘钥的文件夹。
输入加密算法:openssl genrsa -idea -out jesonc.key 1024
回车,会让输入密码,这里设置为123456,完成后会生成一个.key
的文件
openssl req -new -key jesonc.key -out jesonc.csr
打包:openssl x509 -req -days 3650 -in jesonc.csr -signkey jesonc.key -out jesonc.crt
-days 3650:证书过期时间,10年
https
默认采用 SHA-1
算法,非常脆弱。我们可以使用迪菲-赫尔曼密钥交换。
我们在 /conf/ssl
目录下生成 dhparam.pem
文件
openssl dhparam -out dhparam.pem 2048
下面的配置 ssl_protocols
和 ssl_ciphers
是用来限制连接只包含 SSL/TLS
的加強版本和算法。
进入/etc/nginx/conf.d/
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;
}
}
如果要实现http
强制跳转到https
,可以添加下面配置段:
server {
listen 80;
server_name www.ydyw.com;
# 跳转到HTTPS
return 301 https://$server_name$request_uri;
}
注意⚠️:网上也有许多使用 rewrite
来重定向,但是 return
指令简单高效,建议尽量使用 return
。
配置好之后,nginx -s reload
重新加载配置。
确认已启用443的监听:netstat -luntp|grep 443
上面server
部分第2-5项是关键。这些配置放在 server
块就可以对其中的所有 location
生效了,并且同时支持 http
和 https
。或者把 http
和 https
分开配置也很常见。
和Apache
配置不同,Nginx
需要将服务器证书和ca证书链合并到一个文件中,作为 ssl_certificate
配置内容。
例如,按照证书链从下向上的顺序,我有三个证书:
ssl.crt
(自己域名的服务器证书)sub.class1.server.ca.pem
(startssl
的一类证书)ca.pem
(startssl
的根证书)配好之后,启动nginx
会要你输入密钥的密码。这是因为 ssl_certificate_key
配置对应的文件(也就是 startssl
给你的私钥文件)内容是加密的,需要输入你创建这个时设置的密码才能解密。这样私钥虽然很安全,但是每次重启服务都要输入一次密码也太麻烦了。其实,只要证书改为解密了的内容,就可以避免每次输入密码。用如下命令即可:openssl rsa -in ssl.key -out newssl.key
输入密码,就生成了解密后的私钥内容,使用这个就OK了。
但是就像前面说的,一定要在服务器上保护好它,例如:
chmod 400 ssl.key (仅root可读)
SSL
很消耗 CPU
资源,尤其是在建立连接的握手阶段。一是通过开启 keepalive
可以重用连接。二是可以重用和共享ssl session
,见上面ssl_session
相关配置。
会话存储在工作人员之间共享的 SSL
会话缓存中,并由 ssl_session_cache
参数配置。1 兆字节的缓存包含大约 4000 个会话。默认缓存超时为 5 分钟。它可以通过使用增加 ssl_session_timeout
指令。
nginx -s stop
快速停止nginx -s quit
完整停止nginx -s reload
重新加载配置ps -ef | grep nginx
查看进程idkill [option] 进程id
option: (1) -9强制杀死; (2)TERM或INT快速停止服务; (3)QUIT平缓停止nginx -v
查看版本nginx -t
检查配置文件nginx -s stop -c /etc/nginx/nginx.conf
nginx -c /etc/nginx/nginx.conf
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://shq5785.blog.csdn.net/article/details/122575630
内容来源于网络,如有侵权,请联系作者删除!