ENGINE X - Nginx
快速上手指南
[TOC]
🌐 1. Nginx
基本概念
Nginx
是目前最流行的 Web 服务器软件,也是互联网公司和网站的首选。一开始是由一个名为 Igor Sysoev
的俄罗斯程序员开发的,目的是用于解决 C10K
问题,C10K
问题是指服务器同时支持成千上万个并发客户端的问题。这个问题在当时是非常严重的,因为当时的服务器软件都是单线程的,所以在高并发的情况下,服务器的性能会变得非常的差。
Nginx
的出现很好的解决了这个问题,在 Nginx
官方的测试结果中,Nginx
可以支持 50000
个并发连接,在后来的发展中,Nginx
也逐渐成为了最流行的 Web 服务器软件。
Nginx
具有 epoll
I/O多路复用、高并发、高性能、低内存消耗、热部署等优势。
🌐 2. Nginx
安装配置
2.1 通过包管理工具安装 Nginx
① 在 Linux 环境下:
执行 sudo apt update
更新 apt
包,并执行 sudo apt install nginx
安装 Nginx
。
1 | nilera@nilera-virtual-machine:~$ sudo apt update |
② 在 Mac OS 环境下:
1 | brew install nginx |
③ 在 Windows 环境下:
1 | scoop install nginx |
或者使用:
1 | choco install nginx |
2.2 通过源码编译的方式安装 Nginx
Nginx
是使用 C
语言开发的,因此可以像其他 C 语言的项目一样,下载 Nginx
的源码到自己的服务器上,然后执行预编译、编译和安装的过程。
① 预编译
1 | ./configure |
② 编译
1 | make |
③ 安装
1 | make install |
2.3 使用 Docker
来安装 Nginx
1 | docker pull nginx |
🌐 3. Nginx
常用命令
3.1 服务的启动和停止
3.1.1 服务的启动
安装完成后,可以直接在命令行输入 nginx
启动服务,若是没有出现信息则说明启动成功;若是启动失败,则会输出启动失败的原因,此时需要根据错误原因进行排查。
1 | nginx |
可能会遇到的问题:
问题描述 | 问题原因 | 解决方案 |
---|---|---|
运行 nginx 命令出现错误:nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied) |
权限问题导致无法正常启动 Nginx 。 |
使用 sudo nginx 命令提高用户执行的权限。 |
运行 sudo nginx 命令出现错误:nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error) ... nginx: [emerg] still could not bind() |
大概率是 80 端口已经被绑定了,或者是之前已经启动了 Nginx 导致端口冲突。可以查看 80 端口的占用情况进行进一步操作。 |
使用 kill 命令杀死占用端口的程序,然后重新运行 sudo nginx 命令。 |
访问 <your ipaddr>:8080
出现以下欢迎界面则表示 Nginx
启动成功。
3.1.2 查看 Nginx
的进程
使用 ps -ef|grep nginx
可以查看 Nginx
进程。这个其实并不是 Nginx
的命令,而是 Linux
自带的命令。
1 | nilera@nilera-virtual-machine:~$ ps -ef|grep nginx |
这里可以看到 Nginx
的进程包括 Master
进程 和 Worker
进程。
Master
进程就是Nginx
的主进程,他主要负责读取和验证配置文件,并管理Worker
进程,将工作分配给Worker
进程。Worker
进程就是Nginx
的工作进程,其主要负责实际的请求,完成具体的工作。Master
进程只有一个,而**Worker
进程**可以有很多个,Worker
进程的数量可以通过配置文件来调整。
或者我们可以使用 lsof -i:80
来查看 80
端口的占用情况,需要注意:lsof
命令并不适用于所有的 Linux 发行版,有些发行版可能需要安装该命令。
1 | nilera@nilera-virtual-machine:~$ sudo lsof -i:80 |
3.1.3 服务的停止
我们可以使用 nginx -s <signal>
来控制 Nginx
的停止或重启。<signal>
可以是 quit
优雅退出、**stop
立即停止、reload
重载配置文件、reopen
重新打开日志文件**中的一个。
1 | nilera@nilera-virtual-machine:~$ sudo nginx -s quit |
3.2 查看 Nginx
的版本、路径等信息
1 | nilera@nilera-virtual-machine:~$ nginx -V |
其中 --conf-path
包含了 Nginx
的配置文件的位置。在这里我们可以看到路径为:--conf-path=/etc/nginx/nginx.conf
。
或者可以使用 nginx -t
来快速定位到 配置文件的位置。nginx -t
同时也可以用于检测配置文件是否存在问题,如果配置文件出现错误,执行 nginx -t
会提示错误位置和错误信息。
1 | nilera@nilera-virtual-machine:~$ sudo nginx -t |
在Ubuntu 22.04
中,安装的 Nginx
版本为 nginx/1.18.0(Ubuntu)
。在该版本中的配置文件和一些最新的版本有一些区别,体现在如下几个方面:
- 主配置文件:
/etc/nginx/nginx.conf
- 站点配置文件目录:
/etc/nginx/sites-available
和/etc/nginx/sites-enabled
在该版本通常将站点配置文件放在 sites-available
目录中,并通过创建符号链接到 sites-enabled
目录来启用它们。例如,可以通过以下命令创建一个简单的站点配置文件:
1 | sudo nano /etc/nginx/sites-available/my_site |
在 nginx/1.25.1
版本中,站点的配置文件和主配置文件是在写在一起的。
3.3 Nginx
的配置文件
Nginx
的配置文件可以帮助我们进行 Nginx
的一些设置,如 worker
进程数等。
我们通过以下步骤修改 Nginx
的配置文件。
① 编辑 Nginx
配置文件
1 | vim /etc/nginx/nginx.conf |
② 修改相应的配置项
Nginx
的配置项包括全局块、events
块、http
块。
全局块
主要是一些全局配置,比如
Worker
进程数、指定运行服务的用户等。events
块主要是服务器和客户端之间网络连接的一些配置等,比如指定每个
Worker
进程可以同时接收多少个网络连接、网络I/O模型等。http
块http
块是Nginx
修改最频繁的部分,如虚拟主机、反向代理、负载均衡等,都是在http
块中进行配置的。server
块http
块下具有多个server
块,也叫虚拟主机。我们可以在文件下面
include servers/*
,这样就可以将servers
目录下所有的配置文件都包含进来,这样就可以将每个虚拟主机都放在一个单独的文件中。从而让主配置文件看起来更加的清晰。在
1.18.0(Ubuntu)
版本中,可以看到主配置文件中包含include /etc/nginx/sites-enabled/*;
,而在/etc/nginx/site-enabled
中,可以看到default
软连接到/etc/nginx/sites-available/default
中。include
命令还可以包含其他的配置文件,如mime.types
。
下面是 Ubuntu
版本的配置文件:
1 | user www-data; |
③ 使用 nginx -t
命令检查配置文件是否存在问题。
④ 使用 nginx -s reload
修改配置文件后需要重新加载配置文件。
🌐 4. Nginx
常用操作
4.1 静态站点部署
我们可以使用 Hexo
来生成一个简单的静态博客网站,并将其部署到 Nginx
中。
Hexo
是一个静态博客站点生成工具,是一个基于 Node.js
的博客框架。它可以将 Markdown
格式的文档转化成静态页面,非常适合用于做个人技术博客。
下面先了解以下如何安装和启动 Hexo
。
① 前置要求:安装 Node.js
和 Git
1 | nilera@nilera-virtual-machine:~$ sudo apt update |
② 检测 Node.js
、npm
和 Git
的版本
1 | nilera@nilera-virtual-machine:~$ nodejs -v |
③ 安装 Hexo
1 | nilera@nilera-virtual-machine:~$ npm install hexo-cli -g |
④ 安装 Hexo
有可能会出现安装速度过慢的情况,这时我们进行 npm
换源操作。
- 查看源
1 | nilera@nilera-virtual-machine:~$ npm config get registry |
更换淘宝源
这里需要注意,
https://registry.npm.taobao.org/
已经于 2022年05月31日 废弃,现在需要更换为新的淘宝镜像源https://registry.npmmirror.com/
。换源的配置会持久化保存到~/.npmrc
文件中,可以通过手动修改该文件来修改配置。此外我们可以安装
nrm
包来简化这一操作,nrm
其实就是NPM Registry Manager
,是一个用于管理NPM
源的简单命令行工具。具体操作可以参考文章:NPM
如何换源 ?
1 | nilera@nilera-virtual-machine:~$ npm config set registry https://registry.npm.taobao.org/ |
- 恢复官方源
1 | nilera@nilera-virtual-machine:~$ npm config set registry https://registry.npmjs.org |
- 删除注册表
1 | nilera@nilera-virtual-machine:~$ npm config delete registry |
⑤ 初始化
执行完 hexo init blog-demo
后,会在执行该目录下生成 blog-demo
目录。
1 | nilera@nilera-virtual-machine:~$ hexo init blog-demo |
⑥ 安装依赖
1 | nilera@nilera-virtual-machine:~$ cd blog-demo |
⑦ 使用 hexo g
生成网站静态页面
该命令的主要作用是将 Markdown
格式的文章,转化成静态页面,并放到 public
目录中。第一次执行该命令,会生成 public
目录。
1 | nilera@nilera-virtual-machine:~/blog-demo$ hexo g |
⑦ 使用 hexo s
或 hexo server
本地运行(启动本地服务器)
1 | nilera@nilera-virtual-machine:~/blog-demo$ hexo server |
⑧ 实际生产环境中,我们会将页面部署到 Nginx
上,我们只需要将 blog-demo
中的 public
目录复制到 Nginx
用于存放静态页面的目录下即可。
1 | nilera@nilera-virtual-machine:~/blog-demo$ sudo cp -rf public/* /var/www/html/ |
⑨ 访问 Nginx
页面,即可进行博客网站的访问。
4.2 反向代理
反向代理是相对于正向代理来说的,简单来说,正向代理就是代理客户端,反向代理就是代理服务端。
例如,当我们想要访问一个国外的网站(如:Google)时,可能由于网络的原因无法访问到相关内容。这个时候我们就可以使用 VPN
这种代理服务器,让代理服务器作为客户端,代理我们去访问这些网站,再将访问的结果返回给我们。这就是一个典型的正向代理的例子,这里的代理服务器代理的是客户端,而且这个过程客户端是知道的,但是对于服务端来说是透明的。
而反向代理是代理服务端的,比如当我们准备访问一个网站(如:Google)的时候,他后面可能有着成千上万台服务器,但是对外暴露的只有一个域名,我们也只能通过这个域名来进行访问,然后我们的请求会被转发到后面的服务器上。这种方式隐藏了真实的服务器IP
地址、端口等信息。这就是反向代理的典型例子,这里的代理服务器代理的是服务端,而且这个过程服务端是知道的,但是对于客户端来说是透明的。
4.3 负载均衡
4.4 HTTPS
配置
HTTPS
协议是 HTTP
协议的安全版本,它通过对传输的数据进行加密来保证数据的安全性。HTTP
协议的默认端口号是 80
,而 HTTPS
协议的默认端口号是 443
。
HTTPS
协议需要使用到 SSL
证书,再主流的云平台上都可以免费申请到 SSL
证书。证书申请完成之后,会得到密钥文件和证书文件。如果没有云平台也没有关系,我们可以通过 OpenSSL
命令来生成一个自签名的 SSL
证书,步骤如下:
① 生成私钥文件(Private Key)
1 | openssl genrsa -out private.key 2048 |
② 根据私钥生成证书签名请求文件(Certificate Signing Request, CSR)
1 | openssl req -new -key private.key -out cert.csr |
③ 使用私钥对证书申请进行签名从而生成证书文件(pem)
1 | openssl x509 -req -in cert.csr -out cacert.pem -signkey private.key |