搭建Nginx反向代理并开启HTTPS支持
Nginx作为一款高性能的web服务器在互联网中得到了广泛应用,是运维必须掌握的技能之一。作为研发,偶尔也需要进行测试环境的搭建,因此研发也应当了解Nginx的搭建过程和机理,这样更能开阔眼界,毕竟技多不压身嘛。
本文就主要介绍如何利用Nginx搭建反向代理服务并开启HTTPS支持。
前期准备
在安装和配置Nginx之前我们需要做些准备工作。
我这里使用的是centos7服务器环境。
1. 关闭防火墙或者设置ip白名单
如果是内网测试环境,那么我们可以直接关闭linux防火墙。
关闭防火墙的方法分为永久性关闭和临时关闭两种情况:
永久性生效
开启:chkconfig iptables on 关闭:chkconfig iptables off
即时生效,重启后失效
开启:service iptables start 关闭:service iptables stop
这里我建议使用临时方式,因为测试环境一般不会是永久的,如果是长期的测试环境那么可以使用永久方式。
如果我们的环境要暴露给公网,那么最好只开放某些端口,即白名单机制。具体的配置方式如下:
我们此处以80和443为例,只放行这两个指定的端口,
// 放行80端口
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
// 放行443端口
/sbin/iptables -I INPUT -p tcp --dport 443 -j ACCEPT
// 保存iptables配置
/etc/rc.d/init.d/iptables save
// 重启防火墙
service iptables restart
除了命令方式外,我们还可以直接编辑iptables配置文件。具体方法如下:
//打开防火墙文件
sudo vim /etc/sysconfig/iptables
//新增行 开放80端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
// 新增行 开放443端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
//保存退出
//重启防火墙
sudo service iptables restart
Nginx下载及配置
准备工作完成,我们进入正题,讲解如何下载并最简化配置Nginx。
1. 下载安装依赖
我们这里采用源码方式安装,因此需要下载安装对应的依赖,当然你可以直接使用docker镜像或者二进制方式安装,不过这些不是本文讨论的重点,因此不予讲解还请自行查阅文档。
yum install gcc
yum install pcre-devel
yum install zlib zlib-devel
yum install openssl openssl-devel
//一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2. 下载nginx的tar包
依赖安装完毕,我们直接通过wget方式下载nginx的源码tar包
首先,创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
在创建的文件夹下,下载tar包并解开打包文件
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -xvf nginx-1.13.7.tar.gz
这里我使用的版本为1.13.7,你可以根据自己的需要选择对应的版本或者直接使用和我一样的版本,避免踩坑。
3. 安装nginx
接下来进入比较重要的一步,安装nginx
首先,进入nginx目录
cd /usr/local/nginx
执行命令,注意 由于我们要开启https支持,因此在这里要加入对应的配置参数,如果这里没有添加,直接使用默认的配置./configure,那么后续你需要做额外的工作弥补,而且有可能是不生效的,就得重新安装,因此这一步很重要!
./configure --with-http_ssl_module 启用https支持
接下来,执行make命令
make
这一步会慢些,等屏幕停止编译输出,继续执行安装命令
make install
这一步很快就结束,结束之后,nginx就安装完毕了。
nginx常用命令
安装完毕后,这一部分简单介绍下nginx的常用操作,基本上如果只是开发测试,掌握这些就足够了,需要更深入的操作还请查看相关文档。
//测试配置文件
安装路径下的/nginx/sbin/nginx -t
//启动命令
安装路径下的/nginx/sbin/nginx
//停止命令
安装路径下的/nginx/sbin/nginx -s stop
或者 : nginx -s quit
//重启命令
安装路径下的/nginx/sbin/nginx -s reload
//查看进程命令
ps -ef | grep nginx
//平滑重启
kill -HUP Nginx主进程号
Nginx开启HTTPS支持
这里我先贴一下我使用的配置,已经对重要的配置进行注释。
首先,配置文件的位置一般在/usr/local/nginx/conf/nginx.conf
我们只需要编辑这个文件并保存,然后重新加载nginx即可看到对应的配置生效与否,根据配置文件中error.log中的输出进行排错。
#user nobody;
worker_processes 1;
# 错误日志路径,建议开启
error_log /logs/nginx/error.log;
error_log /logs/nginx/error.log notice;
error_log /logs/nginx/error.log info;
# nginx进程id文件输出位置
pid /logs/nginx/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
# access_log输出格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# access_log输出路径
access_log /logs/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
# 设置80端口请求转发至443,https支持
server {
listen 80;
server_name localhost aaa.bbb.cn;
rewrite ^(.*)$ https://$host$1 permanent;
}
# https配置,重要的配置都在这个位置
server {
# 监听443端口
listen 443 ssl;
server_name localhost aaa.bbb.cn;
# 证书配置,将申请得到的证书放在服务器的某路径下,并配置在此处
ssl_certificate /xxxxxxx/server.pem;
ssl_certificate_key /xxxxxxx/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 默认根路径及其页面
location / {
root html;
index index.html index.htm;
}
# 设置根据相对路径请求转发
location /path1 {
proxy_pass http://172.30.66.164:8070/path1;
}
location /path2 {
proxy_pass http://172.30.66.164:8081/path2;
}
}
}
这里主要罗列几个注意点
80端口的请求转发至443端口,即全局https
server { listen 80; server_name localhost aaa.bbb.cn; rewrite ^(.*)$ https://$host$1 permanent; }
根据相对路径进行后端服务的反向代理
这种场景用于如果有多个后端服务想走一个域名配置,那么就可以根据对应服务的路径进行反向代理,通过路径找ip,从而访问到真实的后端服务。location /path1 { proxy_pass http://172.30.66.164:8070/path1; } location /path2 { proxy_pass http://172.30.66.164:8081/path2; } }
这里结合upstream可以开启负载均衡等的配置。
常见问题
最后,列出我在配置过程中遇到的一些小坑。
1. Nginx安装后添加未编译模块以及error.log报错nginx:[emerg]unknown directive “ssl”
Nginx安装后在重启时发生了错误,错误如下:
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in
/usr/local/nginx/conf/nginx.conf:117 //说明缺少http_ssl_module模块
解决方法如下:
步骤1:查看nginx编译安装时的命令,安装了哪些模块和ngnix版本
/usr/local/nginx/sbin/nginx -V
会显示如下信息:
nginx version: nginx/1.7.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
configure arguments: --prefix=/usr/local/nginx --user=www --group=www
步骤2:重新编译 nginx-1.7.7
wget http://nginx.org/download/nginx-1.7.7.tar.gz
tar zxvf nginx-1.7.7.tar.gz
cd nginx-1.7.7
//configure参数要和步骤1的configure arguments一模一样
./configure --prefix=/usr/local/nginx --with-http_ssl_module --user=www --group=www
make (没有make install)
步骤3:备份nginx的二进制文件
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
步骤4:覆盖nginx的二进制文件
cp objs/nginx /usr/local/nginx/sbin/
会提醒如下信息:
cp:是否覆盖"/usr/local/nginx/sbin/nginx"? y
cp: 无法创建普通文件"/usr/local/nginx/sbin/nginx": 文本文件忙 (nginx二进制文件繁忙,可以停止nginx,再试一次就可以了)
步骤5:重启nginx
service nginx start (或/etc/init.d/nginx start)
这里其实就是我在开头介绍首次下载配置nginx时候如何配置的那一步,如果没有添加 –with-http_ssl_module 参数之后的补救措施,但是我试了几次都还是提醒未生效,因此我的建议是一开始安装配置的时候就开启https支持。
参考链接
在安装配置的过程中,笔者参考了一些博客,感谢博主的付出,在此列出地址及主题,以供参考即致谢。
- Nginx中server_name 参数详解
https://blog.csdn.net/xiao______xin/article/details/53216736 - 详解Nginx虚拟主机配置中server_name的具体写法
https://blog.csdn.net/yyq411377361/article/details/78527389 - nginx 80端口重定向到443端口
https://blog.csdn.net/m0_37886429/article/details/72271983 - nginx反向代理(请求转发-URL匹配规则)
https://www.cnblogs.com/zhouXX/p/7215316.html - nginx根据URL分配请求给不同的服务
https://blog.csdn.net/H2520NY/article/details/80946774