Nginx的安装、启动、验证
安装可以参考这两篇教程:How to Intsall Nginx on CentOS以及How to install Nginx web server on CentOS 7 Linux。
安装分为以下三个命令。
1 | sudo yum -y update # 更新 |
启动与查看Nginx的状态。
1 | sudo systemctl start nginx # 按下Enter后不会获得返回值,但Nginx已经启动了 |
其他一些配置。
1 | sudo systemctl enable nginx # 设置开机自动启动 |
如果希望在浏览器中验证Nginx的可访问性,可以在浏览器中输入http://Ip-or-domain
,返回一个CentOS相关的页面就没有问题。
许多网页教程显示都是返回一个Welcome to nginx!的相关页面,之前我也一直以为自己配置错了。但是这个页面到底是服务器上存在的什么页面,是由
/etc/nginx/nginx.conf
中的server>root选项决定的,如下:可以看到root的路径在
/usr/share/nginx/html
中,可以去查看一下该文件夹下的index.html文件。相关问题的解决连接附上关于nginx安装成功并启动后,登录网页不能进入欢迎页面的问题。
Nginx配置
Nginx的安装目录为/etc/nginx
。目录结构如下:
使用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 | 查看当前使用nginx配置文件的地址 |
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 |
结果是这样的。
第一个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做对比,如果一致,说明内容对上了,发送人也对上了。
「签名」的作用本身也不是用来保证数据的机密性,而是用于验证数据来源的防止数据被篡改的,也就是确认发送者的身份。
为什么是哈希函数?
- 如果没有哈希函数,同时原信息又很庞大,对原信息计算数字签名(非对称加密)的运算量十分庞大,耗时。
- 哈希函数是不可逆的,无法从摘要反推出原文。
数字证书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 | mkdir /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)
也可以向证书与私钥供应商处获取密钥,有很多公司提供这个服务。申请成功后将证书和私钥都复制到特定目录下的.crt与.key后缀的文件中即可。
另外在同一目录下生成DH密钥交换可以确保密钥交换过程中的安全性。
图文可以看这篇教程。
为Nginx应用生成的密钥与证书
在/etc/nginx
中包含了关于Nginx的所有配置。在conf.d子目录下创建一个ssl.conf的配置文件。
1 | vim /etc/nginx/conf.d/ssl.conf |
内容如下,一定要把server_IP_address
改成自己的服务器ip。
1 |
|
另外可以选择将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 许可协议。转载请注明出处!