Bootstrap

Nginx多域名,多证书,多服务配置,实用版

本文主要讲解在Nginx配置多个域名,多证书,多服务,核心是nginx配置文件。

1. 情景介绍

  • 现在有一个项目,有测试环境和正式环境,已经为两个环境各自申请到域名和ssl证书
  • 正式环境
    • 域名:xxx.com www.xxx.com
    • 证书:xxx.com_bundle.pemxxx.com.key
  • 测试环境
    • 域名:test-xxx.com www.test-xxx.com
    • 证书:test-xxx.com_bundle.pemtest-xxx.com.key
  • 目前想要通过Nginx他们配置到同一台服务器上,要求如下
    • 实现http重定向到https
    • 添加域名和证书
  • 目前已经在服务器上将nginx安装到/usr/local/nginx,并且已经为nginx创建了系统命令
  • /usr/local/nginx目录主要内容如下
    - conf
        - nginx.conf
    - sbin
    	- nginx
    
  • nginx已经编译了ssl相关依赖

2. 解决方案

  • Ⅰ. 将证书文件上传至服务器
    • /usr/local/nginx下创建ssl目录,用于存放证书
      cd /usr/local/nginx
      mkdir ssl
      
    • 将证书相关文件全部上传至ssl目录下
      cd ssl
      rz 
      
    • 最后结果如下,证书文件既可以是.crt也可以是.pem,两者都有效
      nginx
          - ssl
             - xxx.com_bundle.pem
             - xxx.com.key
             - test-xxx.com_bundle.pem
             - test-xxx.com.key
      
  • Ⅱ. 修改/usr/local/nginx/conf/nginx.conf,内容如下
    • 正式环境的配置文件
      # Nginx的主配置文件
      
      user nginx;  # 运行Nginx的用户名,可能需要根据你的系统进行调整
      worker_processes auto;  # 工作进程的数量,auto会根据CPU核心数自动设置
      
      error_log /var/log/nginx/error.log;  # 错误日志的位置
      pid /run/nginx.pid;  # Nginx主进程的PID文件位置
      
      # 全局块中可以包含的事件处理指令
      events {
          worker_connections 1024;  # 每个工作进程可以打开的最大连接数
      }
      
      # http块,包含了所有HTTP相关的配置
      http {
          include       mime.types;  # 包含媒体类型映射文件
          default_type  application/octet-stream;  # 默认媒体类型
      
          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  /var/log/nginx/access.log  main;  # 访问日志的位置和格式
      
          sendfile        on;  # 启用sendfile系统调用来传输文件
          #tcp_nopush     on;
      
          keepalive_timeout  65;  # 长连接超时时间
      
          # gzip配置
          #gzip  on;
      	
      	# 引入其他配置文件
      	include /etc/nginx/conf/*.conf;
      
          # 虚拟主机配置,可以包含多个server块
          server {
      	    listen 80;  # 监听HTTP的80端口
      	    server_name xxx.com www.xxx.com;  # 你的域名
      	
      	    # 将所有HTTP请求重定向到HTTPS
      	    return 301 https://$server_name$request_uri;
      	}
      	
      	# 正式环境
          server {
              listen 443 ssl;  # 监听443端口
              server_name  xxx.com www.xxx.com;  # 服务器名,可以是域名或IP地址
      
      	    # SSL证书和密钥配置
      	    ssl_certificate /usr/local/nginx/ssl/xxx.com_bundle.pem;
      	    ssl_certificate_key /path/to/your/xxx.com.key;
      		
      		# SSL调优
              ssl_session_cache    shared:SSL:1m;
              ssl_session_timeout  5m;
      
              ssl_ciphers  HIGH:!aNULL:!MD5;
              ssl_prefer_server_ciphers  on;
      
              location / {
                  root   /usr/ui/html;  # 自己正式网站根目录
                  index  index.html index.htm;  # 默认页面
              }
      
              # 错误页面配置
              #error_page  404              /404.html;
      
              # redirect server error pages to the static page /50x.html
              
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   /usr/share/nginx/html;
              }
      
              # 禁止访问.htaccess文件
              location ~ /\.ht {
                  deny  all;
              }
          }
      }
      
  • Ⅲ. 在/usr/local/nginx/conf/目录下创建nginx.test.conf
    • 创建nginx.test.conf
      touch nginx.test.conf
      
    • 然后加入以下内容
      # 测试环境
      server {
         listen 80;  # 监听HTTP的80端口
          server_name xxx.com www.xxx.com;  # 你的域名
      
          # 将所有HTTP请求重定向到HTTPS
          return 301 https://$server_name$request_uri;
      }
      	
      server {
          listen 443 ssl;  # 监听443端口
          server_name  test-xxx.com www.test-xxx.com;  # 服务器名,可以是域名或IP地址
      
          # SSL证书和密钥配置
          ssl_certificate /usr/local/nginx/ssl/test-xxx.com_bundle.pem;
          ssl_certificate_key /path/to/your/test-xxx.com.key;
      		
          # SSL调优
          ssl_session_cache    shared:SSL:1m;
          ssl_session_timeout  5m;
      
          ssl_ciphers  HIGH:!aNULL:!MD5;
          ssl_prefer_server_ciphers  on;
      
          location / {
                root   /usr/test-ui/html;  # 测试环境网站根目录
                index  index.html index.htm;  # 默认页面
            }
      
          # 错误页面配置
          #error_page  404              /404.html;
      
          # redirect server error pages to the static page /50x.html
              
          error_page   500 502 503 504  /50x.html;
          location = /50x.html {
              root   /usr/share/nginx/html;
          }
      
          # 禁止访问.htaccess文件
          location ~ /\.ht {
              deny  all;
          } 
       }
      
  • Ⅳ. 至此配置完成,接下来启动即可
    • 停止
      nginx -s stop
      
    • 启动
      nginx
      
;