一、nginx架构图
1)nginx启动时,会生成两种类型的进程,一个是主进程(Master),一个(windows版本的目前只
有一个)或多个工作进程(Worker)。主进程并不处理网络请求,主要负责调度工作进程,也就是图
示的三项:加载配置、启动工作进程及非停升级。所以,nginx启动以后,查看操作系统的进程列表,
我们就能看到至少有两个nginx进程。
2)服务器实际处理网络请求及响应的是工作进程(worker),在类unix系统上,nginx可以配置多个
worker,而每个worker进程都可以同时处理数以千计的网络请求。
3)模块化设计。nginx的worker,包括核心和功能性模块,核心模块负责维持一个运行循环(run�loop),执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以
及将请求发往上游服务器等。而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的
选择和修改,编译成具有特定功能的服务器。
4)事件驱动、异步及非阻塞,可以说是nginx得以获得高并发、高性能的关键因素,同时也得益于对
Linux、Solaris及类BSD等操作系统内核中事件通知及I/O性能增强功能的采用,如kqueue、epoll及
event ports。
5)代理(proxy)设计,可以说是nginx深入骨髓的设计,无论是对于HTTP,还是对于FastCGI、
memcache、Redis等的网络请求或响应,本质上都采用了代理机制。所以,nginx天生就是高性能的代
理服务器
二、安装部署和配置管理
1、安装:yum安装
官网方法:
RHEL/CentOS
Install the prerequisites:
sudo yum install yum-utils
To set up the yum repository, create the file named /etc/yum.repos.d/nginx.repo with the
following contents:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
By default, the repository for stable nginx packages is used. If you would like to use mainline
nginx packages, run the following command:
sudo yum-config-manager --enable nginx-mainline
To install nginx, run the following command:
sudo yum install nginx
When prompted to accept the GPG key, verify that the fingerprint matches 573B FD6B 3D8F BC64
1079 A6AB ABF5 BD82 7BD9 BF62 , and if so, accept it
安装是关闭防火墙:
[root@tianyun ~]# systemctl start nginx
[root@tianyun ~]# systemctl enable nginx
查看防火墙状态, 需要关闭防火墙
[root@tianyun ~]# getenforce
Disabled
[root@tianyun ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor pres
et: enabled) Active: inactive (dead)
Docs: man:firewalld(1)
2、nginx高级应用
3、nginx虚拟机配置
3.1 基于域名的虚拟主机
3.2 基于ip的虚拟主机
4、nginx proxy代理
4.1 nginx负载均衡:
负载均衡作用:如果你的nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当你的一台机器web程序
关闭造成web不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的
响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就打打折扣,这里我们怎
么避免这样的情况发生呢。这里我配张图来说明下问题。
如果负载均衡中其中web2发生这样的情况,nginx首先会去web1请求,但是nginx在配置不当的情况下
会继续分发请求道web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给
web1,这里的响应时间如果过长,用户等待的时间就会越长。
4.2 在一台机器上配置测试
# 配置测试 ip 地址
[root@nginx]# ifconfig eth0:2 192.168.152.101
[root@nginx]# ifconfig eth0:2 192.168.152.101
[root@nginx]# ifconfig eth0:3 192.168.152.102
[root@nginx]# ifconfig eth0:4 192.168.152.103
# 创建测试主页目录及测试页
[root@nginx]# mkdir mytest1
[root@nginx]# mkdir mytest2
[root@nginx]# mkdir mytest3
[root@nginx]# mkdir mytest4
[root@nginx]# echo '192.168.152.100 mytest1' > mytest1/index.html
[root@nginx]# echo '192.168.152.101 mytest1' > mytest2/index.html
[root@nginx]# echo '192.168.152.102 mytest2' > mytest3/index.html
[root@nginx]# echo '192.168.152.103 mytest2' > mytest4/index.html
# 配置 nginx 实现负载均衡代理
upstream mytest1 {
server 192.168.152.100:80;
server 192.168.152.101:80;
}
server {
listen 192.168.152.192:80;
server_name www.test1.com;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://mytest1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
upstream mytest2 {
server 192.168.152.102:80;
server 192.168.152.103:80;
}
server {
listen 192.168.152.192:8080;
server_name www.test12.com;
root /usr/share/nginx/html;
# include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://mytest2;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
server {
listen 192.168.152.100:80;
server_name www.test1.com;
root /usr/share/nginx/mytest1;
access_log /var/log/www.test1.com.log main;
error_log /var/log/www.test1.com.error.log;
set_real_ip_from 192.168.152.192;
location / {
}
}
server {
listen 192.168.152.101:80;
server_name www.test1.com;
root /usr/share/nginx/mytest2;
access_log /var/log/www.test1.com.log main;
error_log /var/log/www.test1.com.error.log;
set_real_ip_from 192.168.152.192;
location / {
}
}
server {
listen 192.168.152.102:80;
server_name www.test2.com;
root /usr/share/nginx/mytest3;
access_log /var/log/www.test2.com.log main;
error_log /var/log/www.test2.com.error.log;
set_real_ip_from 192.168.152.192;
location / {
}
}
server {
listen 192.168.152.103:80;
server_name www.test2.com;
root /usr/share/nginx/mytest4;
access_log /var/log/www.test2.com.log main;
error_log /var/log/www.test2.com.error.log;
set_real_ip_from 192.168.152.192;
location / {
}
}
4.3 负载均衡算法
4.3.1 轮询:每个请求按时间顺序逐一分配到不同的后端服务器
4.3.2 ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
4.3.3 url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候效率.
4.3.4 fair: 这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。 Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair 模块
4.4 配置实例
4.5 nginx配置7层协议及4层协议方法
4.5.1 7层
4.5.2 4层 在nginx.conf里加
stream {
upstream mytest1 {
server 192.168.156.101:80;
server 192.168.156.102:80;
}
server {
listen 10.0.122.116:8088;
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass mytest1;
}
upstream mytest2 {
server 192.168.156.103:80;
server 192.168.156.104:80;
}
server {
listen 10.0.122.116:8089;
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass mytest2;
}
}