目录
一、Nginx功能介绍
1、http正向代理与反向代理
2、负载均衡
3、web缓存
4、动静分离
5、url_hash(第三方)
6、fair(第三方)
二、nginx安装
三、平滑升级nginx
四、nginx基础配置
1、主配置文件
2、用户认证
3、虚拟主机
五、nginx.conf配置文件说明
1、nginx配置结构
2、nginx.conf配置详细说明
一、Nginx功能介绍
1、http正向代理与反向代理
正向代理:
在服务器端想要获取客户端信息时保护客户端,暴露的是代理服务器的地址,隐藏了真实的客户端的地址。
反向代理:
在客户端想要获取服务器端信息时保护服务端,暴露的是代理服务器的地址,隐藏了真实的服务端地址。
2、负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,ip_hash。
默认平均轮询RA:
#默认平均轮询RA
#每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
简单配置
upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 81;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}
加权轮询:
#加权轮询
upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
IP_Hash图如下:
对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
#IP_HASH示例配置
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
3、web缓存
Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。
4、动静分离
Nginx提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高。Nginx可以根据配置对不同的请求做不同转发,这是动态分离的基础。静态请求对应的静态资源可以直接放在Nginx上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理。
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
#url_hash示例配置
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
6、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#fair示例配置
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
二、nginx安装
nginx下载地址:nginx: download
yum install gcc pcre-devel openssl-devel -y #安装基础编译环境
useradd nginx #创建nginx用户
tar -xvf nginx-1.16.1.tar.gz #解压
cd nginx-1.16.1
#--prefix为指定安装目录,--user为指定账户名称,--group为指定组名称,--with-http_ssl_module为支持加密功能
#--with-stream为TCP/UDP代理功能的模块,使用Nginx四层代理的时候会用到,--with-http_stub_status_module为开启status状态功能,可以查看nginx连接数等信息
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-stream --with-http_stub_status_module
make && make install #编译安装
安装完成会在/usr/local下生成nginx文件,其中:
/usr/local/nginx #安装目录
conf/nginx.conf #主配置文件
html #网页目录
logs #日志文件
sbin/nginx #服务启动可执行文件
启动nginx服务:
/usr/local/nginx/sbin/nginx
常用选项:
-V :查看编译参数
-c :指定配置文件,启动服务
-t :测试配置文件语法是否有错误
web访问测试,默认80端口,直接浏览器访问ip即可:
关闭nginx:
/usr/local/nginx/sbin/nginx -s stop
重新加载配置:
/usr/local/nginx/sbin/nginx -s reload
三、平滑升级nginx
tar -xvf nginx-1.18.0.tar.gz #下载并解压更高版本nginx
cd nginx-1.18.0
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
make #不要make install
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/
make upgrade #杀死老版本nginx进程,启动新版本nginx,如果报错也可以手动启动nginx
验证升级后版本:
/usr/local/nginx/sbin/nginx -V
四、nginx基础配置
1、主配置文件
主配置文件路径:/usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 1; #启动几个进程,默认是1个进程
#error_log logs/error.log; #日志存放位置
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024; #nginx并发量,默认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;
server {
listen 80; #监听端口
server_name localhost; #域名
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html; #网站根路径,默认html,是相对路径,即/usr/local/nginx/html
index index.html index.htm; #网站默认首页
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 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;
# }
#}
}
2、用户认证
设置需要输入用户名密码,才能访问网站,修改主配置文件:
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
auth_basic "auth-domain"; #密码框提示信息,会显示auth-domain
auth_basic_user_file /usr/local/nginx/pass; #定义用户名和密码存放文件
......
}
yum -y install httpd-tools
htpasswd -c /usr/local/nginx/pass admin #创建认证用户admin,用户名可自定义,回车输入密码,-c为create的意思
htpasswd /usr/local/nginx/pass admin2 #也可追加认证用户admin2,注意追加没有-c,如果有-c会覆盖之前的用户
密码为加密存储 :
/usr/local/nginx/sbin/nginx -s reload #reload重新加载配置文件
web访问:
3、虚拟主机
虚拟主机可以实现一个nginx提供多个网站的访问
(1)基于域名的虚拟主机
server {
listen 80;
server_name web1.tedu.cn; #域名1
... ...
}
server {
listen 80;
server_name web2.tedu.cn; #域名2
... ...
}
(2)基于端口的虚拟主机
server {
listen 8080; #端口
server_name web1.tedu.cn; #域名
... ...
}
server {
listen 8000; #端口
server_name web1.tedu.cn; #域名
... ...
}
(3)基于IP的虚拟主机(服务器有多个网卡和IP时)
server {
listen 192.168.1.212:80; #端口
server_name web1.tedu.cn; #域名
... ...
}
server {
listen 192.168.1.213:80; #端口
server_name web1.tedu.cn; #域名
... ...
}
以基于域名的虚拟主机为例演示:
修改和添加2个server配置:
server {
listen 80;
server_name web1.tedu.cn;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
... ...
}
server {
listen 80;
server_name web2.tedu.cn;
location / {
root web; #修改根目录为web,以便展示效果,不然还是访问的html相同内容
index index.html index.htm;
}
}
如上图需在/usr/local/nginx下手动创建一个web目录,并拷贝一个index.html首页过去,自定义修改下内容。
/usr/local/nginx/sbin/nginx -s reload #重新加载配置
客户端测试:如果windows浏览器远程访问,由于没配dns,可以手动加一下hosts文件进行域名解析:
文件路径 C:\Windows\System32\drivers\etc\hosts
web访问测试:
五、nginx.conf配置文件说明
1、nginx配置结构
... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块 }
【释义】:
- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- location块:配置请求的路由,以及各种页面的处理情况。
2、nginx.conf配置详细说明
########### 每个指令必须有分号结束。#################
#
#user nobody; #设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,示例:#user administrator administrators; #配置用户或者组,默认为nobody nobody
worker_processes 1; #worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行
#error日志设置,语法:error_log /path/file level; 当path/file 的值为 /dev/null时,这样就不会输出任何日志了,这也是关闭error日志的唯一手段
#leve的取值范围是debug、info、notice、warn、error、crit、alert、emerg从左至右级别依次增大
#如果设定的日志级别是debug,则会输出所有的日志,这一数据量会很大,需要预先确保/path/file所在的磁盘有足够的磁盘空间。级别设定到debug,必须在configure时加入 --with-debug配置项
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #设置nginx进程 pid,pid文件(master进程ID的pid文件存放路径)的路径
events { #events,设置工作模式,默认使用epoll
#仅对指定的客户端输出debug级别的日志: 语法:debug_connection[IP|CIDR]
#这个设置项实际上属于事件类配置,因此必须放在events{……}中才会生效。它的值可以是IP地址或者是CIRD地址。
#debug_connection 10.224.66.14; #或是debug_connection 10.224.57.0/24
#这样,仅仅以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别。
#注意:在使用debug_connection前,需确保在执行configure时已经加入了--with-debug参数,否则不会生效。
worker_connections 1024; #每个worker允许连接的客户端最大连接数
}
http { #http 是指令块,针对http网络传输的一些指令配置
include mime.types; #include 引入外部配置,提高可读性,避免单个配置文件过大
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了,详细参数名,见下方表格
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on; #sendfile使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率
#tcp_nopush on;
#keepalive_timeout 0; #keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
keepalive_timeout 65;
#gzip on; #gzip启用压缩,html/js/css压缩后传输会更快
server { #server可以在http指令块中设置多个虚拟主机,一个server块是一个虚拟主机
listen 80; #监听端口
server_name localhost; #域名、监听地址,其后可以跟多个主机名称
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #请求路由映射,匹配拦截,
root html; #网页根目录
index index.html index.htm; #首页位置
#proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
#deny 127.0.0.1; #拒绝的ip
#allow 172.18.5.54; #允许的ip
}
#upstream mysvr {
# server 127.0.0.1:7878;
# server 192.168.10.121:3333 backup; #热备
#}
#error_page 404 /404.html; #404错误页面,可以自定义成:error_page 404 https://www.baidu.com;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 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;
# }
#}
}