Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。
前向代理作为客户端的代理,服务端只知道代理的 IP 地址而不知道客户端的 IP 地址。
推荐使用 LNMP 一键安装包,Ubuntu/CentOS 等各平台都有提供,省去自己配置的过程。
如果需要单独安装 Nginx,可以去找各平台的安装包名称。以 Ubuntu Desktop 19.04 为例,单独安装 Nginx 的命令如下:
sudo apt install nginx
Nginx 安装后默认启动,打开浏览器输入 http://127.0.0.1
检查是否安装成功。
使用
tail -f /path/to/nginx/log/access.log
实时监控文件变化,再分别本地访问 127.0.01 和远程访问服务器 IP 地址,比较两次访问的日志有什么不同? Tips: Ubuntu Server 版默认没有桌面,通过 SSH 连接到服务器
刚才在 Ubuntu 默认的火狐浏览器打开 127.0.0.1 时的访问日志如图。
接下来换一台电脑访问 192.168.23.129。
首先可以看到,UA 是不一样的,这是因为我用了不同的浏览器,当然,访问时间等也是不一样的。
最关键的一点,第一次访问的 IP 是 127.0.0.1,是环回地址,而后一次访问的 IP 是 192.168.23.1,这个是我 Windows 10 的 IP 地址。
最后看一点实战的内容——我的博客的访问日志:
从中可以看到类似的日志记录,不仅记录了访问者的 IP、UA,还记录了访问资源 URL 以及一些附加的信息。
同样的,还有错误日志,例如看一下 gitlab.error.log
。
有了这些日志,管理员就方便排查问题了。
配置文件:/etc/nginx/nginx.conf
(如果是 LNMP 安装的,则可能在 /usr/local/nginx/conf/nginx.conf
)。
可以用 less
查看配置文件,配置文件默认的环境是全局环境,即一个 main{}
,后面会定义用户、工作进程等,以及 HTTP 服务、邮件服务。
下面主要讲一下 HTTP 配置文件。
首先在 HTTP{}
会有一些全局的配置,包括访问日志、连接超时等信息,随后会给出一个或多个 server
表示多个虚拟主机。
来看一下实战的配置文件。
用户和用户组都是 www,配置了错误日志的访问路径,工作模式是 epoll、IO 多路复用,单个进程的最大连接数是 51200。
配置了 fastcgi 相关信息。
Nginx 默认的静态资源文件夹为 /var/www/html
(不同的安装包可能有不同的默认路径,例如可能为 /usr/local/nginx/www/html/default
或者其他目录,也可以自己指定)。
在默认目录下,新建一个叫做 jxtxzzw.html
的文件,随便写一点东西。
然后在 nginx.conf
的 HTTP 结点中新增一个虚拟服务器,并 sudo nginx -s reload
重新加载。
如图,在 80 端口监听,当用户访问的服务器是 jxtxzzwtest.com
的时候,就定位到 /var/www/html/
下,并当用户没有指定访问的路径的时候,默认访问 jxtxzzw.html
。
为了模拟域名解析的过程,修改 /etc/hosts
文件,增加 jxtxzzwtest.com
的 IP 为 127.0.0.1
。
修改之后打开浏览器访问 jxtxzzwtest.com
,可以看到刚才的页面。
如何不购买新的二级域名和服务器,利用该服务器和已有的域名再做一个个人主页呢?
这就可以添加一个新的虚拟服务器。
重复上面的步骤,只是注意添加虚拟服务器的时候取一个新的 server_name
,例如 new.jxtxzzwtest.com
,至于 location
写什么,就看个人主页放在了哪个文件夹下面了。这些都可以根据自己需要修改。
server { listen 80; server_name new.jxtxzzwtest.com; location / { index a_new_page.html; root /home/jxtxzzw/web/;
}
}
随后,在 hosts
模拟 DNS 解析,添加 127.0.0.1 new.jxtxzzwtest.com
之后就可以在浏览器访问 new.jxtxzzwtest.com
来看到个人主页了。
server { listen 80; server_name www.zzw.com; access_log /var/log/nginx/zzw.access.log; location / { index index.html; root /var/www/html/zzw.com/;
}
}
输入 IP 地址,不论是本机访问 127.0.0.1 还是另一台电脑访问 192.168.23.129,发现都只访问了 Nginx 默认的安装成功页面,没有进入 zzw.com。
显然的,只有 access.log 会有变化,记录了本次访问信息。
而在添加了 hosts 以后,访问 www.zzw.com 就会看到刚才输入的信息。
需要注意的是,在配置文件中只定义了 www.zzw.com
,没有定义 zzw.com
,所以,在访问 zzw.com 的时候还是会跳转到 Nginx 安装成功的那个页面。
解决这个办法可以在 server_name
后面增加一个别名。
server_name www.zzw.com zzw.com;
看到 zzw.access.log 和 access.log 都有了新的记录。
来看一些实战的内容。
我的博客,监听了 80 端口,同时处理 www.jxtxzzw.com
和 jxtxzzw.com
两个服务器名字,并对 80 端口的请求全部转发到 443 端口。
443 端口配置了一些关于 SSL 相关的信息,并且导入了 PHP 相关的配置。
同时,还有一个 gitlab.jxtxzzw.com
的虚拟主机,这个配置文件将在下面详述。
负载均衡转发算法:
负载均衡算法:
预备 Web 服务器环境:
/opt/lampp/logs/access.log
在 nginx.conf 的 http 节点下添加以下代码后重新加载配置
upstream first { server 192.168.23.128; server 192.168.23.130;
}server { listen 80; server_name load.jxtxzzwtest.com; location / { proxy_pass http://first;
}
}
修改电脑的 host 文件,添加一个域名解析
192.168.23.129 load.jxtxzzwtest.com
浏览器访问 load.jxtxzzwtest.com,发现打开了 XAMPP 的一个界面,说明代理成功了。
但是到底访问的是哪一个 XAMPP 呢?可以看一下日志。
在此之前,刷新几次,看看日志会不会访问了不同的页面。
日志的观察结果,可以看到 128 的那台服务器上收到了若干次来自 129 的转发请求,而 130 的那台服务器上也收到了若干请求,但是观察时间可以看到,两台服务器上接受的请求是先后交替的,这意味着符合轮询算法的期望结果。
更加直观的方法,是可以修改其中一个 Apache 服务器的主页显示。
简单粗暴的方法,删掉了 128 那台服务器的 index.html。
然后刷新页面的效果就是交替出现 XAMPP 的 dashboard 和 Directory Listing。
刷新以后变成下面这个页面,两个页面在每次刷新后交替显示。
如果没有交替显示,有可能是浏览器做了缓存,强制刷新一下就好了。
访问日志可以看出,交替比例变为 3:1。
需要特别说明的是,浏览器可能存在缓存,所以一定要去看日志。
换成 hash 以后,我只能刷出 Index of /dashboard 这个页面,不论刷新多少次,而查看访问日志也确实发现我被转发到了 130 这个服务器上。
换一台设备,可能(如果正好 hash 计算结果不同)就会被转发到 128 的服务器上。也可能还是访问的 130 的服务器。
再来看一些关于 Nginx 代理的实战的例子。
第一个例子是 HTTPS 反向代理到 Docker,具体的配置过程可以看我的另一篇文章《Nginx代理HTTPS到Docker指定端口》(https://www.jxtxzzw.com/archives/4241),这里只简要的给出与反向代理、负载均衡相关的代码。
第二个例子是 GitLab。
如果不想用 GitLab 自带的 Nginx 服务,而想要把 GitLab 作为一个虚拟主机统一在已有的 LNMP 服务中一起管理,可以用到反向代理。
由于 GitLab 默认的是在 socket 中通信,所以有点不太一样。
这两张截图省略了 GitLab 中与 SSL 配置相关的代码。
第一个练习,比较简单,基本上只要复现本文内容即可,唯一的区别在于需要把本文中简陋的 HTML 代码复杂化,加上与数据库通信的部分,例如,访问数据库并列出所有学生的姓名……
由于上一次练习《MySQL备份与主备配置》已经配置了双主结构,所以,在一个 PHP 页面中加入增删改查的功能,并把页面复制到另一台服务器上就可以了,访问会通过负载均衡,数据库的访问会通过双主备份,保证了数据的一致。
代码就不贴了。
另外,欢迎访问我的个人博客呀,https://www.jxtxzzw.com/。
第二个练习,简单说一下。
Nginx 相对于 Apache 的优势:
Apache 相对 Nginx 的优点:
一般来说,需要性能的 Web 服务,用 Nginx,如果不需要性能只求稳定,那就 Apache 吧。总之,就是看自己需求的。
但是从个人使用经历来看,我会推荐 Nginx 作为 Web 服务器的首选。如果你是新手,什么都没接触过,不妨先试试 Nginx?