Nginx 服务器

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 内容
相关推荐
楼田莉子2 小时前
Linux学习之库的原理与制作
linux·运维·服务器·c++·学习
市安2 小时前
nat模式下lvs规划与部署
服务器·网络·php
枷锁—sha2 小时前
【Vulhub】1Panel 访问控制绕过实战指南 (CVE-2024-39907)
运维·学习·安全·网络安全
kkoral2 小时前
【FFmpeg 智慧园区场景应用】2.自动化处理 Shell 脚本
运维·ffmpeg·自动化
HABuo2 小时前
【linux进程控制(三)】进程程序替换&自己实现一个bash解释器
linux·服务器·c语言·c++·ubuntu·centos·bash
willhuo2 小时前
程序这东西,想的即使在完善,也有想不到的地方。。
linux·服务器·网络
Ghost Face...2 小时前
SoC启动流程详解:从Bootrom到多核负载均衡
运维·负载均衡
EverydayJoy^v^2 小时前
RH134学习进程——三.分析与存储日志
运维·服务器·网络
篱笆院的狗2 小时前
yum install 发生 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
linux·运维·centos