Nginx是一个开源的,具备高性能、高并发、高可靠性的WWW服务和代理服务软件。相比于Apache,Nginx能够支持更多的并发连接访问,占用的资源更少,效率更高。
Nginx的特点:
支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
资源消耗少:在3万并发连接下,开启10个Nginx线程消耗不到200MB内存
可以做HTTP反向代理及加速缓存,及负载均衡功能,内置对RS节点服务器健康检查功能。
Nginx核心企业应用场景
静态web服务器
使用Nginx运行HTML、JS、CSS、图片等静态数据(类似的软件:Apache、lighttpd、IIS、Node.js)
支持动态web服务扩展。
Nginx结合FASTCGI运行PHP等动态程序。(fastcgi_pass方式)
Nginx结合proxy_pass运行Java等动态程序。(tomcat/resin服务)
Nginx结合uwsgi_pass运行Python动态程序。
反向代理和负载均衡服务
正向代理:代替局域网内的PC,请求外部应用服务
反向代理:代替外部的用户请求内部的应用服务器(重点学习)
负载均衡:只转发、后抛请求,与反向代理相比效率更高。负载均衡同类软件(haproxy,lvs),硬件(F5,netscaler)
web缓存服务器
在web缓存服务方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业缓存软件的功能。
常见的缓存软件(Squid、Varnish、Nginx、Ats)
支持安全的web服务(HTTPS)
Nginx安装
安装方式选择
本次选用两种安装方式:官方yum仓库安装 和源码定制安装
官方yum仓库安装 官方文档:nginx: Linux packages
1 2 3 4 5 6 7 8 vim /etc/yum.repos.d/nginx.repo yum install nginx -y rpm -qa nginx systemctl start nginx systemctl enable nginx systemctl status nginx netstat -tunlp | grep nginx wget 服务端IP
源码定制安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 cd /server/tools wget http://nginx.org/download/nginx-1.20.1.tar.gz yum install pcre pcre-devel -y yum install openssl openssl-devel -y rpm -qa pcre pcre-devel openssl openssl-devel cd nginx-1.20.1.tar.gztar xvf nginx-1.20.1.tar.gz cd nginx-1.20.1./configure --user=www --group=www --prefix=/application/nginx-1.20.1 --with-http_stub_status_module --with-http_ssl_module --with-pcre make make install ln -s /application/nginx-1.20.1 /application/nginx /application/nginx/sbin/nginx netstat -tunlp | grep nginx wget 服务端IP
优化:修改环境变量
1 2 3 4 5 vim /etc/profile export PATH="/application/nginx/sbin:$PATH " . /etc/profile
优化:使用systemctl控制进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 vim /usr/lib/systemd/system/nginx.service [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/application/nginx/logs/nginx.pid ExecStart=/application/nginx/sbin/nginx -c /application/nginx/conf/nginx.conf ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /application/nginx/logs/nginx.pid) " ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /application/nginx/logs/nginx.pid) " [Install] WantedBy=multi-user.target
Nginx软件目录结构 Nginx软件的核心组成
Nginx可执行程序
Nginx配置文件
Nginx访问日志access.log,记录用户访问日志
Nginx error错误日志,记录错误信息
yum安装的Nginx目录结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 rpm -ql nginx /etc/logrotate.d/nginx /etc/nginx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf /etc/nginx/mime.types /etc/nginx/modules /usr/lib64/nginx/modules /etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /usr/lib64/nginx /usr/sbin/nginx /usr/sbin/nginx-debug /usr/share/nginx /usr/share/nginx/html /usr/share/nginx/html/50x.html /usr/share/nginx/html/index.html /var/cache/nginx /var/log/nginx
编译安装的Nginx目录结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 tree /application/nginx nginx ├── client_body_temp ├── conf │ ├── fastcgi.conf │ ├── fastcgi.conf.default │ ├── fastcgi_params │ ├── fastcgi_params.default │ ├── koi-utf │ ├── koi-win │ ├── mime.types │ ├── mime.types.default │ ├── nginx.conf │ ├── nginx.conf.default │ ├── scgi_params │ ├── scgi_params.default │ ├── uwsgi_params │ ├── uwsgi_params.default │ └── win-utf ├── fastcgi_temp ├── html │ ├── 50x.html │ └── index.html ├── logs │ ├── access.log │ ├── error.log │ └── nginx.pid ├── proxy_temp ├── sbin │ └── nginx ├── scgi_temp └── uwsgi_temp
Nginx配置文件 nginx主配置文件 通过不同方式安装的nginx,配置文件不完全相同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; }
nginx的虚拟主机配置文件 虚拟主机是一个网站站点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 cat /etc/nginx/conf.d/default.conf server { listen 80; server_name localhost; charset utf-8; location /index { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
location区段配置 location区段是用来控制访问网站的URI路径
location语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 location name{...} "=" 前缀指令匹配,如果匹配成功,则停止其他匹配普通字符串指令匹配,顺序是从长到短,匹配成功的location如果使用^~,则停止其他匹配(正则匹配) 正则表达式指令匹配,按照配置文件里的顺序,成功就停止其他匹配 如果第三步中有匹配成功,则使用该结果,否则使用第二步结果
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 location ^~ /helloworld { return 601; } location ~ /helloworld { return 603; }
1 2 3 4 5 6 7 8 9 location /helloworld/test/ { return 601; } location /helloworld/ { return 602; }
1 2 3 4 5 6 7 8 9 10 11 12 13 location /helloworld/test/ { return 601; } location ~ /helloworld { return 602; } location ~ /helloworld/test { return 603; }
多实例和多虚拟主机 多实例和多虚拟主机概念 虚拟主机:一个虚拟主机,可以理解为在web服务中的一个独立的网络站点,这个站点对应独立的域名(也可以是IP或者端口),具有独立的程序以及资源目录,可以独立地对外提供服务,供用户访问。
多实例:一个nginx master进程对应一个实例,一个实例可以有多个虚拟主机
为什么要用虚拟主机?
如果不用虚拟主机,那么一个域名就要对应一台服务器,浪费资源
如果采用多实例的方式,那么多个nginx进程相比于多个虚拟主机来说,对服务器的性能压力很大
正确的做法:一个nginx主进程,对应多个虚拟主机;可以同时开启多个nginx主进程,从而达到资源的最大利用
虚拟主机分类
基于域名的虚拟主机:一般用于企业提供正常网站服务,是最常用的虚拟主机方式
基于端口的虚拟主机:一般用于不对外提供访问的服务
比如测试环境、网站的后台(不做域名解析、不用默认端口、不配公网IP、通过VPN拨号访问)等
应用的各种API接口(内部访问)
前端有负载均衡的情况,负载均衡下面的节点用什么端口无所谓
基于IP的虚拟主机:很少用到
虚拟主机原理
客户端:
浏览器输入【域名:端口】回车
浏览器请求本地DNS解析器,若没有则递归查询进行DNS解析,最终获取到IP
请求web服务器建立TCP三次握手连接
发起http请求,请求IP的对应端口
发起HTTP请求报文
服务端:
监听本地网卡,对端口的请求
读取接收到的HTTP报文的信息
读取Nginx配置文件中虚拟主机server标签中的信息
先匹配server对应的端口号
相同端口号去匹配server_name对应的域名
把对应域名下的站点目录下的index.html文件发送给客户端
如果没有匹配的域名,就把排在第一个顺序的server标签虚拟主机对应的内容发给客户端
部署多实例和多虚拟主机
多实例的部署比较简单,只需要启动一个nginx进程即可,需要指定配置文件
1 [nginx命令路径] -c [nginx主配置文件路径]
单实例多虚拟主机的部署只需要在实例的配置文件中添加一个server区域即可,可以在主配置文件中添加,也可以额外新建文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 server { listen 80; server_name blog; charset utf-8; location / { root html/blog; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html/blog; } } server { listen 80; server_name bbs; charset utf-8; location / { root html/bbs; index index.html index.htm; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html/bbs; } } nginx -t systemctl reload nginx
实践:大厂多项目部署多实例web解决方案
创建多个用户,每个用户家目录作为一个web实例的根目录,实现环境隔离
1 2 3 useradd www && passwd www useradd bbs && passwd bbs useradd blog && passwd blog
每个用户的家目录创建站点目录
1 mkdir -p conf/extra logs html
编写配置文件
1 主配置文件,更改nginx进程的用户,日志格式,访问日志的路径错误日志的路径,pid文件的路径
一个location区段的作用场景:日志过滤 :
一个网站会包含很多元素,尤其是大量的图片,js,css等静态资源,这些请求可以不用记录,使用下面的方法。
1 2 3 4 location ~* .*\.(gif|jpg|png|css|js)$ { access_log /dev/null }
一个server区段的作用场景:解决恶意域名解析
若是有人将没有备案的域名解析到本公司的服务器IP上,当有客户端通过这个域名访问时,我们的服务器查不到客户端访问所请求的域名信息,就会默认把第一个虚拟主机分配给客户端进行访问,所以为了解决这个问题,可以将nginx第一个虚拟主机设置为
1 2 3 4 server{ listen 80 default; return 404; }