CentOS7宝塔配置Nginx强制HTTPS访问,按照路径转发80端口的请求至两个docker服务路径
下面是自我吐槽,可以直接略过
ps:起初是打算用docker-compose搭建nginx,然后再配置http转发到HTTPS,以及根据url路径选择不同的docker服务。然而在docker中配置了很久,一直没配好,导致服务器崩溃了好几次,额。最后还是选择了宝塔,在其nginx的配置基础上做修改。(docker的和傻瓜式的宝塔下载的nginx所用到的配置文件等目录还不太一样)主要自己对nginx的配置识别等规则还是不太熟。
这里先放出宝塔下载的nginx1.15的配置文件原件内容
user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
http
{
include mime.types;
#include luawaf.conf;
include proxy.conf;
default_type application/octet-stream;
server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server_tokens off;
access_log off;
server
{
listen 888;
server_name www.bt.cn;
index index.html index.htm index.php;
root /www/server/phpmyadmin;
#error_page 404 /404.html;
include enable-php.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /www/wwwlogs/access.log;
}
include /www/server/panel/vhost/nginx/*.conf;
}
- 在修改Nginx配置文件之前,需要先申请到SSL证书(一般租服务器时都可以免费申请到1年份的SSL证书),然后在相关页面下载证书的文件。我这里是nginx的,下载到的文件分别是
XXXX.key和YYY.pem。 - 在宝塔系统中,找到nginx的配置目录,我这里是
/www/server/nginx/conf(宝塔傻瓜式安装nginx就给我这么装的)。发现这里默认没有存放SSL证书的配置目录cert,需要自己新建一个。 - 把刚才下载的SSL证书的
XXX.key和YYY.pem文件放置到/www/server/nginx/conf/cert目录下。 - 宝塔系统->软件管理->nginx1.15->设置,配置修改
user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
http
{
include mime.types;
#include luawaf.conf;
include proxy.conf;
default_type application/octet-stream;
server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server_tokens off;
access_log off;
server
{
listen 888;
server_name www.bt.cn;
index index.html index.htm index.php;
root /www/server/phpmyadmin;
#error_page 404 /404.html;
include enable-php.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /www/wwwlogs/access.log;
}
server {
listen 80;
server_name 申请SSL证书的域名1 申请SSL证书的域名2; #将localhost修改为您证书绑定的域名,例如:www.example.com。
# 比如 server_name www.shishikan.com shishikan.com
rewrite ^(.*)$ https://$host$1 permanent; #将所有http请求通过rewrite重定向到https。
}
# 以下属性中以ssl开头的属性代表与证书配置有关,其他属性请根据自己的需要进行配置。
server {
listen 443 ssl; #SSL协议访问端口号为443。此处如未添加ssl,可能会造成Nginx无法启动。
server_name 申请SSL证书的域名1 申请SSL证书的域名2; #将localhost修改为您证书绑定的域名,例如:www.example.com。
root html;
index index.html index.htm;
ssl_certificate cert/YYY.pem; #将domain name.pem替换成您证书的文件名。
ssl_certificate_key cert/XXX.key; #将domain name.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;
location ^~ /docker服务1路径前缀/ {
proxy_pass http://服务器ip:docker服务1端口;
}
location ^~ /docker服务2路径前缀/ {
proxy_pass http://服务器ip:docker服务2端口;
}
}
include /www/server/panel/vhost/nginx/*.conf;
}
上面需要修改的总共5处(复制上面内容到notepad++之类的,有行号的编辑器查看比较方便对照修改。)
- 89行的
server_name的"申请SSL证书的域名1 申请SSL证书的域名2",我当时是申请了"www.一段英文字母.com"和"一段英文字母.com"。这里写两个主要是想提醒可以用空格隔开,写多个(SSL证书申请时绑定的那几个域名可以全写上) - 96行的
server_name,和第1点的一样的修改。 - 99行的
ssl_certificate,后面的值改成实际的.pem文件的文件名(包括后缀) - 100行的
ssl_certificate_key,和第3点修改差不多,.key文件全称 - 105行-110行的
location配置,我这里是配置了2个docker服务的转发。比如你的服务器公网ip是12.200.12.200(打个比方),然后你有2个docker容器其服务端口分别映射到宿主机的10001和10002,docker服务1的url为ip:port/docker1/然后一堆别的啥,docker服务2的url为ip:port/docker2/然后一堆别的啥。那么你就可以配置如下:
然后假如你域名是location ^~ /docker1/ { proxy_pass http://12.200.12.200:10001; } location ^~ /docker2/ { proxy_pass http://12.200.12.200:10002; }shishi.com,(假设下列url有对应的controller之类的提供服务了)你访问http://shishi.com/docker1/home/test?page=1会自动跳转到https://shishi.com/docker1/home/test?page=1。(其实是nginx替我们这些访问者转发了请求给服务器的10001端口,再把响应的结果返回回来,所以我们访问80实际访问的是其10001端口提供的服务。考虑安全性可以不对外开放10001端口,使得只有本地nginx能够访问,然后把结果交付用户。这个就自己配置防火墙啥的。另一个docker2类似,也是我们只要访问80端口下的/docker2/XXXXX,就能得到服务器上在10002端口的服务的响应)
本文介绍了如何在CentOS7上使用宝塔面板配置Nginx以实现HTTPS强制访问,并通过路径将80端口请求转发到两个Docker服务。内容涉及SSL证书安装、Nginx配置文件修改以及Docker服务的URL路径映射,旨在提升服务器的安全性和服务访问的便捷性。
4253

被折叠的 条评论
为什么被折叠?



