NGINX简介

Nginx是一款高性能,轻量级的Web 服务器/反向代理服务器电子邮件(IMAP/POP3)代理服务器

NGINX特点

  • 高并发
  • 低消耗
  • 热部署
  • 高扩展
  • 高可用

nginx是由C语言编写的在BSD-like 协议下发行,结合多线程和异步机制对外提供服务,异步使用的是异步非阻塞方式。nginx的master进程会生成多个worker进程,master进程负责管理这些worker进程的生命周期、接受外部命令、解析perl脚本等;而worker进程则用于接收和处理客户请求。

NGINX核心功能

  • 请求定位
  • 静态代理
  • 负载均衡
  • 动静分离
  • 虚拟主机

具体实现见后续章节:NGINX配置*

NGINX使用

安装

  1. 下载 nginx官网下载源码包,通过ftp工具上传到服务器 或者在命令行执行:
wget http://nginx.org/download/nginx-1.16.0.tar.gz
  1. 构建Makefile 解压源码包,执行./configure按需求配置安装:
#例如:
#配置安装路径,命令路径,配置路径,需要的插件,不需要的插件等
./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=/usr/local/src/pcre-8.38 \
--with-zlib=/usr/local/src/zlib-1.2.11 \
--with-openssl=/usr/local/src/openssl-1.0.1t
  1. 编译安装
make
make install

启动

  1. 配置path
#通过软连接方式将nginx加入到个人path中
ln -n /usr/local/nginx/sbin/nginx /usr/local/sbin
#注意此处nginx路径为上面自己配置的安装路径
  1. 查看命令
nginx -h
#执行可查看nginx命令帮助信息

3. 启动服务

#执行命令
nginx
#访问服务器ip地址,若得到如下图所示,则证明nginx运行成功

NGINX配置

以下内容需对nginx配置结构进行全局认知,请参考此篇文章

请求定位

#常用于web资源请求
server        #server块
    { 
        listen    80;
        server_name    localhost;       #server全局块
       
		location / {   #location块
					root  html; #相对路径
					index index.html index.htm; #默认访问
			}
	    location /anix/blog {
					root  /data/blog/article; #绝对路径
					index read.md; #默认访问
			}
	    #...
    }
#配置server块中location [PATTERN]实现请求定位	
#1.访问ip/时定位到相对于nginx安装目录的html目录index配置的文件,若请求路径指明文件且当前目录有此文件,则返回该文件。
#2.访问ip/anix/blog时定位到/data/blog/article目录下read.md,若请求ip/anix/blog/nginx.md,则返回/data/blog/article/nginx.md

静态代理

#nginx对静态资源的处理性能很好,通常项目中的静态资源都会由nginx来处理
#由正则表达式做拦截过滤,有时间再更新...
server {
    root /www/data;

    location / {
    }

    location /images/ {
    }

    location ~ \.(mp3|mp4) {
        root /www/media;
    }
	
	location /images/ {
        try_files $uri /images/default.gif;
    }
		
	location /mp3 {
			sendfile           on;
			sendfile_max_chunk 1m;
			#...
	}

}

负载均衡

#负载均衡(Load Balance)就是任务(请求)分摊到多个操作单元上进行执行
#对于Web工程,将相同的web应用部署到多个服务器上,在请求到来时,由负载均衡服务器将请求按照事先约定的规则分发到不同的服务上,从而增加系统的整体吞吐量。
#upstream模块
upstream nodes {
   
	server 192.168.10.1:8668 weigth=1;
	server 192.168.10.2:8668 weigth=1;
	server 192.168.10.3:8668 weigth=2; #weigth权重
	#... 
	#调度算法
	#hash $request_uri;
    #hash_method crc32;
	#ip_hash;
	#fair;
}
#upstream中常用的配置项:
#down:表示当前的server不參与负载均衡。
#weight:默觉得1,weight越大,负载的权重就越大。
#max_fails :请求失败的次数默觉得1。
#fail_timeout : max_fails次失败后,暂停请求此台服务器的时间。
#backup: 其他全部的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

#proxy_pass
server {
        listen       8081;
        location / {
             #其中nodes对应着upstream设置的名称
             proxy_pass nodes;
			 #其他配置
             #如设置主机头和客户端真实地址,以便服务器获取客户端真实IP
             #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_connect_timeout    600;
             #proxy_read_timeout       600;
             #proxy_send_timeout       600;
        }
    }
}

动静分离

#所有静态请求都由nginx处理
#拦截静态请求进行转发处理

        location ~.*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
            proxy_pass static;
        }

虚拟主机

server {
  listen 80;
  listen 443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/www.anix.xyz/1_www.anix.xyz_bundle.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/www.anix.xyz/2_www.anix.xyz.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name anix.xyz www.anix.xyz;
  access_log /data/wwwlogs/anix.xyz_nginx.log combined;
  index index.html index.htm index.jsp;
  root /data/wwwroot/anix.xyz;
 
  if ($host != anix.xyz) {  return 301 $scheme://anix.xyz$request_uri;  } 
 
  #error_page 404 /404.html;
  #error_page 502 /502.html;
  
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
    expires 30d;
    access_log off;
  }
  location ~ .*\.(js|css)?$ {
    expires 7d;
    access_log off;
  }
  location ~ /\.ht {
    deny all;
  }
  location ~ {
    proxy_pass http://127.0.0.1:8080;
    include proxy.conf;
  }
}

NGINX性能调优

。。。

NGINX配置示例

user www www;
worker_processes auto;

error_log /data/wwwlogs/error_nginx.log crit;
pid /var/run/nginx.pid;
worker_rlimit_nofile 51200;

events {
  use epoll;
  worker_connections 51200;
  multi_accept on;
}

http {
  include mime.types;
  default_type application/octet-stream;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 1024m;
  client_body_buffer_size 10m;
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 120;
  server_tokens off;
  tcp_nodelay on;

  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_intercept_errors on;

  #Gzip Compression
  gzip on;
  gzip_buffers 16 8k;
  gzip_comp_level 6;
  gzip_http_version 1.1;
  gzip_min_length 256;
  gzip_proxied any;
  gzip_vary on;
  gzip_types
    text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component
    font/opentype application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";

  ##Brotli Compression
  #brotli on;
  #brotli_comp_level 6;
  #brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

  ##If you have a lot of static files to serve through Nginx then caching of the files' metadata (not the actual files' contents) can save some latency.
  #open_file_cache max=1000 inactive=20s;
  #open_file_cache_valid 30s;
  #open_file_cache_min_uses 2;
  #open_file_cache_errors on;

######################## default ############################
  server {
    listen 80;
    server_name _;
    access_log /data/wwwlogs/access_nginx.log combined;
    root /data/wwwroot/default;
    index index.html index.htm index.jsp;
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    location /nginx_status {
      stub_status on;
      access_log off;
      allow 127.0.0.1;
      deny all;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
      expires 30d;
      access_log off;
    }
    location ~ .*\.(js|css)?$ {
      expires 7d;
      access_log off;
    }
    location ~ {
      proxy_pass http://127.0.0.1:8080;
      include proxy.conf;
    }
    location ~ ^/(\.user.ini|\.ht|\.git|\.svn|\.project|LICENSE|README.md) {
      deny all;
    }
  }
########################## vhost #############################
  include vhost/*.conf;
}

最后修改于 2019-05-17 22:47:22
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