Nginx安装与配置
徐徐 抱歉选手

Nginx的安装、启动、验证

安装可以参考这两篇教程:How to Intsall Nginx on CentOS以及How to install Nginx web server on CentOS 7 Linux

安装分为以下三个命令。

1
2
3
sudo yum -y update # 更新
sudo yum install -y epel-release # 安装epel repository,可以提供更多CentOS官方不提供下载的开源包
sudo yum install nginx # 这里如果使用-y可能会没有反应,我自己弄的时候就存在这个问题

启动与查看Nginx的状态。

1
2
sudo systemctl start nginx # 按下Enter后不会获得返回值,但Nginx已经启动了
sudo systemctl status nginx # 使用status查看,这会有返回值,看到active说明就在运行了

其他一些配置。

1
2
3
4
sudo systemctl enable nginx # 设置开机自动启动
sudo systemctl disable nginx # 设置开机不自动启动
sudo systemctl stop nginx # 停止nginx
sudo systemctl restart nginx # 重新启动

如果希望在浏览器中验证Nginx的可访问性,可以在浏览器中输入http://Ip-or-domain,返回一个CentOS相关的页面就没有问题。

许多网页教程显示都是返回一个Welcome to nginx!的相关页面,之前我也一直以为自己配置错了。但是这个页面到底是服务器上存在的什么页面,是由/etc/nginx/nginx.conf中的server>root选项决定的,如下:

image-20210327094232475

可以看到root的路径在/usr/share/nginx/html中,可以去查看一下该文件夹下的index.html文件。

相关问题的解决连接附上关于nginx安装成功并启动后,登录网页不能进入欢迎页面的问题

Nginx配置

Nginx的安装目录为/etc/nginx。目录结构如下:

image-20210329110454009

使用yum安装的nginx的主要配置文件位于/etc/nginx/nginx.conf中。

Nginx默认配置文件位置到底在哪里

关于Nginx的默认配置文件nginx.conf到底在哪里的回答。可以参考SegmentFault上的回答StackOverflow的回答

不同的安装方式会导致nginx配置文件的目录不同。

如果是yum以及epel安装的,配置文件在/etc/nginx下,/etc/nginx/nginx.conf的include语句include /etc/nginx/conf.d/*.conf;可以引入当前目录下conf.d下的所有*.conf的配置文件。

如果是wget安装的,配置文件在`/usr/local/nginx/conf

如果在ubuntu系统下使用apt-get,文件目录中还会存在一个sites-available文件夹,其实他的作用就类似于conf.d文件夹。可以参考这个回答

Nginx配置文件相关命令

以下是关于查看nginx配置文件的命令。

1
2
3
4
5
6
7
8
# 查看当前使用nginx配置文件的地址
nginx -t

# 查看所有的nginx.conf
locate nginx.conf

# 以-c命令指定配置文件启动nginx
sudo nginx -c /etc/nginx/nginx.conf

Nginx启动后无法访问页面

如果发现systemctl restart nginx之后访问ip或domain仍然提示报错或服务器拒绝访问,使用systemctl status nginx查看nginx当前的状态,如果出错会有红色高亮语句。

命令行的return value类似于Job for nginx.service failed. See "systemctl status nginx.service" and "journalctl -xe" for details.,可以考虑检查Nginx配置文件中的syntax是否有错误。解决办法参考自这里

执行如下命令,这里指定了测试检查的Nginx配置文件的路径。

1
nginx -t -c /etc/nginx/nginx.conf

结果是这样的。

image-20210329221657137

第一个warn因为我生成的是自签名证书,后续再去申请有效的证书。

第二个emerg就是出错所在,多了一个花括号,导致语法出错了!依据行提示101查找位置,修改保存。再次restart就可以了。

加密、签名、证书相关概念

digital signature数字签名

查看数字签名是什么,这篇文章解释了数字签名与数字证书。下面是我的一些理解。

在网络上传输信息的双方,双方各持有一把公钥、一把私钥。公钥和私钥是对偶的,如果破解了一把,另一把自然就被破解了;公钥是私钥的唯一持有者给他的通信对象发送的加密钥匙,公钥可以公开给所有人,私钥需要持有者保密。发送方用公钥加密内容,接收方只能用和发送方匹配的密钥解密内容。

发送信息的双方,各自生成一对公钥和密钥,把公钥分享给对方,私钥自己持有。举个例子,A和B在通信,首先要A生成自己的公钥和密钥,并且B也生成自己的公钥和密钥,A把自己的公钥给B,B也把自己的公钥给A。因此A在通信中会用到:A自己的密钥,B发送过来的公钥。

目前为止,发送方A想要给接收方B发送信息,只要用公钥加密即可。但是C、D、E都可以有公钥,B如何确定发送过来的信息是谁发过来的?因此发送方A采用“数字签名”的形式发送信息。

数字签名就是发送方A将信息用Hash函数生成信件摘要digest,并用发送方A自己的私钥加密后生成的证明自己是自己的认证。数字签名会附在原信息内容后,通过接收方B的公钥加密后发送。接收方B在拿到这个信息后,首先用自己的私钥B解密,获得信件正文内容与签名,再将签名用发送方A的公钥解密,获得摘要digest。接收方B为了确认信件征文内容没有被篡改,对信件正文做哈希后与解密后获得的digest做对比,如果一致,说明内容对上了,发送人也对上了。

「签名」的作用本身也不是用来保证数据的机密性,而是用于验证数据来源的防止数据被篡改的,也就是确认发送者的身份。

为什么是哈希函数?

  1. 如果没有哈希函数,同时原信息又很庞大,对原信息计算数字签名(非对称加密)的运算量十分庞大,耗时。
  2. 哈希函数是不可逆的,无法从摘要反推出原文。

数字证书digital certificate

有了数字签名之后,A和B的对话就能加密进行了,但问题是接收方B持有的公钥怎么就一定是发送方A的?如果C用自己的公钥冒充A发送给B,且B保存下来,之后A反而会被当作冒充者。

之前我们都在考虑消息是否会被篡改,但是公钥是否会被篡改呢?发送方A没有办法证明自己的公钥就是自己的公钥,因此需要第三方帮自己证明,就像公安局发身份证证明公民身份一样。

换句话说,数字证书就是「公钥的数字签名」,是为了保证公钥不被篡改而引入的。

由于我们不能自己证明自己,要找第三方公证,这个第三方就是CA(Certificate Authority),CA会将证书的颁布机构、有效期、公钥、持有者等信息用CA的私钥进行签名,在接收方B收到这个数字证书的时候,用CA的公钥进行验签。

证书颁发的机构有层级关系,下级CA的证书由上级CA签发,根证书签发机构使用自签,自己给自己认证。

操作系统和浏览器等厂商一般都会预装可靠的根证书。

参考

一文彻底搞懂加密、数字签名和数字证书

数字签名是什么

为Nginx配置TLS

openssl生成密钥与证书

首先创建一个用于存放nginx的密钥、Diffie-Helman key、证书的文件目录,并设置权限。

1
2
mkdir /etc/pki/nginx/
chmod 700 /etc/pki/nginx/

用以下命令生成RSA私钥和自签名证书到上一步创建的目录。其中req是证书请求的子命令,-newkey rsa:2048 -keyout /etc/pki/nginx/private.key表示生成私钥到制定位置/etc/pki/nginx/private.key,-nodes表示私钥不加密,-x509表示输出X509格式的证书,-days 365表示有效期为365天

1
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/nginx/private.key -out /etc/pki/nginx/certificate.crt

接着会在命令行要求填写Country Name (2 letter code)至Email Address等证书拥有者信息,其中Common Name填写服务器IP地址或(已购买的)域名。

用以下命令生成DH key到上一步创建的目录。

1
openssl dhparam -out /etc/pki/nginx/dhparam.pem 2048

至此,/etc/pki/nginx下已有三个文件。(pki=public key infrastructure)

image-20210327140647189

也可以向证书与私钥供应商处获取密钥,有很多公司提供这个服务。申请成功后将证书和私钥都复制到特定目录下的.crt与.key后缀的文件中即可。

另外在同一目录下生成DH密钥交换可以确保密钥交换过程中的安全性。

图文可以看这篇教程

为Nginx应用生成的密钥与证书

/etc/nginx中包含了关于Nginx的所有配置。在conf.d子目录下创建一个ssl.conf的配置文件。

1
vim /etc/nginx/conf.d/ssl.conf

内容如下,一定要把server_IP_address改成自己的服务器ip。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;

server_name server_IP_address;

ssl_certificate /etc/pki/nginx/certificate.crt;
ssl_certificate_key /etc/pki/nginx/private.key;
ssl_dhparam /etc/pki/nginx/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

root /usr/share/nginx/html;

location / {
}

error_page 404 /404.html;
location = /404.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

另外可以选择将http流量重定向为https流量。

1
vim /etc/nginx/default.d/ssl-redirect.conf

在这个ssl-redirect.conf文件中放入如下内容。

1
return 301 https://$host$request_uri/;
  • 本文标题:Nginx安装与配置
  • 本文作者:徐徐
  • 创建时间:2021-03-27 09:17:36
  • 本文链接:https://machacroissant.github.io/2021/03/27/nginx-with-ssl/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论