Nginx
Nginx是一款免费开源的高性能HTTP服务器及反向代理服务器(Reverse Proxy)产品,同时,它还可以提供IMAP/POP3代理服务等功能。在实际的使用中,Nginx还可以提供更多更丰富的功能。代理服务和反向代理服务是Nginx服务器作为Web服务器的主要功能之一,尤其是反向代理服务,是应用十分广泛的功能。
Nginx官网
Nginx下载页面
nginx: downloadhttp://nginx.org/en/download.html
Nginx的主要功能
反向代理
在提供反向代理服务方面,Nginx服务器转发前端请求性能稳定,并且后端转发与业务配置相互分离,配置相当灵活。 在进行Nginx服务器配置时,配置后端转发请求完全不用关心网络环境如何,可以指定任意的IP地址和端口号,或其他类型的链接、请求等。
Nginx服务器的反向代理服务功能并不只有这些,它提供的配套功能相当丰富。首先,它支持判断表达式。通过使用正则表达式进行相关配置,可以实现根据不同的表达式,采取不同的转发策略。 其次,它对后端返回情况进行了异常判断,如果返回结果不正常,则重新请求另一台主机(即将前端请求转向另一后端IP),并自动剔除返回异常的主机。它还支持错误页面跳转功能。
负载均衡
负载均衡,一般包含两方面的含义。一方面是,将单一的重负载分担到多个网络节点上做并行处理,每个节点处理结束后将结果汇总返回给用户,这样可以大幅提高网络系统的处理能力;第二个方面的含义是,将大量的前端并发访问或数据流量分担到多个后端网络节点上分别处理,这样可以有效减少前端用户等待响应的时间。
Nginx服务器的负载均衡主要是对大量前端访问和流量进行分流,以保证前端用户访问效率。可以说,在绝大多数的Nginx应用中,都会或多或少涉及它的负载均衡服务。 Nginx服务器的负载均衡策略可以划分为两大类:即内置策略和扩展策略。 内置策略主要包含轮询、加权轮询和IP hash三种; 扩展策略主要通过第三方模块实现,种类比较丰富,常见的有url hash、fair等。 在默认情况下,内置策略会被编译进Nginx内核,使用时只需要在Nginx服务器配置中设置相关参数即可。 扩展策略不会编译进Nginx内核,需要手动将第三方模块编译到Nginx内核。
动静分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
Windows下Nginx的安装
1.下载Nginx
去Nginx的官方下载页面,下载稳定的版本,我下载的是目前最新的,下载完后是一个压缩包
2.对压缩包解压
对压缩包进行解压然后放到没有中文的目录下,解压后即可直接使用。
这里我直接放到了D盘,进入文件夹可看到目录
conf: 配置文件夹,存放配置文件
contrib:存放一些实用工具
docs:文档文件夹,存放相关文档
html:页面文件夹,存放一些默认页面,如index, 404, 500等
logs:日志文件夹,存放一些错误日志或运行日志等其他
temp:临时文件夹,存放临时文件
3.配置配置文件
进入conf文件夹打开ngin.conf配置文件
nginx启动默认为本机的80端口,可以修改端口,因为我80端口被占用呢,因此我修改nginx默认端口为8086。
nginx.conf配置文件的解析:
1. 这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
worker_processes 1;
2.events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等,上述例子就表示每个 work process 支持的最大连接数为 1024,这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
events {
worker_connections 1024;
}
3.这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http全局块、server 块。
①、http 全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
②、server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。后面会详细介绍虚拟主机的概念。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
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;
# }
#}
}
Linux下Nginx安装
1.下载Nginx
去Nginx的官方下载页面,下载稳定的版本,我下载的是目前最新的,下载完后是一个压缩包。
2.对压缩包解压
在这里我先创建个文件夹
从Windows上传下载好的压缩包到Linux,这里可以用XShell和Xftp,
已成功拷贝
对压缩包进行解压,在解压前可以先用命令验证下nginx是否已安装,出现nginx:就代表没安装。
whereis nginx
解压命令
tar -zxvf nginx-1.20.2.tar.gz
解压成功
3.进入文件夹,查看目录
可发现其中configure是可执行文件
4.执行configure
./configure是源代码安装的第一步,主要的作用是对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系,但并不是所有的tar包都是源代码的包,可以ls看看有没有configure这个文件,也许你下的是二进制的包,如果是二进制的包,解压后直接就能使用。
./configure
5.执行makr命令
make是用来编译的,它从Makefile中读取指令,然后编译。
make
6.执行make install命令
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置,如果权限不够记得命令前加sudo。
make install
7.验证是否安装成功
whereis nginx
8.进入文件夹
主要是四个文件夹
conf: 配置文件夹,存放配置文件
html:页面文件夹,存放一些默认页面,如index, 404, 500等
logs:日志文件夹,存放一些错误日志或运行日志等其他
sbin:nginx服务的启动管理的终端命令
9.可以根据需要配置nginx.conf
这里跟Windows配置差不多,就不再讲述
#user nobody;
worker_processes 1;
#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;
}
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;
# }
#}
}
10.启动Nginx
进入sbin目录内,执行命令,执行后没有输出。
./nginx
11.验证启动
可以用ps命令查看nginx进程验证,也可以直接浏览器访问地址,出现Nginx的信息即启动成功
ps aux|grep nginx
集群配置及启动
这里以Windows中举例
比如我有个项目,已达成jar包
我可以启动两个服务
该服务端口为8081
另外一个启动时改下端口号为8087
对nginx.conf配置文件进行集群配置
ngx_http_upstream_module模块允许Nginx定义一组或多组节点服务器,使用时可以通过proxy_pass代理方式,把用户请求发送到事先定于好的upstream组中。具体写法就是
upstream www_pools {
server x.x.x.x;
server x.x.x.x;
}
proxy_pass http://www_pools;
upstream 中server后可以加weight权重,这里我是一样的也就是轮询,也就是一下访问端口为8081的服务,一下访问端口为8087的服务。
改好配置后,在cmd中nginx解压路径下输入nginx.exe即可启动nginx,如果配置没生效,可以执行如下命令,在不关闭的情况下重新加载配置文件
nginx -s reload
其他Nginx命令介绍
以下是Linux中命令,Windows下则以nginx开头
./nginx -s stop #停止
./nginx -s quit #安全退出