Nginx 服务器
Nginx 是一款高性能的HTTP和反向代理服务器,能够选择高效的epoll、kqueue、eventport最为网 络I/O模型,在高连接并发的情况下,能够支持高达5万个并发连接数的响应,而内存、CPU等系统资 源消耗却非常低,运行非常稳定。
安装 nginx
bash
# 安装 nginx
[root@www ~]# yum -y install nginx
# 启动 nginx
[root@www ~]# systemctl enable nginx --now
# 准备主页
[root@www ~]# mv /usr/share/nginx/html/index.html{,.ori}
[root@www ~]# echo Hello World From Nginx >
/usr/share/nginx/html/index.html
# 防火墙
[root@www ~]# firewall-cmd --add-service=http --permanent
[root@www ~]# firewall-cmd --reload
[root@client ~]# curl http://www.laoma.cloud
# windows客户端修改C:\Windows\System32\drivers\etc\hosts
# Linux或Unix修改 /etc/hosts
# 添加如下记录
10.1.8.10 www.laoma.cloud
根据名称
bash
# 参考主配置文件/etc/nginx/nginx.conf中server块配置
[root@www ~]# vim /etc/nginx/conf.d/vhost-name.conf
server {
server_name web1.laoma.cloud;
root /usr/share/nginx/web1;
}
server {
server_name web2.laoma.cloud;
root /usr/share/nginx/web2;
}
[root@www ~]# mkdir /usr/share/nginx/web{1,2}
[root@www ~]# echo web1.laoma.cloud > /usr/share/nginx/web1/index.html
[root@www ~]# echo web2.laoma.cloud > /usr/share/nginx/web2/index.html
[root@www ~]# systemctl restart nginx
客户端测试
bash
# 配置名称解析,假设web服务器ip地址为10.1.8.10
10.1.8.10 web1.laoma.cloud
10.1.8.10 web2.laoma.cloud
[root@client ~]# curl http://www1.laoma.cloud/
www1.laoma.cloud
[root@client ~]# curl http://www2.laoma.cloud/
www2.laoma.cloud
提示:清理环境,避免影响后续实验。
bash
[root@www ~]# mkdir /etc/nginx/conf.d/vhosts
[root@www ~]# mv /etc/nginx/conf.d/vhost-name.conf /etc/nginx/conf.d/vhosts
根据 port
bash
[root@www ~]# vim /etc/nginx/conf.d/vhost-port.conf
server {
listen 8081;
server_name www.laoma.cloud;
root /usr/share/nginx/8081;
}
server {
listen 8082;
server_name www.laoma.cloud;
root /usr/share/nginx/8082;
}
[root@www ~]# mkdir /usr/share/nginx/808{1,2}
[root@www ~]# echo 8081 > /usr/share/nginx/8081/index.html
[root@www ~]# echo 8082 > /usr/share/nginx/8082/index.html
[root@www ~]# systemctl restart nginx
客户端测试
bash
# 配置名称解析,假设web服务器ip地址为10.1.8.10
10.1.8.10 www.laoma.cloud
[root@client ~]# curl http://www.laoma.cloud:8081
8081
[root@client ~]# curl http://www.laoma.cloud:8082
8082
提示:清理环境,避免影响后续实验。
配置 SSL/TLS
生成证书
bash
#--1--生成私钥
[root@www ~]# mkdir certs && cd certs
[root@www certs]# openssl genrsa -out www.key 2048
#--2--生成请求文件csr
[root@www certs]# openssl req -new -key www.key -out www.csr -subj
"/C=CN/ST=JS/L=NJ/O=LM/OU=DEVOPS/CN=www.laoma.cloud/emailAddress=webadmin@
laoma.cloud"
#CN的值必须是网站域名
#--3--使用自己的私钥对请求文件签名,以生成证书
[root@www certs]# openssl x509 -req -days 3650 -in www.csr -signkey
www.key -out www.crt
配置站点
bash
[root@www certs]# mkdir /etc/ssl/certs/www.laoma.cloud
[root@www certs]# mv www* /etc/ssl/certs/www.laoma.cloud
# 参照默认配置修改
[root@www ~]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhostwww.laoma.cloud-ssl.conf
[root@www~]# vim /etc/nginx/conf.d/vhost-www.laoma.cloud-ssl.conf
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.laoma.cloud;
root /usr/share/nginx/html;
# 证书
ssl_certificate "/etc/ssl/certs/www.laoma.cloud/www.crt";
# 私钥
ssl_certificate_key "/etc/ssl/certs/www.laoma.cloud/www.key";
}
[root@www ~]# systemctl restart nginx
配置HTTP重定向到https
bash
[root@www ~]# vim /etc/nginx/conf.d/vhost-www.laoma.cloud-ssl.conf
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.laoma.cloud;
root /usr/share/nginx/html;
# 证书
ssl_certificate "/etc/ssl/certs/www.laoma.cloud/www.crt";
# 私钥
ssl_certificate_key "/etc/ssl/certs/www.laoma.cloud/www.key";
}
# 配置HTTP重定向到https
server {
listen 80;
listen [::]:80;
server_name www.laoma.cloud;
root /usr/share/nginx/html;
# 添加重定向
return 301 https://$host$request_uri;
}
[root@www ~]# systemctl restart nginx
# 防火墙设置
[root@www ~]# firewall-cmd --add-service=https --permanent
[root@www ~]# firewall-cmd --reload
# 测试
[root@client ~]# curl http://www.laoma.cloud/
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
# 使用-k指明目标站点不是一个安全站点
[root@client ~]# curl -k https://www.laoma.cloud/
配置基本认证
用户名和密码使用plain text发送,所以最好配置SSL/TLS。
bash
#安装工具
[root@www ~]# yum -y install httpd-tools
[root@www ~]# vim /etc/nginx/conf.d/vhost-www.laoma.cloud-ssl.conf
# add into the [server] section
server {
.....
location /auth-basic/ {
auth_basic "Basic Auth";
auth_basic_user_file "/etc/nginx/.htpasswd";
}
}
[root@www ~]# systemctl restart nginx
# add user for Basic authentication
[root@www ~]# yum install -y httpd-tools
[root@www ~]# htpasswd -b -c /etc/nginx/.htpasswd laoma 123456
# create a test page
[root@www ~]# mkdir /usr/share/nginx/html/auth-basic
[root@www ~]# vim /usr/share/nginx/html/auth-basic/index.html
<html>
<body>
<div style="width: 100%; font-size: 40px; font-weight: bold; text-align:
laomaer;">
Test Page for Basic Authentication
</div>
</body>
</html>
# 测试,通过-u选项指定用户名和密码
[root@client ~]# curl -ku laoma:123456 https://www.laoma.cloud/auth-basic/
支持动态脚本
使用 PHP
bash
# 安装PHP和php-fpm,建议把其他的扩展包一起安装
[root@www ~]# yum install -y php php-fpm
# php-fpm: 负责接收web程序发来的php代码
# php:负责解析和执行php代码,并将结果返回给php-fpm
# 当客户端访问 php 站点时,web站点接收用户请求
# 并转发 php 代码给php-fpm服务
# php-fpm 服务调用php解析php网页,然后将结果返回给web程序
# web 程序将结果返回给客户端
# 建议把其他的扩展包一起安装
[root@www ~]# yum install -y php-gd php-common php-pear php-mbstring phpmcrypt
#
查看 php 版本
[root@www ~]# php -v
# 测试 php 是否正常
[root@www ~]# echo "<?php echo 'PHP Test Page'.\"\n\"; ?>" > php_test.php
[root@www ~]# php php_test.php
PHP Test Page
# 准备测试页,使用phpinfo查看详细信息
[root@www ~]# echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php
配置虚拟机主机支持php
bash
# 修改配置文件
[root@www ~]# vim /etc/nginx/conf.d/vhost-www.laoma.cloud-ssl.conf
# add into the [server] section
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.laoma.cloud;
root /usr/share/nginx/html;
ssl_certificate "/etc/ssl/certs/www.laoma.cloud/www.crt";
ssl_certificate_key "/etc/ssl/certs/www.laoma.cloud/www.key";
# 添加代理
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 配置HTTP重定向到https
server {
listen 80;
listen [::]:80;
server_name www.laoma.cloud;
root /usr/share/nginx/html;
# 添加重定向
return 301 https://$host$request_uri;
}
客户端测试
bash
[root@client ~]# curl -k https://www.laoma.cloud/info.php
反向代理
反向代理实践环境
环境架构

