文章目录
一、nginx配置文件组成
1、全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成worker process数,进行PID存放路径、日志存放路径和类型以及配置文件的引入等。
user www www;
worker_processes auto; // 值越大代表支持的并发处理量越大,但是会受到硬件、软件等设备的约束
error_log /data/wwwlogs/error_nginx.log crit;
pid /var/run/nginx.pid;
worker_rlimit_nofile 51200;
2、envents块
events块涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取那种事件驱动模型来处理连接请求,每个work process可以同时支持的最大连接数等。
events {
use epoll;
worker_connections 51200;
multi_accept on;
}
3、http块
这是nginx服务器配置中最重要的部分,代理、缓存和日指定以等绝大多数功能和第三方模块的配置都在这里,需要注意的是:http块可以包括http全局块,server块。
1)http全局块
http全局块配置的指令包括文件引入,MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限等。
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;
log_format json escape=json '{"@timestamp":"$time_iso8601",'
'"server_addr":"$server_addr",'
'"remote_addr":"$remote_addr",'
'"scheme":"$scheme",'
'"request_method":"$request_method",'
'"request_uri": "$request_uri",'
'"request_length": "$request_length",'
'"uri": "$uri", '
'"request_time":$request_time,'
'"body_bytes_sent":$body_bytes_sent,'
'"bytes_sent":$bytes_sent,'
'"status":"$status",'
'"upstream_time":"$upstream_response_time",'
'"upstream_host":"$upstream_addr",'
'"upstream_status":"$upstream_status",'
'"host":"$host",'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
2)server块
server块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个http快可以包括多个server块,而每个server块就相当于一个虚拟主机。
而每个server块也分为全局server块,以及可以同时包含多个location块。
① 全局server块
最常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或ip配置
② location块
一个server块可以配置多个location块。
这块的主要作用是基于Nginx服务器接收到的请求字符串(例如server_name / uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
######################## default ############################
server {
listen 80; // 监听的端口号
server_name _; // 主机名称
access_log /data/wwwlogs/access_nginx.log combined;
root html;
index index.html index.htm index.php;
#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 ~ [^/]\.php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
expires 7d;
access_log off;
}
location ~ ^/(\.user.ini|\.ht|\.git|\.svn|\.project|LICENSE|README.md) {
deny all;
}
location /.well-known {
allow all;
}
}
########################## vhost #############################
include vhost/*.conf;
}
二、配置实例
1、配置反向代理
1) 实现效果
① 打开浏览器,在浏览器地址栏输入地址:www.xxx.com,跳转到linux系统tomcat主页面中。
2)准备工作
① 在Linux中安装tomcat,使用默认端口8080。
tomcat安装包放到Linux系统中,解压即可。
gz格式
tar -xvf xxx.gz
zip格式
unzip.xxx.zip
② 进入tomcat的bin目录中,通过 ./startup.sh启动服务器。
启动时可能会提示权限不足。可以使用下列命令解决。
chmod u+x *.sh
出现Tomcat started.即代表启动成功
Using CATALINA_BASE: /usr/src/apache-tomcat-8.5.75
Using CATALINA_HOME: /usr/src/apache-tomcat-8.5.75
Using CATALINA_TMPDIR: /usr/src/apache-tomcat-8.5.75/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/src/apache-tomcat-8.5.75/bin/bootstrap.jar:/usr/src/apache-tomcat-8.5.75/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
2、对外开放访问
开放端口
firewall-cmd --add-port=8080/tcp --permanent
重启防火墙
firewall-cmd --reload
查看已经开放的端口号
firewall-cmd --list-all
在windows系统中通过浏览器访问tomcat
服务器地址:8080
也可以在云服务器上添加8080端口的安全组进行访问。
3、访问过程的分析
4、具体配置
在windows系统的host文件进行域名和ip对应关系的配置**😗*
在host文件中添加
ip地址 www.baidu.com
在nginx进行请求转发的配置(反向代理配置)
i 进入到nginx的配置文件,进行配置
server {
#监听端口
listen 80;
#监听ip
server_name 192.168.16.168;
location / {
root html;
#代理的目标地址
proxy_pass http://127.0.0.1:8080;
index index.html main.html;
}
}
ii 修改后保存(esc键 :wq),并运行nginx:./nginx
iii 验证是否生效
2、负载均衡
通过增加服务器的数量,然后将请求分发到各个服务器上,将原先请求几种到当服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
1)实现效果
在浏览器地址栏输入地址 http://xxx/edu/a.html,负载均衡效果,平均8080和8081端口中。
2)准备工作
① 准备两台tomcat服务器,一台8080,一台8081
② 在两台tomcat里面的webapps目录中,创建名称是edu的文件夹,在edu文件夹中创建页面 a.html,用于测试
③ 在nginx的配置文件中进行负载均衡的相关配置
3)nginx配置
① 进入到nginx的配置文件
upstream myserver {
server xxx:8881;
server xxx:9991;
}
server {
listen 80;
server_name xxx;
location / {
#代理的目标地址就是我们前面配置的myserver
proxy_pass http://myserver;
}
}
4)测试效果
保存配置文件后应重启nginx,然后访问 http://xxx,请求多次,如果相应的结果是循环的,就代表成功了
3、动静分离
Nginx动静分离简单来说就是吧动态跟静态请求分开,不能理解为只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开。可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。
动静分离从实现角度可以分为两种:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流的方案。
另一种是动态文件和静态文件混合在一起发布,通过nginx分开,通过location指定不同的后缀名实现不同的请求转发,通过expires参数设置,可以是浏览器缓存过期时间,减少与服务器之间的请求和流量。
具体的expires定义:是给一个资源设定一个过期时间,也就是说无需去服务器端验证,直接通过浏览器自身确人是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。假设设置过期时间为6天,则表示在着6天之内访问这个URL,发送一个请求,对比服务器中该文件最后更新时间,如果没有发生变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器中重新下载,返回状态码200。
1)准备工作
在服务器中创建文件夹data,在data目录下创建两个文件夹,img 和html,放一下静态资源即可。
2)nginx配置
server {
listen 80;
server_name xxxx;
location /img/ {
root /data/;
}
location /html/ {
root /data/;
# 列出当前目录的内容
autoindex on;
}
}
3 )测试
访问地址,如下,如果能访问到则成功
http://xxx/img/cs.png
http://xxx/html/cs.html
4、高可用的集群
高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断地提供服务,把因为软件,硬件,人为造成的故障对业务的影响降低到最小程度。总而言之就是保证公司业务7*24小时不宕机
1)准备工作
① 准备两台服务器,可以选择在本机跑虚拟机,并安装好nginx环境
② 给两台服务器安装keepalived
输入命令完成安装,也可以通过下载安装包解压安装
# 安装
yum install keepalived -y
# 查看版本
rpm -q -a keepalived
2)配置高可用(主从配置)
修改keepalived.conf中的一些配置,完成高可用。两台服务器都要进行配置,配置内容部分不一样。
# 全局定义
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 # 邮件服务器地址
smtp_connect_timeout 30 # 超时时间
# 通过这个名字:LVS_DEVEL,能够访问到我们的主机
# 配置在 etc/hosts文件中 对应:127.0.0.1 LVS_DEVEL
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 检测脚本的路径
interval 2 #(检测脚本执行的间隔)2秒
weight 2 # 权重
}
vrrp_instance VI_1 {
state MASTER # (初始状态,最终状态由priority 值决定)备份服务器上将 MASTER 改为 BACKUP,
# 如果master的priority数值小于backup的,运行时会被backup抢占为master
interface ens192 # 通信接口 根据服务器的网卡来进行配置:ip addr
# mcast_src_ip 192.168.16.168 # 发送多播数据包时的源IP地址(本机ip),这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 心跳检测 1秒
authentication { # 服务器之间的通信密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 # VRRP HA 虚拟地址 访问的时候就访问这个,多个换行继续写
}
}
根据上面配置的检测脚本的地址,添加该脚本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
配置好后,启动两台服务器的nginx和keepalived
systemctl start keepalived.service
最后查看是否成功启动可以查看相应的进程
# ps -ef | grep java
# ps -ef | grep keepalived
ps -ef | grep 名称
3)测试
① 输入虚拟ip地址,进行访问,如果能访问到,就是成功的。
② 关闭master服务器的nginx和keepalived(关闭后需查看进程,确认其已经关闭),命令如下,如果该地址还能继续访问到,则高可用配置成功。
systemctl stop keepalived.service
./nginx -s stop
三、nginx原理解析
1、master和worker
2、worker的工作原理
3、master和worker机制的优势
① 首先,对于每个 worker 进程来说都是独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
② 可以使用 nginx –s reload 热部署(不需要停机,边工作,边加载新的配置),利用 nginx 进行热部署操作。
③ 其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程。