后端 · 10月 7, 2020 0

Liunx下node+nginx配置指南

准备

服务器系统:ubuntu
自用系统:Windows
准备工具:Xshell,Xftp

起步

tip:win下可以用Xshell连接lunix服务器命令行,用Xftp传输文件。

安装 NGINX

sudo apt-get install nginx

nginx 会被安装在/etc/nginx目录下,现在列出即将用到的指令:

# 启动服务
sudo /etc/init.d/nginx start
# 重启服务
sudo /usr/sbin/nginx -s reload
# 测试配置文件的正确性
sudo nginx -t
# 编辑文件
sudo nano 文件名

配置

配置文件为nginx.conf,在/etc/nginx目录下:

sudo nano nginx.conf

打开文件如下:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

#mail {
#   # See sample authentication script at:
#   # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#   # auth_http localhost/auth.php;
#   # pop3_capabilities "TOP" "USER";
#   # imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#   server {
#       listen     localhost:110;
#       protocol   pop3;
#       proxy      on;
#   }
# 
#   server {
#       listen     localhost:143;
#       protocol   imap;
#       proxy      on;
#   }
#}

以上配置基本不用改动,只需要在http模块中添加sever模块即可:

    server {
        listen 80;# 外部访问的端口号,
        server_name www.domain.cn; # 外部访问的域名,可以添加多个
        root /dist/; # 网站根目录,静态文件、index.html所在的目录
        location / { # 匹配请求 /,所有请求做如下处理
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host  $http_host;
                proxy_set_header X-Nginx-Proxy true;
                proxy_set_header Connection "";
                proxy_pass http://127.0.0.1:3000;# node服务所在的ip和端口
                proxy_redirect default;
                # root   html;
                index  index.html index.htm;# 默认入口文件
            }

            error_page   500 502 503 504 /50x.html; # 错误页面

            location = /50x.html {
            }
            # 静态文件交由nginx处理
            location ~ ^/(images|javascript|js|css|flash|media|static)/ {
                #过期30天,静态文件不怎么更新,过期可以设大一点,
                #如果频繁更新,则可以设置得小一点。
                expires 30d;
            }

    }

保存并退出

启动

启动你的node服务:

node index.js

或者你可以使用pm2来管理。
启动nginx服务:

sudo /etc/init.d/nginx start

访问www.domain.cn,就可以看到你的网站了!

HTTPS 升级

https升级需要SSL协议并通过443端口访问网站,如果你的域名通过了备案,可以去腾讯云申请免费的证书,并且需要添加证书域名解析记录。假设你已经拿到了证书!

下载传输证书

  1. 去腾讯云控制台下载证书,解压后提取nginx文件里面的.crt.key文件。
  2. 使用Xftp访问服务器的文件系统。可以按照腾讯文档,在/etc/nginx目录下创建conf文件,利用Xftp传输两个证书文件至该目录下。如果遇到错误,一般是conf没有写权限,给予它所有权限sudo chmod 777 conf

    配置 443 端口

    更改你的nginx.conf配置(把80端口的配置要删掉奥!):

server {
        listen 443;
        server_name www.domain.cn;
        root /dist/;

        ssl on;
        ssl_certificate 1_www.domain.com_bundle.crt;# 腾讯云文件名是这样的
        ssl_certificate_key 2_www.domain.com.key;# 腾讯云文件名是这样的
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
        ssl_prefer_server_ciphers on;
        # 以下配置和上面的一样
        location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host  $http_host;
                proxy_set_header X-Nginx-Proxy true;
                proxy_set_header Connection "";
                proxy_pass http://127.0.0.1:3000;
                proxy_redirect default;
                # root   html;
                index  index.html index.htm;
            }

            error_page   500 502 503 504 /50x.html;

            location = /50x.html {
            }

            location ~ ^/(images|javascript|js|css|flash|media|static)/ {
                #过期30天,静态文件不怎么更新,过期可以设大一点,
                #如果频繁更新,则可以设置得小一点。
                expires 30d;
            }

    }

执行以下命令,检验配置是否有误:

sudo nginx –t

重启 Nginx。即可使用 https://www.domain.com 进行访问。

http 跳转到 https

此时 http 依然存在,不加https://依然会提示不安全的网站。因为加上就访问443端口,不加就不访问,我们需要对80端口做强制跳转,新添加一个server模块:

server {
    listen 80;
    server_name www.domain.cn domain.cn;
    root /dist/;
    return 301 https://$server_name$request_uri;# 强制跳转
}

重启nginx。www.domain.cndomain.cn都将跳转到https://www.domain.com

二级域名配置

域名解析

有时候我们需要额外一个网站。如果你已经有一个顶级域名,你就可以使用二级域名。二级域名的数量是不限制的,但是你的域名服务商会对你的域名解析添加限制。以阿里云为例,配置二级域名。你需要添加以下解析记录(假设你的顶级域名是ccc.com):

  1. 记录类型:A
  2. 主机记录:xxx(这里就是你二级域名指定的字符)
  3. 记录值:服务器的ip地址

这样你就会得到一个xxx.ccc.com的域名。

服务器配置

二级域名用nginx配置相当简单。以上的配置不用动,只需再添加一个80端口的server模块即可:

server {
    listen 80;
    server_name www.xxx.ccc.com xxx.ccc.com;
    root /home/csapp-learn/dist/; # 你的网站根目录
    #return 301 https://$server_name$request_uri; # 开启可强制跳转到https
}

这样你访问xxx.ccc.com就会访问到设置的网站目录。

HTTPS

如果你的子域名也需要HTTPS,同样非常简单!

SSL证书

阿里云可以免费为子域名申请证书,或者从其他渠道,按照之前的方式,放在/etc/nginx/conf/目录下。

NGINX 配置

继续为nginx添加新的443端口模块:

server {
    listen 443;
    server_name www.xxx.ccc.com;
    root /home/csapp-learn/dist/;

    ssl on;
    ssl_certificate conf/1.pem;
    ssl_certificate_key conf/2.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
    ssl_prefer_server_ciphers on;

    error_page   500 502 503 504 /50x.html;

    location = /50x.html {
    }

    location ~ ^/(images|javascript|js|css|flash|media|static)/ {
        #过期30天,静态文件不怎么更新,过期可以设大一点,
        #如果频繁更新,则可以设置得小一点。
        expires 30d;
    }

}

注意:我们这里直接把这个网站看成了静态网站,所有没有添加node相关的配置,如有需要,自行添加。

冀ICP备19028007号