/etc/hosts
bash
# 所有节点
[root@nginx ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
::1 localhost localhost.localdomain localhost6
localhost6.localdomain6
############ proxy ##################
10.1.8.11 client.laoma.cloud client
10.1.8.20 www.laoma.cloud www
10.1.8.20 proxy.laoma.cloud proxy
10.1.8.21 nginx1.laoma.cloud nginx1
10.1.8.22 nginx2.laoma.cloud nginx2
10.1.8.23 nginx3.laoma.cloud nginx3
后端 nginx 服务器配置
bash
# 除了客户端,所有节点安装nginx并启动nginx服务。
# 以nginx1为例
[root@nginx1 ~]# yum -y install nginx
# 启动并启用服务
[root@nginx1 ~]# systemctl enable nginx --now
# 防火墙设置
[root@nginx1 ~]# firewall-cmd --add-service=http --permanent
[root@nginx1 ~]# firewall-cmd --add-service=http
# 准备主页-代理节点
[root@proxy ~]# echo Welcome to www.laoma.cloud >
/usr/share/nginx/html/index.html
# 准备主页-其他节点
[root@nginx1 ~]# echo Welcome to $(hostname) >
/usr/share/nginx/html/index.html
[root@nginx2 ~]# echo Welcome to $(hostname) >
/usr/share/nginx/html/index.html
[root@nginx3 ~]# echo Welcome to $(hostname) >
/usr/share/nginx/html/index.html
# 客户端测试
[root@client ~]# curl http://www.laoma.cloud/
Welcome to www.laoma.cloud
[root@client ~]# curl http://nginx1.laoma.cloud/
Welcome to nginx1.laoma.cloud
[root@client ~]# curl http://nginx2.laoma.cloud/
Welcome to nginx2.laoma.cloud
[root@client ~]# curl http://nginx3.laoma.cloud/
Welcome to nginx3.laoma.cloud
前端 proxy 服务器配置
bash
[root@proxy ~]# mkdir -p /var/nginx
[root@proxy ~]# echo "Hello, Nginx" > /var/nginx/index.html
[root@proxy ~]# echo "Hello, Laoma" > /var/nginx/test.txt
[root@proxy ~]# cp /usr/share/nginx/html/nginx-logo.png /var/nginx/
[root@proxy ~]# ls /var/nginx/
index.html nginx-logo.png test.txt
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name www.laoma.cloud;
# 匹配根位置
location / {
root /var/nginx;
index index.html;
}
}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
测试
bash
[root@client ~]# curl http://www.laoma.cloud/
Hello, Nginx
[root@client ~]# curl http://www.laoma.cloud/test.txt
Hello, Laoma
反向代理基础实践-代理本地
环境准备
bash
[root@proxy ~]# mkdir /var/nginx/nginx{1,2}
[root@proxy ~]# echo "Hello, I'm here /var/nginx/nginx1" >
/var/nginx/nginx1/index.html
[root@proxy ~]# echo "Hello, I'm here /var/nginx/nginx2" >
/var/nginx/nginx2/index.html
[root@proxy ~]# mkdir /var/nginx{1,2}
[root@proxy ~]# echo "Hello, Nginx1" > /var/nginx1/index.html
[root@proxy ~]# echo "Hello, Nginx2" > /var/nginx2/index.html
[root@proxy ~]# tree /var/nginx*
/var/nginx
├── index.html
├── nginx1
│ └── index.html
├── nginx2
│ └── index.html
├── nginx-logo.png
└── test.txt
/var/nginx1
└── index.html
/var/nginx2
└── index.html
2 directories, 7 files
[root@proxy ~]# \
for path1 in www{1..2}
do
for path2 in nginx{1..2}
do
mkdir -p /var/$path1/$path2
echo "Hello, I'm here /var/$path1/$path2" >
/var/$path1/$path2/index.html
done
done
[root@proxy ~]# tree /var/www*
/var/www1
├── nginx1
│ └── index.html
└── nginx2
└── index.html
/var/www2
├── nginx1
│ └── index.html
└── nginx2
└── index.html
4 directories, 4 files
基本测试
bash
[root@client ~]# curl http://www.laoma.cloud/
Hello, Nginx
# 显示结果是目录/var/nginx/nginx1中内容
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Hello, I'm here /var/nginx/nginx1
# 显示结果是目录/var/nginx/nginx2中内容
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Hello, I'm here /var/nginx/nginx2
实践1:无符号匹配
bash
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name www.laoma.cloud;
# 匹配根位置
location / {
root /var/nginx;
index index.html;
}
# 匹配/nginx1时,/var目录下找nginx1,完整路径是/var/nginx1
location /nginx1 {
root /var;
# 等效于下面的 alias 语句,必须使用绝对路径
# alias /var/nginx1;
index index.html;
}
}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
访问测试
bash
# nginx1 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Hello, Nginx1
# 显示结果是目录/var/nginx1中内容
# nginx2 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Hello, I'm here /var/nginx/nginx2
# 显示结果是目录/var/nginx/nginx2中内容
实践2:正则表达式匹配
bash
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name www.laoma.cloud;
# 匹配根位置
location / {
root /var/nginx;
index index.html;
}
# 匹配/nginx1时,/var目录下找nginx1,完整路径是/var/nginx1
location /nginx1 {
root /var;
# 等效于下面的 alias 语句,必须使用绝对路径
# alias /var/nginx1;
index index.html;
}
# 正则表达式匹配 /nginx.*
location ~ /nginx.* {
root /var/www1;
index index.html;
}
}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
访问测试
bash
# nginx 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Welcome to nginx2.laoma.cloud
# 显示结果是服务器 nginx2.laoma.cloud 内容
# nginx 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Welcome to nginx2.laoma.cloud
# 显示结果是服务器 nginx2.laoma.cloud 内容
实验结果:正则表达式匹配优先级高于无符号。
实践3:精确匹配
bash
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name www.laoma.cloud;
# 匹配根位置
location / {
root /var/nginx;
index index.html;
}
# 匹配 /nginx1/ 开头,代理到nginx1.laoma.cloud,/nginx1/不组合到后端服务
器
# 访问 /nginx1/ 开头,相当于直接访问http://nginx1.laoma.cloud/
location /nginx1/ {
# 后端服务
proxy_pass http://nginx1.laoma.cloud/; # 注意:代理后端后面有 /。
index index.html;
}
# 正则表达式匹配 /nginx.*
location ~ /nginx[12].* {
# 手动重写路径:去掉 /nginx 前缀,转发到目标服务器
# ^/nginx[12](.*)$ 匹配 /nginx[12] 开头的完整路径,$1表示 /nginx[12]
后的所有内容
# break 表示重写后不再匹配其他 rewrite 规则
rewrite ^/nginx[12](.*)$ $1 break;
# proxy_pass 不带 URI(无末尾的 /),配合 rewrite 实现路径替换
proxy_pass http://nginx2.laoma.cloud;
index index.html;
}
# 精确匹配
location = /nginx1/ {
proxy_pass http://nginx1.laoma.cloud/;
index index.html;
}
}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
访问测试
bash
# nginx1 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Welcome to nginx1.laoma.cloud
# 显示结果是服务器 nginx1.laoma.cloud 内容
# nginx2 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Welcome to nginx2.laoma.cloud
# 显示结果是服务器 nginx2.laoma.cloud 内容