云计算百科
云计算领域专业知识百科平台

如何在NGINX里配置SSL证书----Linux版本(ECS服务器可用)

目录

配置前提

NGINX在Linux中的安装

配置NGINX反向代理

配置中的常见错误


配置前提

  • 有一台可以正常使用的ECS服务器
  • 已经获取了SSL证书(NGINX版本,免费的付费的都可以)
  • 已经在ECS中部署了项目(这一点不是必须的,但是可以快速测试SSL是否配置成功)
  • NGINX在Linux中的安装

    首先在官网下载最新稳定版本的Nginx-linux版本

    官网链接🔗:

    nginx: download

    1、在ECS的CentOS7系统中的任意一处建立文件夹;

    这里就以/usr/nginx/为例

    mkdir /usr/nginx

    2、将nginx-1.26.3.tar.gz文件放入此文件夹,然后解压

    cd /usr/nginx
    tar -zxf nginx-1.26.3.tar.gz

    3、解压之后会有一个nginx-1.26.3/目录,开始配置nginx

    cd nginx-1.26.3

    ./configure –prefix=/usr/local/nginx –with-http_ssl_module

    make && make install

    4、最后在/usr/local/下会生成一个nginx/目录,运行nginx

    cd /usr/local/nginx/sbin/

    ./nginx

    执行之后,查看进程:

    ps aux | grep nginx

    返回: 

    • 一个root运行的master主线程,由 root 用户启动的,负责管理和控制 worker 进程;
    • 一个nobody的worker进程,由一个非特权用户(如 nobody)运行,负责处理实际的 HTTP 请求。

    打开浏览器,输入你的ECS的ip,会出现nginx的主页:

    就说明成功了,NGINX配置完毕!


    随后,在nginx里配置SSL证书,配置反向代理的域名,使得可以在访问域名时使用HTTPS协议

    1、将你的SSL证书相关文件放到/etc/pki/tls/certs/目录下,根据/etc/ssl/certs就能找到。(/etc/ssl/下的certs是一个链接)

    2、在/usr/local/nginx/conf/目录下找到nginx的配置文件nginx.conf

    vim /usr/local/nginx/conf/nginx.conf

    此处建议将此文件夹下载到本地的Windows系统中进行编辑,用VSCode编辑,编辑完成后再上传到Linux主机中,并覆盖原文件。

    配置NGINX反向代理

    详细的配置流程和各参数作用,请参考腾讯云的官方配置文档,里面讲的比较详细:

    腾讯云官方教程(NGINX版SSL证书的配置)🔗:

    SSL 证书 Nginx 服务器 SSL 证书安装部署(Linux)

    我们来看一下nginx.conf的文件结构:

    #user  nobody;

    worker_processes  1;

    #error_log  logs/error.log;

    #error_log  logs/error.log  notice;

    #error_log  logs/error.log  info;

    #pid        logs/nginx.pid;

    events {

        worker_connections  1024;

    }

    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  logs/access.log  main;

        sendfile        on;

        #tcp_nopush     on;

        #keepalive_timeout  0;

        keepalive_timeout  65;

        #gzip  on;

        # server {

            # listen       80;

            # server_name  localhost;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            # location / {

                # root   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   html;

            # }

            # proxy the PHP scripts to Apache listening on 127.0.0.1:80

            #

            #location ~ \\.php$ {

            #    proxy_pass   http://127.0.0.1;

            #}

            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

            #

            #location ~ \\.php$ {

            #    root           html;

            #    fastcgi_pass   127.0.0.1:9000;

            #    fastcgi_index  index.php;

            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

            #    include        fastcgi_params;

            #}

            # deny access to .htaccess files, if Apache's document root

            # concurs with nginx's one

            #

            #location ~ /\\.ht {

            #    deny  all;

            #}

        # }

        # 主要是修改以下这些地方,上面的server应该全部注释掉

    # another virtual host using mix of IP-, name-, and port-based configuration

    # 此处server是重定向,强制http的访问使用https协议的

    # 不是必要的,但是比较实用

        server {

            listen 80;

            server_name xxxxx.com;

            # 自动将 http 重定向到 https

            return 301 https://$host$request_uri;

        }

       
        # 配置HTTPS协议,关键是配置好SSL文件

        # HTTPS server

        server {

            listen       443 ssl;

            server_name  xxxxx.com;

            ssl_certificate      /etc/ssl/certs/xxxxx.com_bundle.pem;

            ssl_certificate_key  /etc/ssl/certs/xxxxx.com.key;

            ssl_session_cache   shared:SSL:10m;

            ssl_session_timeout 10m;

            ssl_protocols       TLSv1.2 TLSv1.3;

            ssl_ciphers         'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:HIGH:!aNULL:!MD5';

            ssl_prefer_server_ciphers on;

           # 此处是我的主机内运行的端口号进行的映射

            location / {

                proxy_pass http://localhost:8080;  # Spring Boot

                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;

            }

            # 这里不配置 Flask 反向代理

            # location /predict/ {

            #     proxy_pass http://localhost:5000;

            # }

            location /predict/ {

                 return 403;

            }

            location /static/ {

                 return 403;

            }

        }

        # 此处可为ECS的公网IP配置HTTPS协议,不过不推荐

        # 如果是域名申请的SSL证书,配置到IP会提示不受信任

        # HTTPS localhost IP

        server {

            listen                  443 ssl;

            server_name             49.233.83.47;

            ssl_certificate         /etc/ssl/certs/xxxxx.com_bundle.pem;

            ssl_certificate_key     /etc/ssl/certs/xxxxx.com.key;

            location / {

                proxy_pass          http://localhost:8081;

            }

        }

    }

    最后,在配置文件重新编译之后,保存到原本的位置;然后重启NGINX服务

    cd /usr/local/nginx/sbin
    ./nginx -s reload

    配置完毕且重启完毕后,打开浏览器访问域名,如果是国内的域名配置到国内的服务器,只能申请ICP备案后才能访问。

    如果没有ICP备案,有一个简单的方法可以快速使用自己的域名,就是去买一个服务器在香港的内穿隧道,将自己的域名配置到公网IP的隧道上。

    配置中的常见错误

    错误一:参数请求错误

    nginx 编译安装时最常见的错误之一,说明你现在用的 nginx 是源码编译的版本,但当初没有带上 –with-http_ssl_module 参数编译,所以它不支持 SSL / HTTPS

    重新进入nginx的根目录再此安装

    cd /usr/nginx/nginx-1.26.3

    ./configure –prefix=/usr/local/nginx –with-http_ssl_module

    make && make install

    错误二:NGINX命令无法找到

    没有配置环境变量,这个命令只能使用路径来使用

    /usr/local/nginx -v

    可以去配置全局的环境变量

    vim /etc/profile

    在最后一行添加:

    export PATH=$PATH:/usr/local/nginx/sbin

    然后:wq!保存,并更新etc配置文件

    source /etc/profile

    之后便可以全局使用nginx命令了

    错误三:ssl证书文件无法找到

    我这里的问题是,在/usr/local/nginx/conf/目录下新建里一个service/目录,然后.pem和.key文件都放在里面,配置信息是填写的绝对路径。还是无法导入,设置了777权限都无法读取,使用

    ls -l /usr/local/nginx/conf/server/xxxxx.pem

    命令寻找返回没有此文件。

    但是全局搜索命令又在此目录下找到了此文件

    find / -name "xxxxx.pem"

    最后,我发现无论把这个service目录放到哪里都没法找到ssl配置文件……😓

    然后我发现,其实已经有一个存放初始.pem文件的目录了,/etc/ssl/certs,其中certs是一个链接,链接到/etc/pki/tls/certs/,里面是默认的几个文件,把他们删除,然后放上自己的相关配置SSL文件,然后运行

    nginx -t

    返回

    成功了,这个存放nginx的SSL配置文件的问题,我看网上其他教程说是在哪里都行,我这个却不一样,可能是版本的问题,也可能是我操作的问题,希望有大佬在评论区可以指出这个问题是怎么回事。

    错误四:端口占用

  • 修改nginx.config文件里运行的端口号;没啥好说的,建议修改8080
  • 查看自己配置的nginx端口号上运行里进程,并关闭此进程后重新运行。(注意,一定要查看一下此占用进程是否有用,不要意外关闭运行在此端口上的重要进程)
  • sudo netstat -tlnp | grep :80

    sudo kill -9 2404 (你的进程号)

    sudo netstat -tlnp | grep :80

     再次查看,没有进程后,再启动nginx

    ./nginx


    最后,欢迎大家留言讨论以及纠正文章中的错误🙂

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 如何在NGINX里配置SSL证书----Linux版本(ECS服务器可用)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!