🪁Nginx常用命令
🎨Nginx正向代理
🥏Nginx反向代理
🔮Nginx负载均衡
🎁Nginx基本配置详解
##
# 全局配置
##
user www-data; ## 配置 worker 进程的用户和组
worker_processes auto; ## 配置 worker 进程启动的数量,建议配置为 CPU 核心数
error_log logs/error.log; ## 全局错误日志
pid /run/nginx.pid; ## 设置记录主进程 ID 的文件
worker_rlimit_nofile 8192; ## 配置一个工作进程能够接受并发连接的最大数
##
# 工作模式及连接数上限
##
events {
# epoll 是多路复用 IO(I/O Multiplexing)中的一种方式,
# 仅用于 Linux 2.6 以上内核,可以大大提高 Nginx 性能
use epoll
# 单个后台 worker process 进程的最大并发链接数
# 并发总数 max_clients = worker_professes * worker_connections
worker_connections 4096; ## Defaule: 1024
# multi_accept on; ## 指明 worker 进程立刻接受新的连接
}
##
# http 模块
##
http {
##
# Basic Settings
##
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,
#以平衡磁盘与网络 I/O 处理速度,降低系统的 uptime.
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65; ## 连接超时时间
types_hash_max_size 2048; ## 指定散列类型表的最大大小
# server_tokens off;
# server_names_hash_bucket_size 64; # this seems to be required for some vhosts
# server_name_in_redirect off;
include /etc/nginx/mime.types; ## 设定 mine 类型
default_type application/octet-stream;
# 设定请求缓冲
client_header_buffer_size 128k; # 指定客户端请求头缓存大小,当请求头大于 1KB 时会用到该项
large_client_header_buffers 4 128k; # 最大数量和最大客户端请求头的大小
##
# SSL Settings
##
# 启用所有协议,禁用已废弃的不安全的SSL 2 和SSL 3
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
# 让服务器选择要使用的算法套件
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log; ## 访问日志
error_log /var/log/nginx/error.log; ## 错误日志
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf; # 这个文件夹默认是空的
include /etc/nginx/sites-enabled/*; # 开启的 Server 服务配置
}
##
# mail 模块
##
mail {
# See sample authentication script at:
# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# auth_http localhost/auth.php;
# pop3_capabilities "TOP" "USER";
# imap_capabilities "IMAP4rev1" "UIDPLUS";
server {
listen localhost:110;
protocol pop3;
proxy on;
}
server {
listen localhost:143;
protocol imap;
proxy on;
}
}
🪁Nginx常用命令
## 查看 Nginx 程序文件目录:/usr/sbin/nginx
$ ps -ef | grep nginx
## 查看 nginx.conf 配置文件目录:/etc/nginx/nginx.conf
$ nginx -t
$ vim /etc/nginx/nginx.conf
## 配置文件目录:/etc/nginx
## 虚拟主机配置文件目录:/etc/nginx/sites-available/
## 虚拟主机文件夹目录:/var/www/,详情可在 /etc/nginx/sites-available/ 中配置
## 默认网页文件目录:/usr/share/nginx/html
## 测试配置文件,只检查配置文件是否存在语法错误
$ nginx -t -c <path-to-nginx.conf>
$ sudo nginx -t -c /etc/nginx/nginx.conf
## 启动 Nginx 服务
$ nginx 安装目录 -c <path-to-nginx.conf>
$ sudo /etc/init.d/nginx start
## 停止 Nginx 服务
$ sudo /usr/sbin/nginx -s stop
## 重启 Nginx
$ sudo /usr/sbin/nginx -s reload # 0.8 版本之后的方法
$ kill -HUP pid # 向 master 进程发送信号从容地重启 Nginx,即服务不中断
$ sudo service nginx start
$ sudo service nginx stop
$ sudo service nginx restart
🎨Nginx正向代理
正向代理:内网服务器主动去请求外网的服务的一种行为
光看概念,可能有读者还是搞不明白:什么叫做“正向”,什么叫做“代理”,我们分别来理解一下这两个名词。
正向:相同的或一致的方向
代理:自己做不了的事情或者自己不打算做的事情,委托或依靠别人来完成。
借助解释,回归到nginx的概念,正向代理其实就是说客户端无法主动或者不打算完成主动去向某服务器发起请求,而是委托了nginx代理服务器去向服务器发起请求,并且获得处理结果,返回给客户端。
从下图可以看出:客户端向目标服务器发起的请求,是由代理服务器代替它向目标主机发起,得到结果之后,通过代理服务器返回给客户端。
正向代理的配置:
server {
#指定DNS服务器IP地址
resolver 114.114.114.114;
#指定代理端口
listen 8080;
location / {
#设定代理服务器的协议和地址(固定不变)
proxy_pass http://$http_host$request_uri;
}
}
这样就可以做到内网中端口为8080的服务器主动请求到1.2.13.4的主机上,如在Linux下可以:
curl --proxy proxy_server:8080 http://www.taobao.com/
正向代理的关键配置:
1.resolver:DNS服务器IP地址
2.listen:主动发起请求的内网服务器端口
3.proxy_pass:代理服务器的协议和地址
🥏Nginx反向代理
反向代理:reverse proxy,是指用代理服务器来接受客户端发来的请求,然后将请求转发给内网中的上游服务器,上游服务器处理完之后,把结果通过nginx返回给客户端。
举个栗子:一个服务器的80端口只有一个,而服务器中可能有多个项目,如果A项目是端口是8081,B项目是8082,C项目是8083,假设指向该服务器的域名为www.xxx.com,此时访问B项目是www.xxx.com:8082,以此类推其它项目的URL也是要加上一个端口号,这样就很不美观了,这时我们把80端口给nginx服务器,给每个项目分配一个独立的子域名,如A项目是a.xxx.com,并且在nginx中设置每个项目的转发配置,然后对所有项目的访问都由nginx服务器接受,然后根据配置转发给不同的服务器处理。具体流程如下:
反向代理配置:
server {
#监听端口
listen 80;
#服务器名称,也就是客户端访问的域名地址
server_name a.xxx.com;
#nginx日志输出文件
access_log logs/nginx.access.log main;
#nginx错误日志输出文件
error_log logs/nginx.error.log;
root html;
index index.html index.htm index.php;
location / {
#被代理服务器的地址
proxy_pass http://localhost:8081;
#对发送给客户端的URL进行修改的操作
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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
}
}
这样就可以通过a.xxx.com来访问a项目对应的网站了,而不需要带上难看的端口号。
反向代理的配置关键点是:
1.server_name:代表客户端向服务器发起请求时输入的域名
2.proxy_pass:代表源服务器的访问地址,也就是真正处理请求的服务器(localhost+端口号)。
🔮Nginx负载均衡
负载均衡:将服务器接收到的请求按照规则分发的过程,称为负载均衡。负载均衡是反向代理的一种体现。
可能绝大部分人接触到的web项目,刚开始时都是一台服务器就搞定了,但当网站访问量越来越大时,单台服务器就扛不住了,这时候需要增加服务器做成集群来分担流量压力,而在架设这些服务器时,nginx就充当了接受流量和分流的作用了,当请求到nginx服务器时,nginx就可以根据设置好的负载信息,把请求分配到不同的服务器,服务器处理完毕后,nginx获取处理结果返回给客户端,这样,用nginx的反向代理,即可实现了负载均衡。
Nginx实现负载均衡有几种模式:
1.轮询:每个请求按时间顺序逐一分配到不同的后端服务器,也是nginx的默认模式。轮询模式的配置很简单,只需要把服务器列表加入到upstream模块中即可。
下面的配置是指:负载中有三台服务器,当请求到达时,nginx按照时间顺序把请求分配给三台服务器处理。
2.ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
下面的配置是指:负载中有三台服务器,当请求到达时,nginx优先按照ip_hash的结果进行分配,也就是同一个IP的请求固定在某一台服务器上,其它则按时间顺序把请求分配给三台服务器处理。
3.url_hash:按访问url的hash结果来分配请求,相同的url固定转发到同一个后端服务器处理。
而在每一种模式中,每一台服务器后面的可以携带的参数有:
1.down: 当前服务器暂不参与负载
2.weight: 权重,值越大,服务器的负载量越大。
3.max_fails:允许请求失败的次数,默认为1。
4.fail_timeout:max_fails次失败后暂停的时间。
5.backup:备份机,只有其它所有的非backup机器down或者忙时才会请求backup机器。