Nginx
笔记来源:哔哩哔哩尚硅谷nginx教程
nginx官网下载
基本概念
什么是Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。并发性能强悍。
参考:nginx描述
Nginx作为web服务器
Nginx可以作为静态页面的web服务器,同事还支持CGI协议的动态语言,例如perl、php等。但不支持java。java程序只能通过与Tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告标明能支持高达50000个并发连接数。
反向代理
正向代理:局域网外的Internet看做是一个巨大的资源库,那么局域网中的客户端想要访问Internet,则需要通过代理服务器来访问,这种代理服务就是正向代理
反向代理:我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
负载均衡
当我们采用服务器集群部署后,代理服务器会根据不同的负载均衡策略,例如轮询之类的,将请求分发到各个服务器
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来但发个服务器的压力。这就是动静分离。例如之前我们将html、css等全部打包部署在Tomcat内,因此浏览器请求这些静态资源的时候也要请求Tomcat服务器,为了解决这个问题我们将静态资源单独拿出来放在另外的服务器,减轻Tomcat压力,这就是动静分离。
安装、常用命令及配置文件
在Linux系统中安装Nginx
- 下载nginx包
- 首先安装nginx依赖的其他包
- 安装pcre
wget http://downloads.sourceforge.net/project/pcre/pcrepcre/8.37/pcre-8.37.tar.gz
- 解压文件到
./configure
,完成后,回到pcre目录下执行make,再执行make install
- 安装pcre
算了 不写了,参考 这位歹佬的帖子
在Windows系统中安装
官网下载地址
下载后解压(切记不能含有中文路径!!),文件结构如图(我解压的路径就有中文,记得拷贝放置于英文目录下即可!):
启动
两种方法:
1) 直接双击该目录下的"nginx.exe",即可启动nginx服务器;
2) 命令行进入该文件夹,执行start nginx命令,也会直接启动nginx服务器。
验证
开浏览器,输入地址:http://localhost:88,默认端口是80,因此可以直接访问localhost即可,我这里是将配置文件的监听端口改成了88. 访问页面,出现如下页面表示访问成功。如果访问不成功有可能是88端口被占用了,可以使用命令netstat -ano | find ":88"
查询端口占用情况,如果被占用,可以在conf/nginx.conf文件中修改端口,修改后再启动。
Nginx常用命令
- 查看版本号
./nginx -v
- 启动nginx
./nginx
- 停止关闭nginx
./nginx -s stop
- 重新加载 nginx
./nginx -s reload
(当重新修改了nginx配置文件之后,需要重新启动才能生效,使用这个命令就可以重新加载配置文件,不需要重启)
Nginx配置文件
配置文件的位置
Linux系统中配置文件的位置/usr/local/nginx/conf/nginx.conf
配置文件组成
全局块
从配置文件开始到events块之间的内容,主要是会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker process 数,进程PID存放路径、日志存放路径和类型以及配置文件的引导等
#user nobody;
worker_processes 1; # 表示nginx服务器处理并发的配置,这个数值越大,表示能处理并发的数量就越多,但是也会受到软硬件的制约
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# 上面这部分
events {
worker_connections 1024;
}
events块
events块设计的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同事接收多个网络连接,选取那种事件驱动模型来处理连接请求,每个work process可以同事支持的最大连接数等。例如下面这个配置就表示支持的最大连接数为1024
events {
worker_connections 1024;
}
http块(重要)
配置最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http块也可以包括http全局块、server块
- 全局块
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 上面这部分就是全局块
server {
listen 8888;
server_name localhost;
...
- server块(重要)
server块中有很多注释都是一些写好的案例,可以参照来配置,后面会详细讲- 全局server块
- location块
server {
listen 8888;# nginx监听的端口号
server_name localhost;# 主机名称
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
Nginx配置实例
反向代理实例1
- 实现效果:
- 打开浏览器,在浏览器中输入地址 : www.123.com 跳转Linux系统Tomcat的主界面
- 准备工作
- nginx安装
- 在Linux系统中安装Tomcat,使用默认端口8080,并启动Tomcat
- 下载安装包
- 将安装包上传至Linux
usr/src/
(使用xshell或者xftp或者其他工具都行,连接Linux服务器,然后上传即可) - 解压压缩包
tar -vxf
(需要jdk环境) - 进入解压后的bin目录
- 执行
startup.sh
启动Tomcat - 对外开放访问的端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cml --reload
- 查看对外开放的端口命令
firewall-cmd --list-all
- ip+端口访问看是否启动成功
- 要实现的效果
- 在浏览器中输入www.123.com,通过nginx转发访问Linux中的Tomcat
- www.123.com这个域名要在Windows的host文件中进行配置域名映射的IP地址
- 具体配置
- 在host文件中进行域名和IP的配置
- 在nginx进行请求转发的配置
server { listen 80;# nginx监听的端口号 server_name 192.168.17.129;# 主机名称 #charset koi8-r; #access_log logs/host.access.log main; location / { root html; proxy_pass http://127.0.0.1:8080 index index.html index.htm; }
- 测试:启动nginx,在浏览器访问www.123.com 。
具体步骤:在访问这个域名的时候,会首先查找host文件中是否有对应的映射,如果没有再去dns服务器上找对应的地址 ,那么我们这里已经在host中配置了,因此实际上访问的地址是192.168.14.129 也就是Linux虚拟机的IP地址。然后由于Linux中的nginx监听的是80端口,而IP访问不带端口默认就是80端口,因此通过这种方式访问到了nginx内,然后通过反向代理配置转发到127.0.0.1:8080 ,打开了Tomcat的首页。
注意:Linux的80端口和8080端口都要开放出来
- 在host文件中进行域名和IP的配置
反向代理实例2
效果:
nginx 监听9001端口
访问 http://127.0.0.1:9001/edu/ 直接跳转到127.0.0.1:8080
访问 http://127.0.0.1:9001/vod/ 直接跳转到127.0.0.1:8081
实现步骤:
- 在Linux中启动两个Tomcat,然后分别在8080和8081端口启动
- 在Linux的usr/src/下新建两个文件夹,一个是Tomcat8080另一个是Tomcat8081,然后在这两个文件夹中放入两个Tomcat,然后解压缩,分别在两个端口启动
- 启动成功后在浏览器访问看看是否有Tomcat的欢迎页,如果没有看看是不是端口没有开放
- 可以将Tomcat的欢迎页修改一下或者 在刚才的Tomcat8080文件夹中找到Tomcat的解压缩文件夹,在webapp文件夹下新建一个edu文件夹,然后在里面放一个自定义的HTML文件,然后通过127.0.0.1:8080/a.html这种方式访问一下这个文件,如果能访问到,就表示Tomcat启动成功,并且可以通过这两个文件来区分8080和8081
- nginx具体配置,设置nginx监听9001端口,然后当访问路径中包含edu,则转发到8080,如果包含vod则转发到8081
server {
listen 9001;# nginx监听的端口号
server_name 192.168.17.129;# 主机名称
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081
}
location指令说明
该指令用于匹配URL,语法如下:
location [ = | ~ } ~* | ^~ ] url {
}
=
:用于不含正则表达式的url前,要求请求字符串与URL严格匹配,如果匹配成功,就停止继续下收缩并立即处理该请求。例如URL是192.168.0.134:8080/mms/com/list,则location中的配置URL也是mms/com/list~
:用于表示URL包含正则表达式,并且区分大小写~*
:用于表示URL包含正则表达式,并且不区分大小写^~
:用于不含正则表达式的URL前,要求nginx服务器找到表示URL和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则URL和请求字符串做匹配
负载均衡实例
通过nginx分发请求,将请求通过不同策略分发的不同的服务器实例。
实现步骤:
- 还是使用上面的两个Tomcat
- nginx 配置如下:upstream、server.location、server.listen、server.server_name
http {
include mime.types;
default_type application/octet-stream;
# 在这里配置服务地址
upstream myserver {
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}
sendfile on;
keepalive_timeout 65;
server {
listen 80;# nginx的监听端口
server_name 192.168.17.129;# nginx的服务地址
location / {
root html;
# 在这里配置指向服务集群地址的配置,也就是upstream
proxy_pass http://myserver;
index index.html index.htm;
}
负载均衡策略
- 轮询(默认)因此上面的配置会使用这种策略分别发送请求到这两个服务器地址。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,还能自动剔除
- weight 权重:weight代表权重,权重越高被分配的客户端越多
upstream server_pool{
server 192.168.1.11 weight=5
server 192.168.1.12 weight=10
}
- ip_hash:每个请求按访问ip的哈市结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题
upstream server_pool{
ip_hash
server 192.168.1.11
server 192.168.1.12
}
- fair (第三方):按照后端服务器的响应时间来分配请求,时间越短,越优先分配
upstream server_pool{
server 192.168.1.11
server 192.168.1.12
fair
}
动静分离实例
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的吧动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前的实现角度来讲大致分两种:
- 一种就是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方式
- 另一种就是动态跟静态文件混合在一起发布,通过nginx来分开
Expires:location中可以设置一个参数expires,是给一个资源设定一个过期时间,也就说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额哇喔的流量,非常适合经常不变的资源。如果设置3d,则表示三天内访问这个URL,发送一个请求,对比服务改文件最后更新时间有没有变化,如果没有则不会从服务器抓取,而是返回状态码304,如果有,则从服务器开始下载返回200
实现步骤:
- 在Linux中准备一个静态资源,在root目录下新建data文件夹,在下面再新建两个文件夹一个叫www另一个叫image。然后在里面分别放两个静态资源文件,一个HTML一个图片
- nginx 配置:
server {
listen 80;
server_name 192.168.17.129;
location /image/ {
root /data/;
index index.html index.htm;
}
location /www/ {
root /data/;
autoindex on;# 这个配置的意思就是将文件夹内的文件列出来
}
效果:
内容列出来就是因为autoindex那个配置,通过上面这个配置就表示nginx可以请求下来静态资源。
高级
高可用集群配置
Nginx原理
在Linux中Nginx有两个进程,一个是master,另一个是worker,输入命令ps -ef | grep nginx
查看nginx服务的进程。master进程负责给worker分发任务或消息
当客户端发送请求到nginx,然后由master进程接受,接受后master通知worker,由worker来抢这个请求,抢到的请求会通过转发或反向代理等方式去请求真正的地址,然后由worker拿到服务器返回的数据返回给客户端
一个master 多个worker的好处:
-
当我们使用
nginx -s reload
命令热部署重启nginx的时候,正在工作的worker不会停止,只有没有工作的worker才会重启,然后加载新的配置去在重启之后争抢新进请求,正在工作的worker会在工作完了之后再去更新。因此这种方式利于热部署 -
对每个worker进程来说,独立的进程不需要加锁,省掉了锁带来的开销,同事在编程以及问题查找时,也会方便很多。其次采用独立的进程可以让互相之间不会影响,一个进程退出后,其他还在工作,服务不会中断,降低风险
-
设置多少个worker才是合适的?
nginx与redis类似,都是采用io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使上千万个请求也不在话下。每个worker的线程可以吧一个cpu的性能发挥到机制,所以worker数和cpu数相等最为合适。设置少了会浪费CPU,多了会造成CPU频繁切换上下文带来的 损耗。 -
worker_connection