一、安装
官网
https://nginx.org/en/download.html
命令
# 下载
wget https://nginx.org/download/nginx-1.14.2.tar.gz
# 解压
tar -zxvf nginx-1.14.2.tar.gz
# 检测当前系统环境,以确保能成功安装nginx
./configure
# 安装
make&make install
可能会报错,可以安装根据提示安装以下依赖
# 编译c
yum install gcc-c++
# nginx 的 http 模块使用 pcre 来解析正则表达式
yum install pcre
yum install pcre-devel
# nginx 使用 zlib 对 http 包的内容进行 gzip
yum install zlib
yum install zlib-devel
# nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install openssl
yum install openssl-devel
二、nginx.conf
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
# 指定nginx进程使用什么用户启动
user www www;
# 指定启动多少进程来处理请求,一般情况下设置成CPU的核数。
worker_processes 4;
# 在高并发情况下,通过设置将CPU和具体的进程绑定来降低由于多核CPU切换造成的寄存器等现场重建带来的性能损耗。
worker_cpu_affinity 0001 0010 0100 1000;
# 定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
error_log /data/logs/nginx_error.log crit;
# 指定进程pid文件的位置。
pid /usr/local/webserver/nginx/nginx.pid;
# 用于指定一个nginx进程可以打开的最多文件描述符数目,这里是65535,需要使用命令“ulimit -n 65535”来设置。
worker_rlimit_nofile 65535;
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
events{
# use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。
# 其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。
# 对于Linux系统,epoll工作模式是首选。在操作系统不支持这些高效模型时才使用select。
use epoll;
# 每一个worker进程能并发处理的最大连接数
worker_connections 1024;
}
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
http{
# include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。
include mime.types;
# default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式。
default_type application/octet-stream;
# 等待client发送一个请求头的超时时间,超时后,nginx返回HTTP状态码408(“Request timed out”)
client_header_timeout 120s;
# 设置请求体的读超时时间
client_body_timeout 120s;
# 允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值。
client_max_body_size 100m;
# 开启高效文件传输模式。
# 对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
sendfile on;
# 长连接超时时间,单位是秒。
keepalive_timeout 65 :
# 开启gzip压缩
gzip on;
# 最小压缩文件大小
gzip_min_length 1k;
# 压缩缓冲区
gzip_buffers 4 16k;
# 用于设置识别HTTP协议版本
gzip_http_version 1.1;
# 压缩等级
gzip_comp_level 6;
# 压缩类型
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
# vary header支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面。
gzip_vary on;
# Nginx本身不支持PHP等语言,但是它可以通过FastCGI来将请求扔给某些语言或框架处理
# FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_cache TEST;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
# 限流配置
# $binary_remote_addr(NGINX变量),该变量代表了某个客户端IP地址的二进制形式。
# zone=关键字标识的区域名称,冒号后面的表示内存区域的大小
# rate表示允许相同标识的客户端的访问频次
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
...
location /login/ {
# burst 设置缓冲区大小,当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内
# nodelay 允许请求在排队的时候就立即被处理
limit_req zone=mylimit burst=20 nodelay;
...
}
}
# 缓存配置
# proxy_cache_path 设置缓存的路径和配置
# levels 目录的层次结构
# keys_zone 设置一个共享内存区
# max_size 缓存的上限
# inactive指定了项目在不被访问的情况下能够在内存中保持的时间
# use_temp_path 将写入缓存的文件先放入一个临时存储区域
proxy_cache_path /data/app/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
...
location /article/ {
# 匹配缓存
proxy_cache my_cache;
...
}
}
}
4、upstream块:配置负载均衡
# 有五种配置方式
# 1、轮询
upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
}
# 2、weight
upstream backend {
server 192.168.1.1:8080 weight=1;
server 192.168.1.2:8080 weight=2;
}
# 3、ip_hash 按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配
upstream backend {
ip_hash;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
}
# 4、fair 响应时间短即rt小的后端服务器优先分配请求
upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
fair;
}
# 5、url_hash 按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器
upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
hash $request_uri;
hash_method crc32;
}
# upstream中server指令语法如下:
server address [parameters]
# parameters是可选参数,可以是如下参数:
# 1、down:表示当前server已停用
# 2、backup:表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求。
# 3、weight:表示当前server负载权重,权重越大被请求几率越大。默认是1.
# 4、max_fails和fail_timeout一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,
# 那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,
# 即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查。
5、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
# 监听端口
listen 80;
# 服务器名,可以通过正则匹配
server_name blog.lazyrabbit.xyz;
# 定义服务器的默认网站根目录位置
root /data/htdocs/www;
# 定义路径下默认访问的文件名
index index.html index.htm index.php;
6、location块:配置请求的路由,以及各种页面的处理情况。
# location匹配规则
# = 精确匹配,如果找到匹配=号的内容,立即停止搜索,并立即处理请求(优先级最高)
# ~ 区分大小写
# ~* 不区分大小写
# ^~ 只匹配字符串,不匹配正则表达式
location / {
# 代理转发
proxy_pass http://backend;
# 是将代理服务器收到的用户的信息传到真实服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允许访问的ip
allow 219.237.222.30;
#禁止其他ip访问
deny all;
}
# 实现动静分离
location /img/ {
proxy_pass http://backend;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
#客户端缓存30天
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 1h;
}
三、一个完整的配置,包括反向代理,动静分离,负载均衡,缓存,限流。
worker_processes 1;
error_log logs/error.log;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_header_timeout 120s;
client_body_timeout 120s;
# 限制上传文件大小
client_max_body_size 100m;
# 开启gzip压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
# 负载均衡
upstream blog{
server 123.123.123.123:8080;
server 123.123.123.123:8081;
}
# 限流配置
# $binary_remote_addr(NGINX变量),该变量代表了某个客户端IP地址的二进制形式。
# zone=关键字标识的区域名称,冒号后面的表示内存区域的大小
# rate表示允许相同标识的客户端的访问频次
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
# 静态html服务器
server {
listen 80;
server_name www.lazyrabbit.xyz lazyrabbit.xyz;
root html/home;
index index.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 反向代理服务器
server {
listen 80;
# 配置二级域名
server_name blog.lazyrabbit.xyz;
location / {
proxy_pass http://blog;
# 将代理服务器收到的用户的信息传到真实服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# login限流
location /login/ {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://blog;
# 是将代理服务器收到的用户的信息传到真实服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 动静分离
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)${
root /data/app/nginx/;
# 浏览器缓存
expires 7d;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
四、nginx全局变量
$args:这个变量等于请求行中的参数,同$query_string。
$is_args: 如果已经设置$args,则该变量的值为"?",否则为""。
$content_length: 请求头中的Content-length字段。
$content_type: 请求头中的Content-Type字段。
$document_uri: 与$uri相同。
$document_root: 当前请求在root指令中指定的值。
$host: 请求主机头字段,否则为服务器名称。
$http_user_agent: 客户端agent信息。
$http_cookie: 客户端cookie信息。
$limit_rate: 这个变量可以限制连接速率。
$request_method: 客户端请求的动作,通常为GET或POST。
$remote_addr: 客户端的IP地址。
$remote_port: 客户端的端口。
$remote_user: 已经经过Auth Basic Module验证的用户名。
$request_body_file`: 客户端请求主体的临时文件名。
$request_uri: 请求的URI,带参数
$request_filename: 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme: 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;。
$server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr: 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name: 服务器名称。
$server_port: 请求到达服务器的端口号。
$request_uri: 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz。
$uri: 不带请求参数的当前URI,$uri不包含主机名,如/foo/bar.html可能和最初的值有不同,比如经过重定向之类的。
五、参考
https://www.cnblogs.com/devinzhang/p/7735397.html
https://www.cnblogs.com/biglittleant/tag/nginx/
https://blog.csdn.net/weixin_38111957/article/details/81210699