1. nginx下载
本文所用软件包
nginx-1.24.0.tar.gz
下载地址:(https://nginx.org/download/nginx-1.24.0.tar.gz)(最新)源码包
headers-more-nginx-module-0.34.tar.gz
下载地址(https://codeload.github.com/openresty/headers-more-nginx-module/tar.gz/refs/tags/v0.34)(最新)插件源码
2. nginx安装
2.1首次源码安装nginx
#查看gcc版本
gcc -v
#安装gcc
yum -y install gcc
#pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库
yum install -y pcre pcre-devel
#zlib安装
yum install -y zlib zlib-devel
#安装openssl
yum install -y openssl openssl-devel
#下载nginx安装包
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 下载headers-more-nginx-module安装包
wget https://codeload.github.com/openresty/headers-more-nginx-module/tar.gz/refs/tags/v0.34
# 解压文件
tar -zxvf nginx-1.24.0.tar.gz
tar -zxvf v0.34
#切换到 /root/nginx-1.24.0下面
cd /root/nginx-1.24.0
# 执行命令
./configure --prefix=/usr/local/nginx
make
make install
#查看nginx是否正常安装
whereis nginx
#切换到/usr/local/nginx安装目录
cd /usr/local/nginx/conf
#配置nginx的配置文件nginx.conf文件,主要也就是端口
vim nginx.conf
# 创建 错误日志文件夹
mkdir /var/log/nginx/
#nginx常用命令
#先进入nginx目录
cd /usr/local/nginx/sbin
#启动服务
./nginx
#测试配置是否正常
./nginx -t
#重新加载
./nginx -s reload
#关闭服务
./nginx -s stop
查看nginx服务是否启动成功
ps -ef | grep nginx
2.2安装ssl相关模块和headers-more-nginx-module模块
# 先查看nginx原有的模块 /usr/local/nginx/sbin/nginx -V #configure arguments: --prefix=/usr/local/nginx则代表未安装SSL模块,未安装headers-more-nginx-module模块 # 那么安装好的参数应该是这样 #在之前解压的nginx源码目录下执行以下 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --add-module=/root/headers-more-nginx-module-0.34 (解压后的目录) # --add-module=其他模块如echo模块 # make生成 make #这里不要进行make install,否则就是覆盖安装 # 然后备份原有已安装好的nginx cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak # 然后将刚刚编译好的nginx覆盖掉原有的nginx(这个时候nginx要停止状态) # 先停止nginx /usr/local/nginx/sbin/nginx -s stop # 再进行覆盖 cp ./objs/nginx /usr/local/nginx/sbin/ # 然后启动nginx,仍可以通过命令查看是否已经加入成功 /usr/local/nginx/sbin/nginx -V # 配置信息指向-调整 # 如果无法停止nginx 可能配置指向已经变化,需要重现调整回原来自己配置的路径 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf |
3.配置ssl
3.1生成自签名脚本
脚本具体代码如下(有部分修改):根据需求也可以自行修改脚本代码,比如有效时长等等
#!/bin/sh
# create self-signed server certificate:
read -p "Enter your domain [www.example.com]: " DOMAIN
echo "Create server key..."
openssl genrsa -des3 -out $DOMAIN.key 1024
echo "Create server certificate signing request..."
SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"
openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr
echo "Remove password..."
mv $DOMAIN.key $DOMAIN.origin.key
openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key
echo "Sign SSL certificate..."
openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt
echo "TODO:"
echo "Copy $DOMAIN.crt to /etc/nginx/ssl/$DOMAIN.crt"
echo "Copy $DOMAIN.key to /etc/nginx/ssl/$DOMAIN.key"
echo "Add configuration in nginx:"
echo "server {"
echo " listen 443 ssl"
echo " ..."
echo " ssl on;"
echo " ssl_certificate /etc/nginx/ssl/$DOMAIN.crt;"
echo " ssl_certificate_key /etc/nginx/ssl/$DOMAIN.key;"
echo " ssl_protocols TLSv1 TLSv1.1 TLSv1.2"
echo " ssl_ciphers HIGH:!aNULL:!MD5"
echo "}"
将以上脚本保存为sh文件,如:gencert.sh
3.2生成证书操作
$ sh ./gencert.sh # 根据提示输入域名以及四次口令,注意这四次口令输入的都是一样的且同时包含字母和数字 |
执行上面的脚本后,会在脚本所在目录生成证书
3.3配置ssl
# 复制证书至/etc/nginx/ssl目录,如果目录不存在,请新建 cp test.com.crt /etc/nginx/ssl/test.com.crt cp test.com.key /etc/nginx/ssl/test.com.key # 修改nginx的server配置 server { listen 443 ssl; #强制使用https访问 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always; ...# 此处省略其它配置内容 ssl_certificate /etc/nginx/ssl/test.com.crt; #证书格式有多种,常见的有pem、cer等 ssl_certificate_key /etc/nginx/ssl/test.com.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; } |
4.配置代理
添加对302重定向地址的处理,并代理相关应用程序
# 使用map指令解析要更改的$location变量 map $sent_http_location $location{ ~/cas-server([\S]+$) https://172.16.20.111/cas-server$1; ~/oaquery([\S]+$) https://172.16.20.111/oaquery$1; default $sent_http_location; } #高版本的Nginx用这种方式 #注意:有的版本中,通过$upstream_http_Location会一直取不到值,可以使用$sent_http_location来代替,$sent_http_location是不带IP的请求路径 # map 指令是由 ngx_http_map_module 模块提供的,默认情况下安装 nginx 都会安装该模块。 # map 的主要作用是创建自定义变量,通过使用 nginx 的内置变量,去匹配某些特定规则,如果匹配成功则设置某个值给自定义变量。 而这个自定义变量又可以作于他用。 # 以上代码作用为:将响应的location,按照请求前缀进行匹配,并重新组装为新定义变量$location。 # ~/cas-server([\S]+$):代表以/cas-server开头的路径,其中([\S]+$)代表将/cas-server后面的部分定义变量;匹配的路径将映射到https://172.16.20.111/cas-server$1;,$1即为([\S]+$)匹配的变量,最后拼成新的location地址 # default:表示以上匹配规则都匹配不成功时,默认设置的location地址 # 注意:([\S]+$)匹配的是任意非空白字符,如果是http://172.16.20.22:8088/cas-server这样的地址将不会匹配,为此需要修改程序跳转的地址,只需在后面添加/,即 http://172.16.20.22:8088/cas-server/就可以了 # 对相关应用配置代理,并设置302重定向地址 location /cas-server { proxy_pass http://172.16.20.22:8088; more_set_headers -s '302' "Location $location"; } location /oaquery { proxy_pass http://172.16.20.190:9099; more_set_headers -s '302' "Location $location"; } |
5.测试
浏览器访问:https://172.16.20.111/oaquery,
发现重定向地址并不是程序中配置的默认地址 http://172.16.20.22:8088/cas-server/login?service=http%3A%2F%2F172.16.20.190%3A9099%2Foaquery%2Fj_cas_login
至此,Nginx反向代理解决cas-server单点登录内外网问题配置已完成