1 关于Nginx
Nginx是轻量级,高性能(响应快,高并发)的Web服务器、反向代理服务器及电子邮件代理服务器。最大支持5万个并发请求的响应。
1.1 为什么要用nginx
一个项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的时候,只需要在服务器的Tomcat中放一个jar包启动应用就够了。
当平台用户越来越多后,并发量增大,这时候一台服务器无法满足需求。需要添加多台服务器,但是这么多服务器,每次请求该访问哪个呢,我们需要一个中间服务器,将我们的请求帮忙发送到其他几台服务器上面,完成一个请求转发。
1.2 作用
1.2.1 反向代理
PS: 正向——>主动找代理; 反向——>被动找代理
正向代理
比如目前我们在电脑上玩吃鸡是无法访问国外的服务器的,这时候需要一个VPN代理来访问外网服务器,因为VPN可以帮你请求
反向代理是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外表现为一个反向代理服务器。
比如要访问baidu.com服务器,用户先访问百度的代理服务器,然后代理服务器再选择对应的服务器进行访问。
1.2.2 负载均衡
Nginx提供负载均衡策略有两种:内置策略和扩展策略,内置策略为轮询,加权轮询,lp hash。扩展策略就是天马行空,可以实现任何可能。
轮询:一次循环发送请求
加权轮询:保证服务器性能最大化
iphash对客户需求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一个服务器进行处理,可以解决session不共享的问题。
1.2.3 动静分离
在我们的软件开发中,有些请求是需要后台处理的(如css,html,jpg,js等文件),有些请求是不需要经过后台处理的,这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变得资源区分开来,动静资源做好了拆分以后,就可以根据静态资源的特点将其做缓存操作,提高资源响应的速度。
1.3 安装
1.3.1 Windows下载
在cmd中运行nginx.exe,启动nginx
1.3.2 Linux 安装
2 常用Nginx命令
命令 | 作用 |
---|---|
nginx -s stop | 快速关闭Nginx,不保存相关信息,并终止web服务 |
nginx -s quit | 平稳关闭Nginx,保存相关信息,有安排的关闭web服务 |
nginx -s reload | 因改变了Nginx相关配置,需要重新加载配置而重载 |
nginx -c filename | 为Nginx指定一个配置文件,代替缺省 |
nginx -t | 不运行,仅测试配置文件,nginx将检查配置文件的语法正确性,尝试打开配置文件中所引用到的文件 |
nginx -v | 显示nginx版本 |
3 Nginx配置实战
3.1 反向代理配置
- HTTPS 的固定端口号是 443,不同于 HTTP 的 80 端口
- SSL 标准需要引入安全证书,所以在 nginx.conf 中你需要指定证书和它对应的 key
#HTTP服务器
server {
#监听443端口。443为知名端口号,主要用于HTTPS协议
listen 443 ssl;
#定义使用www.xx.com访问
server_name www.helloworld.com;
#ssl证书文件位置(常见证书文件格式为:crt/pem)
ssl_certificate cert.pem;
#ssl证书key位置
ssl_certificate_key cert.key;
#ssl配置参数(选择性配置)
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#数字签名,此处使用MD5
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /root;
index index.html index.htm;
}
}
3.2 负载均衡配置
轮询
upstream bck_testing_01 {
# 默认所有服务器权重为 1
server 192.168.250.220:8080
server 192.168.250.221:8080
server 192.168.250.222:8080
}
加权轮询
upstream bck_testing_01 {
server 192.168.250.220:8080 weight=3
server 192.168.250.221:8080 # default weight=1
server 192.168.250.222:8080 # default weight=1
}
最少连接
upstream bck_testing_01 {
least_conn;
# with default weight for all (weight=1)
server 192.168.250.220:8080
server 192.168.250.221:8080
server 192.168.250.222:8080
}
加权最少连接
upstream bck_testing_01 {
least_conn;
server 192.168.250.220:8080 weight=3
server 192.168.250.221:8080 # default weight=1
server 192.168.250.222:8080 # default weight=1
}
IP Hash
upstream bck_testing_01 {
ip_hash;
# with default weight for all (weight=1)
server 192.168.250.220:8080
server 192.168.250.221:8080
server 192.168.250.222:8080
}
普通Hash
upstream bck_testing_01 {
hash $request_uri;
# with default weight for all (weight=1)
server 192.168.250.220:8080
server 192.168.250.221:8080
server 192.168.250.222:8080
}
我们可以启动两个服务程序实例,127.0.0.1:8080,127.0.0.1:8081。
用户去访问通常只会有一个端口,所以会访问一个nginx服务器,实现反向代理和负载均衡。
3.3 配置两个webapp的负载均衡和反向代理
实现一个http的反向代理,配置nginx.conf文件如下:
nginx配置文件整体结构
events {
worker_connections 1024;
}
http {
// 负载均衡配置,#设定实际的服务器列表资源
upstream xx{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;//改变weight值改变权重
}
//http 配置
server {
listen 80;
server_name localhost;
// 代理
localtion / { // 区分访问的路径,比如有的访问http://ip1,有的访问本地文件
proxy_pass http://load_balance_server ;//请求转向load_balance_server 定义的服务器列表
}
}
server {
lisen 443;
server_name localhost;
// 代理
---
}
}
3.4 网站中有多中webapp的配置
当一个网站功能越来越丰富,会将一些功能相对独立的模块剥离出来,独立维护,这样就会有多个webapp。
比如网站 www.helloworld.com 有金融,产品,用户中心等webapp,访问这些应用的方式通过上下文来进行区分:
www.helloworld.com/finance/
www.helloworld.com/product/
www.helloworld.com/admin/
http 的默认端口号是 80,如果在一台服务器上同时启动这 3 个 webapp 应用,都用 80 端口,肯定是不成的。
所以,这三个应用需要分别绑定不同的端口号。
用户在实际访问 www.helloworld.com 站点时,访问不同 webapp,总不会还带着对应的端口号去访问。
所以,再次需要用到反向代理来做处理。
配置如下:
http {
#此处省略一些基本配置
upstream product_server{
server www.helloworld.com:8081;
}
upstream admin_server{
server www.helloworld.com:8082;
}
upstream finance_server{
server www.helloworld.com:8083;
}
server {
#此处省略一些基本配置
#默认指向product的server
location / {
proxy_pass http://product_server;
}
location /product/{
proxy_pass http://product_server;
}
location /admin/ {
proxy_pass http://admin_server;
}
location /finance/ {
proxy_pass http://finance_server;
}
}
}