涉及开源项目(dailyfresh-B2C)的部署架构如下:
1)Nginx是什么?
Nginx(engine x)是俄罗斯人Igor Sysoev编写的轻量级Web服务器 ,它不仅是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡服务器。
- 在性能上:Nginx占用很少的系统资源,能支持更多的并发连接(能支持高达50,000个并发连接数),达到更高的访问效率
- 在功能上:Nginx是优秀的代理服务器和负载均衡服务器
- 在安装配置上:Nginx安装简单、配置灵活
- 特点:占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx支持热部署,启动速度特别快,还可以在不间断服务的情况下对软件版本或配置进行升级,即使运行数月也无需重新启动。
在微服务的体系之下,Nginx正在被越来越多的项目采用作为网关来使用,配合Lua做限流、熔断等控制。
对于大多数使用者来说,Nginx只是一个静态文件服务器或者http请求转发器,它可以把静态文件的请求直接返回静态文件资源,把动态文件的请求转发给后台的处理程序,例如php-fpm、apache、tomcat、jetty等,这些后台服务,即使没有nginx的情况下也是可以直接访问的(有些时候这些服务器是放在防火墙的面,不是直接对外暴露,通过nginx做了转换)。
1.1 什么是代理服务器?
代理服务器就是位于发起请求的客户端与原始服务器端之间的一台跳板服务器,正向代理可以隐藏客户端,反向代理可以隐藏原始服务器。
1.2 什么是反向代理?
反向代理对用户是不可知的,比如我们访问百度网站,百度的代理服务器对外的域名为 https://www.baidu.com 。具体内部的服务器节点我们不知道,现实中我们通过访问百度的代理服务器后,代理服务器给我们转发请求到他们N多的服务器节点中的一个给我们进行搜索后将结果返回。
用户知道目标服务器地址,但由于网络限制等原因,无法直接访问。这时候需要先连接代理服务器,然后再由代理服务器访问目标服务器。
1.3 负载均衡
-
为什么需要负载均衡?
客户端发送多个请求到服务器,服务器处理请求,有些可能要访问数据库,服务器处理完毕后再将结果返回客户端。这种架构模式单一,适合并发请求少的情况,但并发量大的时候就很难处理。如果只是升级服务器配置,硬件的性能提升很难满足日益增长的需求,此时想到服务器集群,增加服务器数量,然后将原先请求单个服务器的情况改为将请求分发到多个服务器上,将负载分发到多个服务器上,也就是负载均衡。
-
动静分离:
为了加快网站的解析速度,可以把动态页面和静态页面有不同的服务器来解析,减少服务器压力,加快解析速度。 -
原理:master&worker
master接收信号后将任务分配给worker进行执行,worker可有多个。
客户端发送一个请求到master后,worker获取任务的机制不是直接分配也不是轮询,而是一种争抢的机制,“抢”到任务后再执行任务,即选择目标服务器tomcat等,然后返回结果。
- 优点:每个 woker 是独立的进程,若其中一个woker出现问题,其他继续进行争抢,实现请求过程,不会造成服务中断。
2)Nginx的安装及部署(Windows)
2.1 下载和安装
官方网站:https://nginx.org/en/download.html
Nginx官网提供了三个类型的版本:
- Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版
- Stable version:最新稳定版,生产环境上建议使用的版本
- Legacy versions:遗留的老版本的稳定版
【Windows下安装】
下载后解压(切记不能含有中文路径!),文件结构如图:
2.2 基本操作指令(Windows下)
2.2.1 启动服务
有两种方法:
- 直接双击该目录下的"nginx.exe",即可启动nginx服务器
- 命令行进入该文件夹,执行start nginx命令,也会直接启动nginx服务器(推荐使用)
验证方法:打开浏览器,输入地址:http://localhost,访问页面,出现如下页面表示访问成功。
2.2.2 停止服务
-
直接杀nginx进程:tasklist 查看nginx的主进程号(tasklist /svc命令可查看进程所对应的服务),用tskill PID(结束进程)来强制停止nginx,注意,一般会有多个nginx.exe进程在执行,所以要删除多个
C:\Users\Facek>tasklist /fi "IMAGENAME eq nginx.exe" 映像名称 PID 会话名 会话# 内存使用 ========================= ======== ================ =========== ============ nginx.exe 49352 Console 3 8,104 K nginx.exe 44236 Console 3 8,428 K C:\Users\Facek>taskkill /f /pid 49352 成功: 已终止 PID 为 49352 的进程。 C:\Users\Facek>taskkill /f /pid 44236 成功: 已终止 PID 为 44236 的进程。 C:\Users\Facek>tasklist /fi "IMAGENAME eq nginx.exe" 信息: 没有运行的任务匹配指定标准。
-
调用 nginx -s stop 快速停止nginx(强制关闭服务)
-
调用 nginx -s quit 完整有序的停止nginx(退出服务)
*操作中遇到的问题之关闭nginx后依然可看到登录界面
- 原因:可能是浏览器的本地缓存,可以打开logs文件夹下的access.log文件,可以看到日志中返回的代码是304 → 认为请求的页面未发生变化,用户请求该网址时,浏览器调用本地缓存显示该页面。
- 解决方法:清除浏览器缓存。
2.2.3 重载服务
- nginx -s reload 平滑的重启,配置重载。
nginx工作中,包括一个master进程,多个worker进程。worker进程负责具体的http等相关工作,master进程主要是进行控制等控制。
nginx -s reload 命令加载修改后的配置文件,命令下达后发生如下事件:
-
Nginx的master进程检查配置文件的正确性,若是错误则返回错误信息,nginx继续采用原配置文件进行工作(因为worker未受到影响)
-
Nginx启动新的worker进程,采用新的配置文件
-
Nginx将新的请求分配新的worker进程
-
Nginx等待以前的worker进程的全部请求已经都返回后,关闭相关worker进程
-
重复上面过程,知道全部旧的worker进程都被关闭掉。
所以,重启之后,master的进程号不变,worker的进程号会改变。
(可参考:https://www.cnblogs.com/happySmily/p/6003579.html))
2.2.4 其他
- 验证配置文件:nginx -t
- 使用配置文件:nginx -c “配置文件路径”
- 使用帮助:nginx -h
2.3 Nginx配置文件说明
在项目使用中,使用最多的三个核心功能是静态服务器、反向代理和负载均衡。这三个不同的功能的使用,都跟Nginx的配置密切相关,Nginx服务器的配置信息主要集中在"nginx.conf"这个配置文件中。
主要分为:
- main模块:全局配置
- event模块:工作模式配置
- http模块:作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置。
- sever模块:srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。
- location模块:Nginx配置中出现最多的一个配置,主要用于配置路由访问信息,在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以location模块也是一个非常重要的配置模块。
- upstream模块:主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。
(具体的可配置选项介绍可参考:https://www.cnblogs.com/wcwnina/p/8728430.html)
2.4 Nginx主要配置
1、静态Http服务器配置
Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。
2、反向代理服务器配置
3、负载均衡配置
4、虚拟主机配置
有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。
例如将www.aaa.com和www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
(详细说明依然可参考:https://www.cnblogs.com/wcwnina/p/8728430.html)
3)Nginx的安装及部署(Ubuntu)
1、apt-get安装
he@he-ThinkPad-X200:~$ sudo apt-get install nginx
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libreadline5
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail
libnginx-mod-stream nginx-common nginx-core
Suggested packages:
fcgiwrap nginx-doc
The following NEW packages will be installed:
libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail
libnginx-mod-stream nginx nginx-common nginx-core
0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded.
Need to get 602 kB of archives.
After this operation, 2,134 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://cn.archive.ubuntu.com/ubuntu focal-updates/main amd64 nginx-common all 1.18.0-0ubuntu1 [37.3 kB]
...
he@he-ThinkPad-X200:~$ nginx -v # 检查是否安装成功
nginx version: nginx/1.18.0 (Ubuntu)
he@he-ThinkPad-X200:~$
nginx文件安装完成之后的文件位置:
- /usr/sbin/nginx:主程序
- /etc/nginx:存放配置文件
- /usr/share/nginx:存放静态文件
- /var/log/nginx:存放日志
he@he-ThinkPad-X200:/usr/sbin$ ls | grep nginx*
nginx
he@he-ThinkPad-X200:/usr/sbin$ cd
he@he-ThinkPad-X200:~$ ls /etc/nginx
conf.d koi-utf modules-available proxy_params sites-enabled win-utf
fastcgi.conf koi-win modules-enabled scgi_params snippets
fastcgi_params mime.types nginx.conf sites-available uwsgi_params
he@he-ThinkPad-X200:~$ ls /usr/share/nginx
html modules modules-available
he@he-ThinkPad-X200:~$ ls /var/log/nginx
access.log error.log
2、启动
he@he-ThinkPad-X200:~$ service nginx start
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'nginx.service'.
Authenticating as: he,,, (he)
Password:
==== AUTHENTICATION COMPLETE ===
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
报错之Job for nginx.service failed because the control process exited with error code
1. 输入提示里的命令:systemctl status nginx.service
he@he-ThinkPad-X200:~$ systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2021-04-25 22:08:03 CST; 8min ago
Docs: man:nginx(8)
Process: 191465 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 191466 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)
4月 25 22:08:02 he-ThinkPad-X200 nginx[191466]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
4月 25 22:08:02 he-ThinkPad-X200 nginx[191466]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
4月 25 22:08:02 he-ThinkPad-X200 nginx[191466]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
4月 25 22:08:02 he-ThinkPad-X200 nginx[191466]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
4月 25 22:08:03 he-ThinkPad-X200 nginx[191466]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
4月 25 22:08:03 he-ThinkPad-X200 nginx[191466]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
4月 25 22:08:03 he-ThinkPad-X200 nginx[191466]: nginx: [emerg] still could not bind()
4月 25 22:08:03 he-ThinkPad-X200 systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
4月 25 22:08:03 he-ThinkPad-X200 systemd[1]: nginx.service: Failed with result 'exit-code'.
4月 25 22:08:03 he-ThinkPad-X200 systemd[1]: Failed to start A high performance web server and a reverse proxy server.
he@he-ThinkPad-X200:~$
- 原因:由报错推测是端口被占用了(nginx默认启动端口是80)。
- 解决方法:
2、尝试查看占用端口的进程并kill掉
he@he-ThinkPad-X200:~$ ps -e |grep nginx # 查看是否已经启动了nginx
# 如果没有的话则按照提示,查看0.0.0.0:80端口谁占用了,使用netstat -ltunp命令,可以看到:
he@he-ThinkPad-X200:~$ netstat -tnlp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:33060 0.0.0.0:* LISTEN -
tcp6 0 0 127.0.0.1:63342 :::* LISTEN 166494/java
tcp6 0 0 :::8080 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 ::1:631 :::* LISTEN -
tcp6 0 0 ::1:6010 :::* LISTEN -
tcp6 0 0 127.0.0.1:6942 :::* LISTEN 166494/java
# 或者使用lsof -i:80 查看80端口被占用的进程:
he@he-ThinkPad-X200:~$ sudo lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 193092 root 4u IPv6 1446264 0t0 TCP *:http (LISTEN)
apache2 193093 www-data 4u IPv6 1446264 0t0 TCP *:http (LISTEN)
apache2 193094 www-data 4u IPv6 1446264 0t0 TCP *:http (LISTEN)
# 可以看出是被apache2占用了
# 尝试通过kill命令干掉这些进程:
he@he-ThinkPad-X200:~$ sudo kill -9 193092
结果进程总杀总有…
于是改变策略:如若占用80端口的服务/程序不能关闭,则更改nginx监听的端口号:
3、或者是打开nginx的配置文件,修改监听端口号:
# 如果不清楚配置文件在哪,可以用命令nginx -t
# 输入该命令时,nginx会去测试你得配置文件得语法,并告诉你配置文件是否写得正确,同时也告诉了你配置文件得路径。
he@he-ThinkPad-X200:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新启动nginx:
he@he-ThinkPad-X200:~$ service nginx start
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'nginx.service'.
Authenticating as: he,,, (he)
Password:
==== AUTHENTICATION COMPLETE ===
he@he-ThinkPad-X200:~$ ps -e |grep nginx # 查看是否启动成功
193474 ? 00:00:00 nginx
193475 ? 00:00:00 nginx
193476 ? 00:00:00 nginx
遇到的问题之打开localhost:8080依然是apache2的页面
尝试了关闭apache:sudo /etc/init.d/apache2 stop
依然不行。
最后发现,配置文件除了修改端口号以外,还需要修改默认网站目录:
vi /etc/nginx/sites-enabled/default
#root /var/www/html;
root /usr/share/nginx/html; # 修改默认网站目录
然后重载Nginx服务:
he@he-ThinkPad-X200:~$ sudo nginx -s reload
问题解决。
【部分内容参考自】
- Nginx中文文档:https://www.nginx.cn/doc/
- Nginx-基本概念和原理:https://baijiahao.baidu.com/s?id=1677770814186358219&wfr=spider&for=pc
- 正向代理和反向代理:https://zhuanlan.zhihu.com/p/82300486
- Nginx 安装与部署配置以及Nginx和uWSGI开机自启:https://www.cnblogs.com/wcwnina/p/8728430.html
- ubuntu安装nginx:https://blog.csdn.net/qq_23832313/article/details/83578836
- Ubuntu下Nginx与Apache2修改默认端口号:https://www.linuxidc.com/Linux/2017-04/143094.htm