通过视频写出的自己的笔记。适用Nginx初学者。
学习所需的软件链接:
https://pan.baidu.com/s/1wB4xQ2RfwhufXWeAu_FAqA 提取码: euj4
1、 nginx 简介
(1) 什么是 nginx 和可以做什么事情
(2) 正向代理
(3) 反向代理
(4) 动静分离
2、 Nginx 的安装
3、 Nginx 的常用命令和配置文件
4、 Nginx 配置实例 1 反向代理
5、 Nginx 配置实例 2 负载均衡
6、 Nginx 配置实例 3 动静分离
7、 Nginx 的高可用集群
(1) nginx 配置主从模式
(2) nginx 配置双主模式
正向代理:如果把局域网外的 Internet (外网)想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理需。要在客户端配置代理服务器进行指定网站访问
反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
nginx 在 linux 系统中如何进行安装。
1、安装gcc:安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装。
[root@localhost ~]# yum install gcc-c++
2、PCRE pcre-devel 安装:PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。
[root@localhost ~]# yum install -y pcre pcre-devel
3、zlib 安装:zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
[root@localhost ~]# yum install -y zlib zlib-devel
4、OpenSSL 安装:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
[root@localhost ~]# yum install -y openssl openssl-devel
5、去官网下载安装包:手动下载.tar.gz安装包。下载完毕上传到服务器上。
6、解压
[root@localhost opt]# tar -zxvf nginx-1.18.0.tar.gz
[root@localhost opt]# cd nginx-1.18.0/
7、配置:使用默认配置,在nginx根目录下执行。(默认安装到了:/usr/local/nginx目录下)
[root@localhost nginx-1.18.0]# ./configure
[root@localhost nginx-1.18.0]# make
[root@localhost nginx-1.18.0]# make install
#查找安装目录
[root@localhost nginx-1.18.0]# whereis nginx
nginx: /usr/local/nginx
进入Nginx安装目录,启动测试。
[root@localhost nginx-1.18.0]# cd /usr/local/nginx/
#conf 配置目录
#html页面
#logs 日志
#sbin 命令目录
[root@localhost nginx]# ls
conf html logs sbin
[root@localhost nginx]# cd sbin/
[root@localhost sbin]# ls
nginx
#启动Nginx 启动是没有输出就是好结果。
[root@localhost sbin]# ./nginx
[root@localhost sbin]#
检查nginx是否启动成功。
#访问Nginx 打出页面信息 证明访问成功。
[root@localhost sbin]# curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
注意:如何连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口!(也可直接关闭防火墙)。
# 开启防火墙
service firewalld start
# 重启防火墙
service firewalld restart
# 关闭防火墙
service firewalld stop
# 查看防火墙开放规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;
Windows 如何安装
当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload 即可让改动生效.
卸载Nginx.
# 关闭nginx进程
./nginx -s stop
#删除Nginx目录
rm -rf /user/local/nginx
#清除配置
make clean
查看 nginx 版本命令
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.18.0
启动命令:在/usr/local/nginx/sbin 目录下执行 ./nginx
cd /usr/local/nginx/sbin/
./nginx 启动
关闭命令
./nginx -s stop 停止
./nginx -s quit 安全退出
重新加载命令
./nginx -s reload 重新加载配置文件
ps aux|grep nginx 查看nginx进程
设置nginx开机启动。
vim /etc/rc.local
然后在底部增加
/usr/local/nginx/sbin/nginx
[root@localhost conf]# cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
```
user 用户名;
# 设置工作进程
worker_processes 2;
#支持的最大连接数为 1024。
worker_connections 1024
include指令:包含和导入外部文件,进行模块化的划分。
include mime.types;
default_type application/octet-stream;
sendfile指令:启用文件的高效传输,打开有利于文件传输的性能。
sendfile on; # 启用高效传输,与tcp_nopush联合使用
tcp_nopush on; # 当请求累积一定大小的时候,在进行发送
keepalive_requests指令:用来设置一个keep-alive连接使用的次数,客户端连接服务的超时时间。
gzip指令:开启它有利于文件和请求数据的传输。
gzip on
listen指令:用来配置监听端口。
server_name指令:用来设置虚拟主机服务名称。
server {
listen 80;
server_name www.xx1.cn www.xx2.cn;
# 可以配置多个,也可以通配符进行配置 *.itcast.cn www.itcast.* 注意*只能在首尾部分
}
location指令:用来设置请求的URI。
server {
...
server_name xxx.cn
# 可以在location后面加=(精确匹配)~(支持正则)~*(支持正则,支持大写)
location /abc{
default_type text/plain;
return 200 "access success";
}
}
error_page指令:设置网站的错误页面。
server {
error_page 404 http://www.404.cn;
}
或者
server{
error_page 404 /50x.html;
error_page 500 502 503 504 /50x.html;
location =/50x.html{
root html;
}
}
gzip_static指令:解决Gzip和sendfile共存问题,需要添加ngx_http_gzip_static_module模块,才能使用gzip_static指令。
proxy_pass指令:令用来设置被代理服务器地址。
proxy_set_header指令:该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后 将新的请求头发送给代理的服务器。
server {
listen 8080;
server_name localhost;
# 设置DNS的IP,用来解析proxy_pass域名
resolver 8.8.8.8;
location /server {
proxy_pass http://192.168.xx.xx:8080/;
proxy_set_header username TOM;
}
}
```
# 全局块
# 配置允许运行Nginx工作进程的用户和用户组
user www;
# 一般是CPU核数-1
worker_processes 2;
# 配置Nginx服务器运行对错误日志存放的路径
error_log logs/error.log;
pid logs/nginx.pid;
# 全局块
events{
accept_mutex on;
multi_accept on;
# 设置Nginx的worker进程最大的连接数
worker_connections 1024;
}
# http块
http{
include mime.types;
default_type application/octet-stream;
# 配置允许使用sendfile方式运输,开启高效的文件传输
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 配置连接超时时间
keepalive_timeout 65;
# Gzip压缩功能配置
include /home/www/gzip/nginx_gzip.conf;
# 配置请求处理日志格式
log_format server1 '===>server1 access log';
# log_format server2 '===>server2 access log';
# server块 开始 #
include /home/www/conf.d/*.conf;
# server块 结束 #
}
```
server{
listen 8081;
# 设置虚拟主机服务名称,可以用域名,多个空格隔开,也可以通配符"*“例子:*.good.cn
server_name localhost;
# 配置请求处理日志存放路径
access_log /home/www/myweb/server1/logs/access.log server1;
location /server1/location1{
root /home/www/myweb;
index server1.html;
}
location /server1/location2{
root /home/www/myweb;
index server2.html;
}
# 配置错误页面转向
location = /404.html {
root /home/www/myweb;
index 404.html;
}
}
# 开启gzip功能
gzip on;
# 压缩源文件类型,例 application/javascript application/html;在mine.types里查看。
gzip_types *;
# 压缩级别 1-9
gzip_comp_level 6;
# 进行压缩响应页面的最小长度,小于这个数不进行压缩
gzip_min_length 1024k;
# 缓存空间大小,使用默认就好
gzip_buffers 4 16K;
# 指定压缩响应所需要的最低HTTP请求版,使用默认就好
gzip_http_version 1.1;
# 往头信息中添加压缩标识,默认是off
gzip_vary on;
# 对IE6以下的版本都不进行压缩
gzip_disable "MSIE [1-6]\.";
location /xxx{
add_header ‘Access-Control-Allow-Origin’ *;
add_header ‘Access-Control-Allow-Credentials’ 'true';
add_header ‘Access-Control-Allow-Methods’ GET,POST,PUT,DELETE;
add_header ‘Access-Control-Allow-Headers’ *;
root /home/www/myweb;
index server1.html;
}
用valid_referers指令,如果在添加上域名或者IP地址,如果该值为1就返回403。
location /xxx {
valid_referers none blocked www.baidu.* 127.0.0.1;
if ($invalid_referer){
# 返回403
return 403
# 如果让该图片显示其他默认图片
rewrite ^/ /images/图片名.png break;
}
root /usr/local/nginx/html;
}
# 如果不算这个域名,会重定向403
valid_referers *.goodysr.cn
if($invalid_referer){
return 403
}
server {
listen 80;
server_name www.xxx1.com www.xxx2.cn;
rewrite ^(.*) http://www.zong.cn$1;
# 也可以某个路径下进行跳转
location /user {
rewrite ^/user(.*)$ http://www.user.cn$1;
}
}
server {
listen 80;
server_name 域名;
# 将http请求重定向https上
rewrite ^(.*)$ https://$host$1;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 443 ssl;
server_name 域名;
root html;
index index.html index.htm;
# 证书文件
ssl_certificate cert/xxx.pem;
ssl_certificate_key cert/xxx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 加密规则
ssl_ciphers HIGH:!aNULL:!MD5;
# 表示使用TLS协议类型
ssl_protocols TLSv1 TLSv1.1 TLSv1.2
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
[root@localhost opt]# tar -zxvf apache-tomcat-9.0.1.tar.gz
[root@localhost opt]# cd apache-tomcat-9.0.1/
#进入bin目录
[root@localhost apache-tomcat-9.0.1]# cd bin/
[root@localhost bin]# ls
bootstrap.jar catalina-tasks.xml configtest.bat digest.bat setclasspath.sh startup.bat tomcat-native.tar.gz version.bat
catalina.bat commons-daemon.jar configtest.sh digest.sh shutdown.bat startup.sh tool-wrapper.bat version.sh
catalina.sh commons-daemon-native.tar.gz daemon.sh setclasspath.bat shutdown.sh tomcat-juli.jar tool-wrapper.sh
#启动tomcat
[root@localhost bin]# ./startup.sh
Using CATALINA_BASE: /opt/apache-tomcat-9.0.1
Using CATALINA_HOME: /opt/apache-tomcat-9.0.1
Using CATALINA_TMPDIR: /opt/apache-tomcat-9.0.1/temp
Using JRE_HOME: /opt/java/jre
Using CLASSPATH: /opt/apache-tomcat-9.0.1/bin/bootstrap.jar:/opt/apache-tomcat-9.0.1/bin/tomcat-juli.jar
Tomcat started.
#开放8080端口
firewall-cmd --add-port=8080/tcp --permanent
#重新加载
firewall-cmd –reload
#查看已经开放的端口号
firewall-cmd --list-all
#拷贝一个tomcat 到 tomcat8081文件夹下
[root@localhost opt]# cp -r apache-tomcat-9.0.1 tomcat8081/
[root@localhost opt]# cd tomcat8081/
[root@localhost tomcat8081]# cd apache-tomcat-9.0.1/conf/
#修改一个tomcat的访问端口号
[root@localhost conf]# vim server.xml
#进入8080端口的tomcat
[root@localhost opt]# cd apache-tomcat-9.0.1/
#进入webapps目录
[root@localhost apache-tomcat-9.0.1]# cd webapps/
[root@localhost webapps]# ls
docs examples host-manager manager ROOT
#创建 edu目录
[root@localhost webapps]# mkdir edu
进入edu目录
[root@localhost webapps]# cd edu/
#创建 a.html
[root@localhost vod]# vim a.html
<h1>8080</h1>
同样,进入8081端的tomcat下webapps,创建vod和a.html。实现效果:浏览器地址栏输入地址 http://169.254.118.173:9001/edu/a.html,负载均衡效果,平均访问8080和 8081 端口中的a.html页面(两个服务器平均访问,一次一个的来)。
准备工作
#拷贝 vod 到当前目录下 改名为 edu
[root@localhost webapps]# cp -r vod/ /opt/tomcat8081/apache-tomcat-9.0.1/webapps/edu
[root@localhost webapps]# ls
docs edu examples host-manager manager ROOT vod
[root@localhost webapps]# cd e
[root@localhost webapps]# cd edu/
[root@localhost edu]# ls
a.html
[root@localhost edu]# cat a.html
<h1>8081</h1>
在 nginx 的配置文件中进行负载均衡的配置。修改配置后,记得重新重新加载配置(上面配置的记得注释掉,否则看不到当前的效果)。
第一种 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
第二种 weight
weight 代表权重默认为 1,权重越高被分配的客户端越多,处理的请求更多。指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
upstream server_pool{
server 192.168.5.21 weight=10;
server 192.168.5.22 weight=10;
}
第三种 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session共享 的问题。
upstream server_pool{
ip_hash;
server 192.168.5.21:80;
server 192.168.5.22:80;
}
第四种 fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool{
server 192.168.5.21:80;
server 192.168.5.22:80;
fair;
}
least_conn 根据最少连接方式 ,适合请求处理时间长短不一造成服务器过载。
url_hash 根据URL分配方式 ,hash &request_uri;
upstream backend {
server 127.0.0.1:9091 down;
server 127.0.0.1:9092 max_conns=100 weight=1;
server 127.0.0.1:9093 weight=2;
}
upstream backend2{
hash &request_uri;
server 127.0.0.1:9091;
server 127.0.0.1:9091;
}
server {
listen 80;
server_name localhost;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://backend;
}
location /backend2/ {
proxy_pass http://backend2;
}
}
配置高可用的准备工作
在两台服务器安装 keepalived
[root@localhost sbin]# yum install keepalived -y
完成高可用配置(主从配置)
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}
备用服务器配置:global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}
#!/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 启动
最终测试