概述
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网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
安装
linux
1.安装pcre
下载pcre包,并解压。
进入解压包中执行./configure。
make && make install编译运行。
pcre-config --version查看是否安装成功。
2.安装zlib
3.安装openssl
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
4.安装nginx
解压nginx。
进入解压包中执行./configure。
make && make install编译运行。
安装成功之后会在/usr/local多出来一个nginx文件夹,nginx/sbin里面会有启动脚本
windows
略
常用指令
必须进入到nginx目录下才能使用。
./nginx -v -> 查看版本号
./nginx -s stop -> 关闭nginx
./nginx -> 开启nginx
./nginx -s reload -> 重新加载nginx.conf
配置文件
nginx的配置文件在/usr/local/nginx/conf/nginx.conf
nginx配置文件分为三部分
全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务整体运行的配置指令,主要包括配置运行Nginx服务器的用户组、允许生成的worker process数,进程PID存放路径、日志存放路径以及配置文件的引入等。
比如配置文件中的
worker_processes 1;
这是Nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
Events块
比如配置文件中的
events {
worker_connections 1024;
}
表示work process支持的最大连接数是1024.
events块设计的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个work precess可以同时支持最大连接数等。
这部份的配置对Nginx的性能影响较大,在实际中应该灵活配置。
Http块
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 80;
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;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
Http全局块
http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看和一台独立硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。
而每个server块也分为全局server块,以及可以同时包含多个lication块。
全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟机主机的名称或ip配置。
location块
一个server可以配置多个location块。
这块的主要作用是基于Nginx服务器接收的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是ip别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应带控制等功能,还有许多第三方模块的配置也在这里进行。
反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
实例一
实现输入www.gojira.com
跳转到tomcat。
1.修改host文件
host文件路径 C:\Windows\System32\drivers\etc\hosts
在host文件里添加上 192.168.200.130 www.codegojira.com
注意:192.168.200.130是我的虚拟机IP地址,使用时需要换成自己的。
2.修改nginx.conf文件
nginx.conf路径 /usr/local/nginx/conf/nginx.conf
在nginx.conf修改
...
server {
listen 80;
server_name www.gojira.com; <- 修改为网址地址
#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;
}
...
实例二
1. 实现效果
使用nginx反向代理,根据访问的路径跳转到不同的服务中。
nginx监听的端口为9001。
访问http://192.168.200.300/edu/直接跳转到127.0.0.1:8080
访问http://192.168.200.300/dev/直接跳转到127.0.0.1:8081
2. 准备工作
准备两个tomcat服务器,一个8080端口,一个8081端口。
创建文件和测试页面。
3. 具体配置
找到nginx配置文件,进行反向代理配置
...
server {
listen 80;
server_name 192.168.200.300; <- 修改为网址地址
#charset koi8-r;
#access_log logs/host.access.log main;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080; <- 添加代理路径
}
location ~ /dev/ {
proxy_pass http://127.0.0.1:8080; <- 添加代理路径
}
}
...
location语法规则: location [=|~|~*|^~] /url/ { … }
=
开头表示精确匹配^~
开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头~
开头表示区分大小写的正则匹配 以xx结尾~*
开头表示不区分大小写的正则匹配 以xx结尾!~
和!~*
分别为区分大小写不匹配及不区分大小写不匹配 的正则/
通用匹配,任何请求都会匹配到。
负载均衡
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。
实例一
1. 实现效果
在浏览器中输入http://192.168.200.130/edu/a.html,负载均衡效果,平均到8080和8081端口中。
2. 准备工作
在两台tomcat里面webapps目录中,创建名称是edu文件夹,在edu文件夹中创建页面a.html,用于测试。
3. 在nginx配置文件中实现负载均衡。
...
upstream myserver { <- 添加服务器列表
server 192.168.200.130:8080;
server 192.168.200.130:8081;
}
server {
listen 80;
server_name 192.168.200.130; <- 设置服务名
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://myserver; <- 添加规则
index index.html index.htm;
}
...
分配服务器策略
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
weight
weight代表权重默认为1,权重越高被分配的客户端越多。
ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器。
fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
动静分离
动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏 览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源 设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一 个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304, 如果有修改,则直接从服务器重新下载,返回状态码 200
实例一
1. 在linux系统中准备静态资源,用于进行访问。
2. 在nginx配置文件中进行配置
server {
listen 80;
server_name 192.168.200.130;
#charset koi8-r;
#access_log logs/host.access.log main;
location /staticS/ {
root /opt/;
autoindex on; <- 该项是把文件中的资源列出来。
index index.html index.htm;
}
高可用
KeepAlived
Nginx运行原理
master和worker
master和worker工作原理
master一对多worker的优点
可以使用nginx -s reload热部署,利用nginx进行热部署操作。
每个woker是独立的进程,如果有其中的一个worker出现问题,其它worker独立的运行,继续进行争抢,实现请求过程,不会造成服务中断。
有多少个worker合适
worker数和服务器的cpu数相等是最为适宜的。
连接数worker_connection
问题一
发送请求,占用了worker的几个连接数?
2或者4个
问题二
nginx有一个master,有四个worker,每个worker支持最大的连接数1024,支持最大的并发数是多少?
普通静态访问最大并发数是:worker_connections * worker_processes / 2
而如果是HTTP作为反向代理来说,最大并发数应该是worker_connections * worker_processes / 4