一、基础
1、泛谈
(1)概念:高性能 Http和反向代理服务器
(2)特点
- 占用内存少
- 并发能力强:能达 50000并发
2、配置文件
(1)路径:/usr/local/nginx/conf/nginx.conf
(2)组成
- 全局:nginx 整体运行的配置指令如 worker_processes
- events:nginx 与用户的网络连接如 最大连接数worker_connections
- http:配置 文件引入、日志、超时时间、单连接请求上限等
3、常用命令(先要到 /usr/local/nginx/sbin 目录下)
- ./nginx -v:版本号
- ./nginx:启动
- ./nginx -s stop:停止
- ./nginx -s reload:重加载
二、反向代理
1、概念
- 正向代理:代理的是客户端,服务端不知道是哪个客户端请求的
- 反向代理:代理的是服务端,客户端不知道是哪个服务端提供的服务
2、配置:location里使用 proxy_pass代理,可看 第八点的配置实例
3、匹配原理
- 先精确匹配:location = /xxx
- 再一般 uri匹配:location /xxx
- 最后走正则匹配:location ~ /xxx
注:proxy_pass没有指定URI,请求的URI就像跟客户端发过来一样发送给server;如果proxy_pass指定的是uri,那么当一个请求发送到server,则用proxy_pass指定的uri替换请求匹配部分。
访问代理机的请求(也就是浏览器输入的地址):http://192.168.1.60/index
真正接口地址:http://192.168.1.6:8080/index
listen 80;
server_name localhost;
#可以访问
location / {
proxy_pass http://192.168.1.6:8080;
}
#可以访问
location /index {
proxy_pass http://192.168.1.6:8080;
}
#不可以访问,最后的/ 会将匹配的值也替换掉
location /index {
proxy_pass http://192.168.1.6:8080/;
}
#不可以访问
location / {
proxy_pass http://192.168.1.6:8080/index;
}
#可以访问
location /index {
proxy_pass http://192.168.1.6:8080/index;
}
//另外的情况
访问代理机的请求(也就是浏览器输入的地址):http://192.168.1.60/api/index
真正接口地址:http://192.168.1.6:8080/api/index
listen 80;
server_name localhost;
#可以访问
location / {
proxy_pass http://192.168.1.6:8080;
}
#不可以访问
location /index {
proxy_pass http://192.168.1.6:8080;
}
#不可以访问
location / {
proxy_pass http://192.168.1.6:8080/api;
}
#不可以访问
location /index {
proxy_pass http://192.168.1.6:8080/api;
}
#不可以访问
location / {
proxy_pass http://192.168.1.6:8080/api/index;
}
#不可以访问
location /index {
proxy_pass http://192.168.1.6:8080/api/index;
}
#可以访问
location / {
proxy_pass http://192.168.1.6:8080;
}
#可以访问
location /api {
proxy_pass http://192.168.1.6:8080;
}
#不可以访问
location / {
proxy_pass http://192.168.1.6:8080/api;
}
#可以访问
location /api {
proxy_pass http://192.168.1.6:8080/api;
}
三、负载均衡
1、简介:把请求分发到多台服务器上
2、配置:配置 upstream,可看 第八点的配置实例
3、策略
- 轮询(默认):按请求顺序轮询分发
- weight 权重:权重越高,分配越多
- ip 哈希:根据 访问者ip 哈希后分配,即同个客户端访问的都是同个服务器(可用于 session共享)
- fair 响应:根据响应时间,响应越快分配越多
四、静态资源 & 缓存
1、简介:动态页面和静态页面分开服务器解析,nginx 根据动态请求和静态请求分离,加快速度。
2、静态资源配置 & 缓存配置:可看 第八点的配置实例。
3、缓存原理:配置的天数内访问该 url,浏览器发送一个请求比对服务器此文件更新时间,若没变化则不会去服务器拉取文件并返回状态码 304,若有变化则从服务器下载并返回 200。
4、gzip压缩:server 中配置 gzip。
五、原理
1、机制:master & worker,利用 io多路复用由一个 master负责接收请求,多个worker进程争抢处理
2、优点
- 实现 nginx -s reload 的热部署
- worker相互不影响,程序异常也不影响其他请求
3、设置
- 设置 worker数:worker_processes(最好跟 cpu数相同)
- 每个 worker最大连接:worker_connection
- 最大并发数:worker_connections * worker_processes/2(静态资源),worker_connections * worker_processes/4(动态资源)
六、集群
结合 keepalived实现高可用
七、配置注释
注:详细配置请看手册:http://www.nginx.cn/nginx-how-t
#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
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 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6].";
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
#定义使用 www.nginx.cn访问
server_name www.nginx.cn;
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
#默认请求
location / {
#定义首页索引文件的名称
index index.php index.html index.htm;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
~/(v1|v2) #匹配多个
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
八、配置实例
修改原有的默认配置文件 /usr/local/nginx/conf下的 nginx.conf (也可 屏蔽原来的 server节点,增加 include /usr/local/nginx/conf/conf.d/*.conf; 来使用多个配置文件)
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid /usr/local/nginx/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;
include /usr/local/nginx/conf/conf.d/*.conf;
# 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;
# }
#}
}
1、配置访问自己的主页
- 在 /usr/local/nginx/conf下新建 conf.d 目录,用于统一放服务配置文件,里面新建一个my.conf,里面内容如下
#如果多个转发,增加一个server节点即可
server {
listen 80;
#如果有多个,server_name 后面的值用空格隔开
server_name localhost;
location / {
root /usr/local/nginx/html;
index my.html my.htm;
}
}
- 到 /usr/local/nginx/html 下新建 my.html 文件
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>success</h1>
</body>
</html>
- 到 /usr/local/nginx/sbin,./nginx -s reload ,访问浏览器查看结果
2、正向代理
- 修改一下我们的 my.conf 文件,同样需要到 /usr/local/nginx/sbin,./nginx -s reload
#代理转发到的ip
resolver 8.8.8.8;
server {
listen 80;
#这里不需要 server_name节点
location / {
proxy_pass http://$http_host$request_uri;
}
}
3、反向代理
- 修改一下我们的 my.conf 文件,同样需要到 /usr/local/nginx/sbin,./nginx -s reload
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.1.60:81;
}
}
- 代理地址是我起的另一个测试项目,原来访问是需要写 http://192.168.1.60:81/index ,现在通过代理直接输入 http://192.168.1.60/index ,查看效果如下
4、负载均衡
- 同样修改 my.conf 文件,同样需要到 /usr/local/nginx/sbin,./nginx -s reload
#weight是权重,默认是1,越高请求数越多
upstream mytest {
server 192.168.1.60:81 weight=2;
server 192.168.1.60:8080;
}
#请求到端口80的将其传递给上游。
#上游名称也就是上面upstream后面的名字和proxy_pass后面的http://后面的名字需要匹配。
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://mytest;
}
}
// 这种是 iphash策略
upstream mytest {
ip_hash ;
server 192.168.1.60:81 weight=2;
server 192.168.1.60:8080;
}
// 这种是 fair策略
upstream mytest {
server 192.168.1.60:81 weight=2;
server 192.168.1.60:8080;
fair;
}
5、静态资源
server {
listen 80;
server_name localhost;
# root的处理结果是:root路径+location路径
location / {
root /opt/mytest/;
index index.html;
}
# alias的处理结果是:使用alias路径替换location路径
location /case/xiong {
alias /opt/mytest/test;
index xiong.html;
}
}
5、缓存
server {
listen 80;
server_name localhost;
# 可开启 gzip 压缩
gzip on;
# 3d 表示 3天,s|m|h|d 表示秒|分|时|天
location / {
root /opt/mytest/;
expires 3d;
}
}
6、https 配置
# 需要先申请 https证书,然后放到服务器,配置中指定证书路径
server {
listen 80;
listen 443 ssl;
server_name lin.example.com;
ssl_certificate /usr/local/nginx/conf/4086866_lin.example.com.pem;
ssl_certificate_key /usr/local/nginx/conf/4086866_lin.example.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header remote_addr $remote_addr;
proxy_pass http://127.0.0.1:8082;
}
}
九、扩展
1、日志
- error.log:记录异常日志
- access.log:记录正常日志
2、rewrite
- url 重写
- if 判断
- return
3、window下配置静态文件
location /MP_verify_2HiL64Xrgdw2TMN7.txt {
root D:/Company/Server/Wj/survey-server/interfaces/src/main/resources/static;
}
十、安装
1、普通版本安装
- 先安装辅助工具
#安装 make
yum -y install gcc automake autoconf libtool make
#安装 g++
yum install gcc gcc-c++
#安装 pcre,为了重写rewrite
yum install -y pcre pcre-devel
#安装 zlib,为了gzip压缩
yum install -y zlib zlib-devel
#安装 openssl,安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议
yum install -y openssl openssl-devel
- 到 nginx: download 下载所需的nginx版本,上传到服务器 /usr/local/src ,然后解压,安装
#解压
tar -zxvf nginx-1.10.3.tar.gz
cd nginx-1.10.3
# 然后增加配置
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
#安装,还是到 nginx-1.10.3 目录下
make
make install
- 成功后看一下 /usr/local/nginx 目录
- 启动
#启动前先创建 /var/temp/nginx 目录,因为刚才安装时配置是用到这个目录,接着再启动
cd /usr/local/nginx/sbin
./nginx
#如果是关闭,则是
./nginx stop
#如果是重启,则是
./nginx -s reload
- 查看进程是否正常启动,然后访问浏览器,默认是80端口
2、docker版本安装
- 先 docker search nginx ,看看版本
- 拉取镜像 docker pull docker.io/nginx
- 完成后看一下本地镜像 docker images nginx
- 运行镜像 docker run --name nginx -p 18080:80 -d docker.io/nginx ,再到浏览器访问 ip/port ,看到以下界面即成功
- 接着先在主机 /etc/nginx 下创建 www、logs、conf 三个文件夹如下。复制docker内的nginx配置到主机,我的容器id是55de6205da3a,复制后启动另一个容器
#复制配置文件
docker cp 55de6205da3a:/etc/nginx/nginx.conf /etc/nginx/conf/
#启动另一个容器,-v 引号前面是主机地址,后面是容器地址,表示指定的主机地址挂载到容器的地址,也就是容器访问地址映射到主机
docker run -d -p 18082:80 --name nginx-test -v /etc/nginx/www:/usr/share/nginx/html -v /etc/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /etc/nginx/logs:/var/log/nginx docker.io/nginx
- 到主机 /etc/nginx/www 创建一个简单测试网页 index.html ,访问浏览器查看结果
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>hello world</h1>
</body>
</html>
- 如果是重启可以用下面的指令
docker exec -it id nginx -s reload