简介
Nginx(发音同「engine X」)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。
安装
yum install -y yum-utils
yum install -y nginx
安装完成默认配置文件目录:/etc/nginx/nginx.conf
启动
systemctl start nginx
开机自启
systemctl enable nginx
配置文件
nginx 由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,由空格分隔并以分号 (;) 结尾。块指令与简单指令具有相同的结构,但它不是以分号结尾,而是以一组用大括号({ 和 })包围的附加指令结束。如果块指令可以在大括号内包含其他指令,则称为上下文(例如:events、http、server和location)。
nginx.conf 包括全局块、events块、http块。其中http块可以有多个server,server里面还可有多个location。
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
web服务器
- 创建文件夹/data/www并新建index.html,创建文件夹/data/images并上传bg.jpg
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>nginx</title>
</head>
<body>
<p>这是nginx 静态服务 </p>
</body>
</html>
- 修改nginx.conf配置文件,server监听8888端口,增加两个location。
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 8888;
listen [::]:8888;
server_name _;
# 匹配请求路径
location / {
root /data/www;
}
# url中带images的会被请求到/data/images/目录下
location /images/ {
root /data;
}
}
}
-
请求http:// ip:8888/ 返回index.html内容
-
请求http:// ip:8888/images/bg.jpg 返回图片
反向代理
- 随便建一个springboot,编写一个测试api,项目打成jar包上传到服务器。
@RestController
public class Test {
@Value("${server.port}")
private String port;
@GetMapping("hello")
public String hello() {
return "hello world:" + port;
}
}
- 执行java -jar 命令分别启动项目指定8001和8002端口
java -jar demo.jar --server.port=8001
java -jar demo.jar --server.port=8002
- 配置nginx.conf
server {
listen 8889;
listen [::]:8889;
server_name _;
# url中带s1转发到8001服务
location ^~/s1/ {
proxy_pass http://127.0.0.1:8001/;
}
# url中带s1转发到8002服务
location ^~/s2/ {
proxy_pass http://127.0.0.1:8002/;
}
}
访问结果:
http://ip:8889/s1/hello
输出:hello world:8001
----------------------------
http://ip:8889/s2/hello
输出:hello world:8002
负载均衡
# upstream + 别名 定义多个需要代理的服务器
upstream toServer {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
# location 定义所有请求proxy_pass代理到toServer指定的服务器
server {
listen 8889;
listen [::]:8889;
server_name _;
location / {
proxy_pass http://toServer;
}
}
浏览器请求 http://ip:8889/hello, 默认轮询模式访问服务器。
# 轮询方式请求8001服务和8002服务
hello world:8001
hello world:8002
配置服务器权重的方式:
- 默认轮询方式。
upstream toServer {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
- 指定weight权重值,值越大权重越大。
upstream toServer {
server 127.0.0.1:8001 weight=10;
server 127.0.0.1:8002 weight=1;
}
- ip_hash方式,每次请求按照访问ip的hash结果分配。
upstream toServer {
ip_hash;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
- 根据服务器的响应时间分配,响应时长越短优先分配请求。
upstream toServer {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
fair;
}
- 按访问url的hash结果来分配请求,使每个url定向到同⼀个后端服务器,对后端缓存有利。
upstream toServer {
hash &request_uri;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}