CentOS7宝塔配置Nginx强制HTTPS访问,按照路径转发80端口的请求至两个docker服务路径

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;
}


  1. 在修改Nginx配置文件之前,需要先申请到SSL证书(一般租服务器时都可以免费申请到1年份的SSL证书),然后在相关页面下载证书的文件。我这里是nginx的,下载到的文件分别是XXXX.keyYYY.pem
  2. 在宝塔系统中,找到nginx的配置目录,我这里是/www/server/nginx/conf(宝塔傻瓜式安装nginx就给我这么装的)。发现这里默认没有存放SSL证书的配置目录cert,需要自己新建一个。
  3. 把刚才下载的SSL证书的XXX.keyYYY.pem文件放置到/www/server/nginx/conf/cert目录下。
  4. 宝塔系统->软件管理->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++之类的,有行号的编辑器查看比较方便对照修改。)

  1. 89行的server_name的"申请SSL证书的域名1 申请SSL证书的域名2",我当时是申请了"www.一段英文字母.com"和"一段英文字母.com"。这里写两个主要是想提醒可以用空格隔开,写多个(SSL证书申请时绑定的那几个域名可以全写上)
  2. 96行的server_name,和第1点的一样的修改。
  3. 99行的ssl_certificate,后面的值改成实际的.pem文件的文件名(包括后缀)
  4. 100行的ssl_certificate_key,和第3点修改差不多,.key文件全称
  5. 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端口的服务的响应)

你可能感兴趣的:(nginx)