- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Nginx服务
nginx [发音:engine x]是一个HTTP和反向代理服务器,一个邮件代理服务器和一个通用的TCP / UDP代理服务器,最初由Igor Sysoev编写。
据Netcraft称,nginx 在2019年5月服务或代理了 26.43%最繁忙的网站。以下是一些成功案例: Dropbox, Netflix, Wordpress.com, FastMail.FM。
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler. According to Netcraft, nginx served or proxied 26.43% busiest sites in May 2019. Here are some of the success stories: Dropbox, Netflix,Wordpress.com, FastMail.FM.
从下面的当下技术架构图中,可以看出Nginx在网络中的位置与重要性。Nginx的轻量级、内存占用少、启动极快,高并发能力强的特性,使它在互联网项目中广泛应用。
Service-Oriented Architecture,SOA面向服务的架构
Nginx简介
什么是反向代理
正向代理 :
由于防火墙的原因,我们并不能直接访问谷歌,那么我们可以借助VPN来实现,这就是一个简单的正向代理的例子。这里你能够发现,正向代理“代理”的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过VPN访问的。
反向代理:
当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。
Nginx的技术架构
Master进程的作用是读取并验证配置文件nginx.conf;管理worker进程;
Worker进程的作用:每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;
注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。
特点:
-
主进程Master
Nginx
启动时,会生成两种类型的 进程*,一个是 主进程(master
),一个(windows
版本的目前只有一个)或 多个工作进程(worker
)。主进程 并不处理网络请求,主要负责 调度工作进程,也就是图示的3
项:加载配置、启动工作进程 及 非停升级。所以,Nginx
启动以后,查看操作系统的进程列表,我们就能看到 至少有两个Nginx
进程。 -
工作进程Worker
服务器实际 处理网络请求 及 响应 的是 工作进程(
worker
),在类unix
系统上,Nginx
可以配置 多个worker
,而每个worker
进程 都可以同时处理 数以千计 的 网络请求。 -
模块化设计
标准HTTP模块、可选的HTTP模块(gzip等)、邮件服务、第三方(Lua)
Nginx
的worker
进程,包括 核心 和 功能性模块,核心模块 负责维持一个 运行循环(run-loop
),执行网络请求处理的 不同阶段 的模块功能,比如:网络读写、存储读写、内容传输、外出过滤,以及 将请求发往上游服务器 等。而其代码的 模块化设计,也使得我们可以根据需要对 功能模块 进行适当的 选择 和 修改,编译成具有 特定功能 的服务器。 -
事件驱动模型
基于 异步及非阻塞 的 事件驱动模型,可以说是
Nginx
得以获得 高并发、高性能 的关键因素,同时也得益于对Linux
、Solaris
及类BSD
等操作系统内核中 事件通知 及I/O
性能增强功能 的采用,如kqueue
、epoll
及event ports
。 -
代理设计
Nginx高可用
VRRP(Virtual Router Redundancy Protocol),即虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将多台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
KeepAlived + Nginx来组成高可用的方案:
第一:请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP)
第二:Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换)
Nginx服务安装
Centos安装方式
推荐使用在线安装方式:
分类 | yum方式 | 源码安装 |
---|---|---|
网络 | 需要 | 可以不需要 |
安装位置 | /etc/nginx配置文件,/usr/sbin/nginx | /usr/local/nginx目录 |
管理命令 | 提供 | 不提供 |
启动 | service nginx start | 执行绝对路径/usr/local/nginx/sbin/nginx |
删除 | yum remove nginx或者rpm -e nginx | rm -rf /usr/local/nginx |
-
在线安装
添加nginx的repo:
$ vim /etc/yum.repos.d/nginx.repo
输入以下内容:
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
:wq
保存后,使用yum update
,接下来就是安装了。yum install -y nginx # 管理命令: # 启动/停止/重启 service nginx start/stop/restart # 卸载 yum remove -y nginx # 或者强制卸载,不考虑依赖 rpm -e nginx
-
源码安装
-
安装对应的依赖:
yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel
-
下载源码包:
wget -O /tmp/nginx.tar.gz http://nginx.org/download/nginx-<version>.tar.gz
比如:
wget -O /tmp/nginx.tar.gz http://nginx.org/download/nginx-1.17.0.tar.gz
-
解压
cd /tmp/ tar zxvf nginx.tar.gz
-
编译
$ ./configure Configuration summary - using system PCRE library - OpenSSL library is not used - using system zlib library nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx/conf" nginx configuration file: "/usr/local/nginx/conf/nginx.conf" nginx pid file: "/usr/local/nginx/logs/nginx.pid" nginx error log file: "/usr/local/nginx/logs/error.log" nginx http access log file: "/usr/local/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp"
-
安装
make && make install
-
管理方法:
直接可以使用可执行文件进行启动/停止/重启
# 启动 /usr/local/nginx/sbin/nginx # 停止 /usr/local/nginx/sbin/nginx -s stop # 重启 /usr/local/nginx/sbin/nginx -s reload
-
管理脚本
$ vi /etc/init.d/nginx
输入如下内容:
#!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: NGINX is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /usr/local/nginx/conf/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /usr/local/nginx/logs/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` if [ -z "`grep $user /etc/passwd`" ]; then useradd -M -s /bin/nologin $user fi options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
添加开机启动:
# 给予执行权限 chmod a+x /etc/init.d/nginx # 设置开机启动 chkconfig nginx on # 启动 systemctl start nginx
参考资料: