- Nginx 安装前配置
- 安装 Nginx
- Nginx 配置
- 启动 Nginx
- 访问站点
- Nginx 其他命令
- 在 freenom 上申请免费域名和 DNS 解析服务
- 使用 Let's Encrypt 的免费证书为网站添加 SSL 层
- One more thing
- 全自动申请 Let's Encrypt 免费证书
可能許多人动過念头搭建 個人網站 玩玩,但各種嚇人門檻讓有心探索的人裹足不前。這個搭建過程就值得写写了。
搭建完成的玩具网站是有 独立域名, 支持 HTTPS 协议的哟.
让您满满的成就感. 也是您进一步建设正式网站的基础.
本文假設您
- 已經擁有了 VPS(Virtual Private Server 虚拟专用服务器),
- 知道怎么登录远程虚拟主机,
- 具有基本的
Linux命令操作经验, 会使用 vi 软件编辑文本文件, 会用ls列出当前目录的文件, - 远程主机的操作系统是
ubuntu 18.04+或者CentOS 6.x+.
如果您尚不具备以上条件, 请参看 Vultr 教程 和 vi 教程.
Nginx("engine x") 是由俄罗斯的程序设计师 Igor Sysoev 开发的高性能 Web 和 反向代理 服务器软件, 也是一个 IMAP/POP3/SMTP 代理服务器. 在高连接并发的情况下, Nginx 是 Apache 服务器不错的替代品.
sudo su
在 CentOS 系统,用如下命令
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
在 ubuntu 系统, 请用以下命令
apt-get update -y
apt-get install make zlib1g zlib1g-dev build-essential autoconf libtool openssl libssl-dev -y
apt install python3 python python-minimal cmake git -y
PCRE 作用是让 Nginx 支持 Rewrite 功能。
- 下载和安装 PCRE 软件包. 下列命令完成了从下载源码包, 解压源码包, 配置编译环境, 编译, 安装, 等一系列操作.
wget http://downloads.sourceforge.net/project/pcre/pcre/8.43/pcre-8.43.tar.gz
tar zxvf pcre-8.43.tar.gz
cd pcre-8.43
./configure
make && make install
cd ..
pcre-config --version
- 下列命令完成了从下载 nginx 源码包 到编译安装 等一系列动作. 最后一个命令是 查看 Nginx 版本.
wget http://nginx.org/download/nginx-1.17.2.tar.gz
tar zxvf nginx-1.17.2.tar.gz
cd nginx-1.17.2
./configure --prefix=/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=../pcre-8.43
make && make install
cd ..
/nginx/sbin/nginx -v
到此,nginx 安装完成,安装路径是 /nginx,可执行文件是 /nginx/sbin/nginx。
- 站点文件准备. 将 NginX 软件中的示例网页文件复制一份出来到
/mysite文件夹.
cp -r /nginx/html /mysite
这样 /mysite 文件夹就是您网页文件放置的地方了.
- 创建 Nginx 运行使用的用户 www
groupadd www
useradd -g www www
- 配置
nginx.conf, 用 vi 软件编辑将/nginx/conf/nginx.conf文件内容替换为以下内容,请注意内容中的域名信息。
user www www;
worker_processes 2; # The value is the same as the number of CPU cores.
error_log /nginx/logs/nginx_error.log crit; # Log location and log level.
pid /nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
}
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';
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
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 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m;
# Following is the configuration of the server virtual host.
server {
listen 80; # listen port.
server_name localhost amaoagou.tk www.amaoagou.tk; # domain.
index index.html index.htm index.php;
root /mysite; # ======> root dirctionay of your site. <======.
#location / {
# rewrite ^/(.*)$ https://amaoagou.tk/$1 permanent;
#}
location ~ .*\.(php|php5)?$ {
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ {
expires 30d;
# access_log off;
}
location ~ .*\.(js|css)?$ {
expires 15d;
# access_log off;
}
access_log off;
}
}
- 检查配置文件
nginx.conf的正确性. 命令
/nginx/sbin/nginx -t
Nginx 启动命令如下
/nginx/sbin/nginx
从浏览器访问我们配置的站点 IP
以下包含了 Nginx 常用的几个命令
/nginx/sbin/nginx -s reload # 重新载入配置文件.
/nginx/sbin/nginx -s reopen # 重启 Nginx.
/nginx/sbin/nginx -s stop # 停止 Nginx.
- 在域名注册商 freenom.com 网站上注册您的账号并登录, 它提供免费和收费域名注册服务.
- 选择 注册一个新域名(Register a New Domain), 这时会出现个搜索框验证您输入域名的有效性. 我这里随意输入
amaoagou(阿猫阿狗), 您得输入您自己的.
- 然后在可用域名页面列出, 可以选择免费的后缀. 我这里选
amaoagou.tk, 点Get it now!按钮, 然后在随后出现的购物车上点Checkout.
- 在随后出现的页面是过期时间选项, 选择
12 Months @ FREE, 这很重要, 因为默认选项是 3 个月. 然后点击Continue按钮进入下一步的Your Details页面.
-
在
Your Details页面输入您个人信息, 随便输入个假的信息就够了. 如果您想装得像一点, 可以在 fakenamegenerator.com 网站上生成一个. 一切就绪以后, 勾选I have read and agree to the Terms & Conditions复选框, 点击Complete Order按钮完成订单. -
现在, 就可以在
Services=>My Domains页面看到您刚才注册的免费域名了. 请点击amaoagou.tk条目下的Manage Domain按钮, 进入下一步. -
在
Managing amaoagou.tk页面, 点击Manage Freenom DNS项. 在随后出现的页面添加两条记录. 一条空白记录, 一条www记录. 添加方法是, 在Name格子空着或输入字符, 在Target格子输入您VPS的IP, 然后点击Save Changes按钮, 就添加上了. 几分钟后应该就能生效, 可以ping出域名的IP了. 如下图.
几分钟之后, 请在命令行 ping 您的域名, 不出意外的话应该可以 ping 通. 命令: ping amaoagou.tk
而且在浏览器里输入域名 amaoagou.tk 应该也可以访问了. 当然, 这时候的网站协议是 HTTP 而不是 HTTPS. 下一步我们就来完成这个工作.
Let's Encrypt 这个免费、自动化、开放的证书签发服务, 是由 ISRG(Internet Security Research Group,互联网安全研究小组)提供的. 而 ISRG 是来自于美国加利福尼亚州的一个公益组织。Let's Encrypt 得到了 Mozilla、Cisco、Akamai、Electronic Frontier Foundation 和 Chrome 等众多公司和机构的支持,发展十分迅猛。
申请 Let's Encrypt 证书不但免费,还非常简单,虽然每次只有 90 天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。
- 在您的
VPS主机上, 创建一个文件夹ssl来存放各种临时文件和最后的证书文件。进入这个目录,创建一个RSA私钥用于Let's Encrypt识别您身份:
mkdir /ssl
cd /ssl
openssl genrsa 4096 > account.key
接着就可以生成 CSR(Certificate Signing Request,证书签名请求)文件了。在这之前,还需要创建域名私钥(一定不要使用上面的账户私钥)。
- 创建
RSA私钥:
openssl genrsa 4096 > domain.key
- 有了私钥文件,就可以生成
CSR文件了。在CSR中推荐至少把域名带www和不带www的两种情况都加进去,其它子域可以根据需要添加(目前一张证书最多可以包含100个域名), 下面使用交互方式创建CSR(需要注意Common Name必须为您的域名):
openssl req -new -sha256 -key domain.key -out domain.csr
当然, 您也可以用一条全自动命令完成创建 CSR 文件, 两者选一即可. 注意要把命令中的 amaoagou.tk 字符串换成您自己的域名.
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:amaoagou.tk,DNS:www.amaoagou.tk")) > domain.csr
我们知道,CA 在签发 DV(Domain Validation)证书时,需要验证域名所有权。传统 CA 的验证方式一般是往 admin@yoursite.com 发验证邮件,而 Let's Encrypt 是在您的服务器上生成一个随机验证文件,再通过创建 CSR 时指定的域名访问,如果可以访问则表明您对这个域名有控制权。
首先创建用于存放验证文件的目录,命令如下:
mkdir -p /mysite/.well-known/acme-challenge/
这个目录是让 Let's Encrypt 在您主机上 通过 nginx 写入一些信息的.
这个验证服务以后更新证书还要用到,因此这个目录必须一直保留, 不能删除。
先把 acme-tiny 脚本保存到之前的 ssl 目录:
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
指定账户私钥、CSR 以及验证目录,执行脚本:
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /mysite/.well-known/acme-challenge/ > ./signed.crt
如果一切正常,当前目录下就会生成一个 signed.crt,这就是申请好的证书文件。
搞定网站证书后,还要下载 Let's Encrypt 的中间证书。配置 HTTPS 证书时既不要漏掉中间证书,也不要包含根证书。
在 Nginx 配置中,需要把中间证书和网站证书合在一起:
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
为了后续能顺利启用 OCSP Stapling,我们再把根证书和中间证书合在一起:
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem
最终,用 vi 修改 Nginx 中有关证书的配置, 在配置文件 /nginx/conf/nginx.conf 加入一个新的 server 节区:
server {
listen 443 ssl;
server_name amaoagou.tk www.amaoagou.tk;
index index.html index.htm index.php;
root /mysite;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_certificate /ssl/chained.pem;
ssl_certificate_key /ssl/domain.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
然后 reload 服务
/nginx/sbin/nginx -s reload
目前为止, 这个玩具网站已经是 HTTPS 加持的了. 恭喜您解锁了新成就. 请看下图.
Let's Encrypt 签发的证书只有 90 天有效期,推荐使用脚本定期更新。用 vi 创建一个 renew_cert.sh 脚本文件并通过 chmod a+x renew_cert.sh 赋予执行权限。
cd /ssl
vi renew_cert.sh
chmod a+x renew_cert.sh
renew_cert.sh 文件内容如下:
#!/bin/bash
cd /ssl/
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /mysite/.well-known/acme-challenge/ > ./signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
/nginx/sbin/nginx -s reload
crontab 中使用绝对路径比较保险,crontab -e 加入以下内容:
0 0 1 * * /ssl/renew_cert.sh >/dev/null 2>&1
这样以后证书每个月都会自动更新,一劳永逸。实际上,Let's Encrypt 官方将证书有效期定为 90 天一方面是为了更安全,更重要的是鼓励用户采用自动化部署方案。
直接安装, 不用编译源码,
apt-get install nginx
配置文件是 /etc/nginx/nginx.conf, 这个文件里有这样两行
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
第一行表明 /etc/nginx/conf.d/ 文件夹里的 .conf 都会被包含进配置里面, 目前这个文件夹是空的.
第二行表明 /etc/nginx/sites-enabled/ 文件夹内的所有文件都会包含进配置, 目前只有一个文件 default,
因此这文件的全路径就是 /etc/nginx/sites-enabled/default,
该文件内就指明了 http 协议站点首页文件是 /var/www/html/index.html.
当然, 配置 TLS 层还得按前述步骤进行, 但注意填写正确的文件存储路径.









