定义自定义服务器块
我们现在应该创建一个自定义服务器块来为 html 站点提供服务。
首先,我们将创建一个目录作为块的文档根目录,我们称之为example:
$ sudo mkdir /var/www/example
我们还需要创建一个 index.html 页面用来测试
$ echo "Welcome to example!" | sudo tee /var/www/example/index.html > /dev/null
完成后,我们可以在/etc/nginx/sites-available
目录中创建一个服务器块,为了一致性,我们将其命名为“example”:
server { listen 80; root /var/www/example; index index.html; server_name www.example.lan; }
测试我们的配置是否正确,不包含任何语法错误:
$ sudo nginx -t
如果我们没有 dns 服务器,要使用指定的名称向我们的服务器发送请求,
我们必须在客户端机器的 /etc/hosts
文件中添加一个条目。
将www.example.lan解析为服务器IP:
# The client /etc/hosts file [...] 192.168.122.89 www.example.lan
要激活我们的服务器块,我们必须从我们在 /etc/nginx/sites-available
中编写的配置创建一个符号链接到 /etc/nginx/sites-enabled
:
$ sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled
之后,我们需要重新启动nginx:
$ sudo systemctl restart nginx
现在,使用浏览器打开,http://www.example.lan
应该可以看到我们的index.html页面。
第1步 - 安装nginx
在Ubuntu 18.04上安装nginx非常简单,我们只需要使用apt-get
:
$ sudo apt-get update && sudo apt-get install nginx
第一个命令用Ubuntu存储库同步我们的计算机,而第二个实际安装Nginx包。
我们可以轻松使用以下Linux命令验证服务是否运行:
$ sudo systemctl is-active nginx
nginx服务器块(虚拟主机)
nginx服务器块,等效于Apache VirtualHosts,并且用于在同一服务器计算机上运行多个站点。
在NGINX的标准安装上,我们可以找到默认的“服务器块”是 /etc/nginx/sites-available/default
:
# Default server configuration # server { listen 80 default_server; listen [::]:80 default_server; [...] root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; server_name _; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } [...] }
使用SSL
要使用SSL,我们基本上有两个选项:从证书颁发机构获取证书,或者使用自签名证书。
在这个例子中我们将自己生成证书。
$ sudo openssl req -x509 \ -days 365 \ -sha256 \ -newkey rsa:2048 \ -nodes \ -keyout /etc/ssl/private/example.key \ -out /etc/ssl/certs/example-cert.pem
使用此命令,我们生成了一个有效期为 365 天的自签名证书和一个 2048 位的 rsa 密钥。
证书和密钥将分别保存在/etc/ssl/certs/example-cert.pem
和/etc/ssl/private/example.key
文件中。
只需回答将被问到的问题,在输入FQDN
时要特别注意:它必须与将使用证书的域匹配才能正常工作。
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ---- Country Name (2 letter code) [AU]:IT State or Province Name (full name) [Some-State]: Locality Name (eg, city) []:Milan Organization Name (eg, company) [Internet Widgits Pty Ltd]:Damage Inc. Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:www.example.lan Email Address []:
既然我们有证书和密钥,我们必须修改服务器块配置,使它变成:
server { listen 443 ssl; server_name www.example.lan; ssl_certificate /etc/ssl/certs/example-cert.pem; ssl_certificate_key /etc/ssl/private/example.key; root /var/www/example; index index.html; }
如您所见,我们在第 2 行修改了 listen
指令,使用端口 443
并启用了 ssl
参数,然后我们在第 4-5 行添加了两个新指令:ssl_certificate
和 ssl_certificate_key
, 分别指向证书和证书密钥位置。
重新启动 nginx 服务后,如果我们现在导航到 https://www.example.lan
,我们应该会看到浏览器发出的警告,因为证书是自签名的。 尽管如此,我们的配置仍在运行,并且我们正在使用加密连接:
第2步 - 防火墙设置
首先,我们验证防火墙是否有效:
$ sudo ufw status
使用下面命令激活防火墙
$ sudo ufw enable
允许通过端口80传入连接:
$ sudo ufw allow 80/tcp
允许端口443:
$ sudo ufw allow 443/tcp
检查防火墙的当前状态:
$ sudo ufw status numbered Status: active To Action From -- ------ --- [ 1] 443/tcp ALLOW IN Anywhere [ 2] 80/tcp ALLOW IN Anywhere [ 3] 443/tcp (v6) ALLOW IN Anywhere (v6) [ 4] 80/tcp (v6) ALLOW IN Anywhere (v6)
使用Let’s encrypt证书
自签名证书的替代方案是使用由验证的第三方颁发证书。
可以从证书颁发机构购买证书,这里我们使用免费的Let’s encrypt。
“Let’s Encrypt ”本身是一个免费的和开放的证书颁发机构,它可以使用在服务器上运行的ACME
协议和证书管理代理自动获取浏览器可信的证书。
要使用该服务,首先要做的是安装“Certbot”ACME客户端和Nginx特定的插件:
$ sudo apt-get update && apt-get install certbot python-certbot-nginx
获取证书非常简单:
$ sudo certbot --nginx -m <administrator-email> -d <domain>
如果一切顺利,证书和密钥将保存到/etc/letsencrypt/live/
目录中。 Certbot 还将对服务器块应用所需的更改并重新加载服务。