是什么
Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器.
nginx.org 官网
nginx.com 收费网站
nginx安装脚本1
#!/usr/bin/env bash ################################################################################### # 控制台颜色 BLACK="\033[1;30m" RED="\033[1;31m" GREEN="\033[1;32m" YELLOW="\033[1;33m" BLUE="\033[1;34m" PURPLE="\033[1;35m" CYAN="\033[1;36m" RESET="$(tput sgr0)" ################################################################################### printf "${BLUE}\n" cat << EOF ################################################################################### # 采用编译方式安装 Nginx, 并将其注册为 systemd 服务 # 默认下载安装 1.16.0 版本,安装路径为:/usr/local/nginx # @system: 适用于 CentOS7+ ################################################################################### EOF printf "${RESET}\n" command -v yum > /dev/null 2>&1 || { printf "${RED}Require yum but it's not installed.${RESET}\n"; exit 1; } printf "\n${GREEN}>>>>>>>> install nginx begin${RESET}\n" if [[ $# -lt 1 ]] || [[ $# -lt 2 ]]; then printf "${PURPLE}[Hint]\n" printf "\t Usage: sh nginx-install.sh [version] \n" printf "\t Default: sh nginx-install.sh 1.16.0 \n" printf "\t Example: sh nginx-install.sh 1.16.0 \n" printf "${RESET}\n" fi temp=/opt/nginx version=1.16.0 if [[ -n $1 ]]; then version=$1 fi # install info printf "${PURPLE}[Install Info]\n" printf "\t version = ${version}\n" printf "${RESET}\n" printf "${CYAN}>>>> install required libs${RESET}\n" yum install -y zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre # download and decompression printf "${CYAN}>>>> download nginx${RESET}\n" mkdir -p ${temp} curl -o ${temp}/nginx-${version}.tar.gz http://nginx.org/download/nginx-${version}.tar.gz tar zxf ${temp}/nginx-${version}.tar.gz -C ${temp} # configure and makefile printf "${CYAN}>>>> compile nginx${RESET}\n" cd ${temp}/nginx-${version} ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre make && make install rm -rf ${temp} cd - # setting systemd service printf "${CYAN}>>>> set nginx as a systemd service${RESET}\n" wget -N https://gitee.com/turnon/linux-tutorial/raw/master/codes/linux/soft/config/nginx/nginx.service -O /usr/lib/systemd/system/nginx.service chmod +x /usr/lib/systemd/system/nginx.service # boot nginx printf "${CYAN}>>>> start nginx${RESET}\n" systemctl enable nginx.service systemctl start nginx.service printf "\n${GREEN}<<<<<<<< install nginx end${RESET}\n" printf "\n${PURPLE}nginx service status: ${RESET}\n" systemctl status nginx
脚本2:
#!/bin/bash
# 0.准备工作
# . init.sh
ch_ok(){
if [ $? -eq 0 ]
then
echo -e "$1执行\033[32m成功!\033[0m"
else
echo -e "$1执行\033[31m失败!\033[0m"
exit 1
fi
}
install_nginx(){
# 1.安装依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre
ch_ok "安装依赖"
# 2.下载软件包
if [ -f nginx-1.25.4.tar.gz ]
then
echo "nginx-1.25.4.tar.gz已存在"
else
wget https://mirrors.huaweicloud.com/nginx/nginx-1.25.4.tar.gz
fi
ch_ok "下载软件包"
# 3.解压缩复制到/usr/local/src
if [ -d /usr/local/src/nginx-1.25.4 ]
then
echo "nginx目录已存在! "
else
tar -xvf nginx-1.25.4.tar.gz -C /usr/local/src
ch_ok "解压缩"
fi
# 4.编译安装
if [ -f /usr/local/nginx/sbin/nginx ]
then
echo "已安装nginx,不需要重新安装!"
else
cd /usr/local/src/nginx-1.25.4
./configure --with-http_stub_status_module --with-http_ssl_module
make -j 2 && make install
ch_ok "编译"
fi
# 5.修改配置
if [ -f /usr/lib/systemd/system/nginx.service ]
then
echo "启动脚本已存在!"
else
cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
fi
ch_ok "配置启动项"
# 6.启动
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx
}
install_nginx
1.目前主流的web服务器:
1.Apache(LAMP)
【同步阻塞模型,多线程,一个线程对应一个请求,并发量过高时,性能会变差】
2.Nginx(速度快,高并发,静态网站服务性能高;优秀的反向代理,负载均衡)
【异步非阻塞,多进程+多线程,
3.IIS
4.tomcat(针对java项目,web服务器,动态网站)
延伸版本:tengine(淘宝)、openresrt(章亦春)等
2.反向代理:将局域网、内部的WEB服务中的数据进行代理转发,让用户可以看到;
正向代理:代理用户的请求,简介访问网络服务;
nginx特点
nginx特点
模块化设计:良好的扩展性,可以通过模块方式进行功能扩展。
高可靠性:主控进程和 worker 是同步实现的,一个 worker 出现问题,会立刻启动另一个 worker。
内存消耗低:一万个长连接(keep-alive),仅消耗 2.5MB 内存。
支持热部署:不用停止服务器,实现更新配置文件,更换日志文件、更新服务器程序版本。
并发能力强:官方数据每秒支持 5 万并发;
功能丰富:优秀的反向代理功能和灵活的负载均衡策略
Nginx 功能
支持静态资源的 web 服务器。
http,smtp,pop3 协议的反向代理服务器、缓存、负载均衡;
支持 FASTCGI(fpm)
支持模块化,过滤器(让文本可以实现压缩,节约带宽),ssl 及图像大小调整。
内置的健康检查功能
基于名称和 ip 的虚拟主机
定制访问日志
支持平滑升级
支持 KEEPALIVE
支持 url rewrite
支持路径别名
支持基于 IP 和用户名的访问控制。
支持传输速率限制,支持并发数限制。
一、http与https的区别
https=http+ssl (加密 HTTPS还支持身份认证,通过数字证书确保网站的真实性。)
虚拟主机
就是把一台物理服务器划分成多个“虚拟”的服务器,每一个虚拟主机都可以有独立的域名和独立的目录,可以独立发布一个网站。
一个web服务器可以部署多个网站(能节约资源)
端口(适用于公司内部,因为端口你是无法告诉公网用户的):
-
80
-
443
-
8080
-
8081
mkdir -p /data/test{1..3}
![image-20240328143240973](C:\Users\联想小新\Desktop\vx图片\image-20240328143240973.png
域名(目前公网发布网站的首选,一个网站需要一个域名;一级域名需要购买【zuolaoshi】,二级域名【www】可以自己设置):
-
blog.zuolaoshi.cn
-
home.zuolaoshi.cn
修改配置文件里面的 域名;然后 去自己真机上面打开此电脑—c盘\Windows\system32\drivers\etc\hosts里面 添加 IP 和域名;例如:192.168.8.11 www.baidu.com
ip:
多个网卡,每个网卡设置不同的IP地址。
通过增加网络适配器,来增加ip;
三、安装方式(nginx)
-
yum CentOS7的yum仓库中没有,需要添加扩展仓库
-
源码包安装 make && make install
-
docker 镜像 一键安装配置
进程/线程
1程序(至少包含)——1个进程(可以看到)—-(至少包含)1线程(看不到)
IO模型
IO input/output 输入/输出操作
文件IO 读文件、写文件
网络IO 请求、相应
epoll 是多路复用 IO(I/O Multiplexing) 异步非阻塞模型
select 模型 Apache使用的,同步阻塞模型
主进程:检测配置文件,管理工作进程。
在关闭Nginx时,主进程会检测所有工作进程是否被使用,在没有连接时,才会被结束。
主进程:检测配置文件,管理工作进程;
在关闭nginx时,主进程会检测所有工作进程是否被使用;在没有来凝结时,才会被结束;
配置文件详解
/usr/local/nginx/conf
vim nginx.conf
开启的进程数
worker_processes 1;
events { worker_connections 1024; }
http {
Include包含,将子配置文件引入到主配置文件中,在nginx启动时生效;
mime.types 文件类型—-文件后缀对照表,告诉浏览器以哪种方式打开;
include mime.types;
当文件类型不在mime.types中使用 默认类型,数据流格式;
default_type application/octet-stream;
高效文件传输;默认开启
sendfile on;
单位是秒,客户端连接时时间,超时之后服务器端自动关闭该连接 如果 nginx 守护进程在这个等待的时间里,一直没有收到浏览发过来 http 请求,则关闭这个 http 连接;
高可用:一个进程中断,立刻开启新的进程替补
keepalive_timeout 65;
虚拟主机–网站(后台服务)
server { #监听的端口和主机 listen 80; server_name localhost;#域名(DNS)和主机名 #同一个主机名可以有多个域名 #通过不同域名访问不同的服务; server_name localhost; error_page 500 502 503 504 /50x.html; location / { #建议使用绝对路径,相对路径时相对于Nginx的安装目录; root html; #默认访问的静态页面; index index.php index.html index.htm; } error_page 500 502 503 504 /50x.html; location =/50x.html { root html; }
web服务器状态码
200 成功
3xx 重定向
4xx 本地错误 404 网页丢失[输入错误,找不到要查询的页面]
403没有访问权限
5xx 服务器错误 502(数据库连接问题,内部网络故障或设置问题)
freessl 创建免费的ssl证书;
免费申请域名
http/https
HTTPS(全称:HyperText Transfer Protocol Secure)是HTTP(超文本传输协议)的安全版本。本质上,HTTPS在HTTP的基础上,通过SSL/TLS协议提供了数据加密、完整性保护和身份验证,以确保网络数据传输的安全性。HTTPS被广泛用于互联网上的安全通信,特别是在线交易和处理敏感信息时,本文以Nginx为例部署自签发https证书。
HTTPS的工作原理
HTTPS的工作原理
1.客户端发起HTTPS请求 用户在浏览器中输入网址。连接到服务器的443端口 2.服务端的配置 采用HTTPS的服务器需要由一套数字证书,可以自己制作,也可以向组织申请。 这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。 3.传输证书 这个证书其实就是公钥,里面包含了很多例如证书颁发机构 4.客户端解析证书 先确定证书是否有问题,如果证书有效那么就会生成一个随机值,然后用证书对这个随机值加密,把随机值用锁头锁起来,这样除非有钥匙,否则看不到被锁住的内容。 5.传送加密信息 这部分传送的是用于证书加密的随机值,让服务端得到这个随机值,这样的话服务端和客户端就能依靠这个随机值来进行加密解密了。 6.服务端解密信息 服务端用私钥解密之后,得到了客户端传过来的随机值(私钥),然后把内容通过这个值进行对称加密,也就是将信息和私钥混合在一起进行算法加密,只有知道私钥才能获取到相应内容,这样就能保证数据足够的安全。 7.传输加密后的信息 这部分信息是服务端用私钥加密后的信息,在客户端可以被还原 8.客户端解密信息 客户端用私钥解密服务端传送过来的信息,这样保证了即使信息被截取,第三方也将束手无策。
CA证书签发机构
CA(Certificate Authority,证书授权)是由认证机构服务者签发,是数字签名的技术基础保障,也是网上实体身份的证明,能够证明某一实体的身份及其公钥的合法性,证明该实体与公钥二者之间的匹配关系。 [2]
证书是公钥的载体,证书上的公钥与实体身份相绑定。现,一个是签名证书行的PKI机制一般为双证书机制,即一个实体应具有两个证书、两个密钥对,其中一个是加密证书,一个是签名证书,而加密证书原则上是不能用于签名的。
在电子商务系统中,所有实体的证书都是由证书授权中心即CA中心颁发并签名的。一个完整的、安全的电子商务系统必须建立一个完整的、合理的CA体系。CA体系由证书审批部门和证书操作部门组成。 [2
生成证书
.key: RSA私钥(Private Key),用于加密和解密数据。
.csr: 证书签名请求(Certificate Signing Request),包含了证书申请者的公钥和相关信息,用于向证书颁发机构(CA)请求签发证书。
.crt: 自签名证书(Self-signed Certificate),由私钥持有者自行签名的证书,用于证明公钥的真实性。在这种情况下,私钥持有者也是证书颁发机构。
.pem: Diffie-Hellman参数,用于支持TLS协商过程中的密钥交换,确保通信的机密性和安全性。
实验操作步骤:
cd /usr/local/nginx mkdir ssl # 2.创建本地私有密钥 openssl genrsa -out ssl.key 2048 # 3.按提示输入即可 openssl req -new -key ssl.key -out ssl.csr # 4.创建证书crt openssl x509 -req -days 1460 -in ssl.csr -signkey ssl.key -out ssl.crt # 5.创建证书pem openssl dhparam -out ssl.pem 2048 #把下载的文件传输到桌面 sz ssl.crt (若sz不能用,可以先安装lrzsz)
#接下来修改配置文件 cd /usr/local/nginx/conf vim nginx.conf 第一处: server { listen 80; return 301 https://$host$request_uri; } #在server这里添加这一行内容: return 301 https://$host$request_uri; 第二处: 在server location里面添加: server { listen 443 ssl; ssl_certificate /usr/local/nginx/ssl/ssl.crt; ssl_certificate_key /usr/local/nginx/ssl/ssl.key; ssl_session_timeout 5m; ssl_protocols TLSv1.2; ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!KRB5:!aECDH:!EDH+3DES; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; }
实验效果:
nginx 上如何部署https
1.获取有效的SSL/TLS证书:
2.购买证书:你可以从许多证书颁发机构(CA)购买SSL/TLS证书,例如VeriSign、Comodo、Let's Encrypt等。这些证书的价格和类型(如域名验证DV、组织验证OV、扩展验证EV)不同,适用于不同的需求和预算。 - 免费证书:Let's Encrypt提供了免费的SSL/TLS证书,适用于大多数基本需求,并且支持自动续签。这使得HTTPS更容易为各种网站所采纳。
3.在服务器上配置SSL/TLS证书:
SSL证书:安全套接字层证书,用于互联网上保护数据传输的安全;
4.证书的安装和配置过程会根据你的服务器软件(如Apache、Nginx、IIS等)而异。通常,你需要将获取的证书(通常是一个.crt文件)和私钥(一个.key文件)安装到服务器上,并且可能需要安装证书颁发机构的中间证书。 - 配置过程中,你需要修改服务器的配置文件,指定证书文件和私钥文件的位置,并且可能需要指定使用的加密套件和协议版本等安全设置。
5.确保网站资源通过HTTPS加载:
6.确保网站上所有的资源(如图片、脚本、样式表等)都通过HTTPS而非HTTP加载,避免“混合内容”问题,这可能会导致浏览器安全警告。 - 对于外部资源,确保链接使用HTTPS,或者考虑将它们托管在你自己的服务器上。
7.重定向HTTP请求到HTTPS:
8.配置服务器自动将所有HTTP请求重定向到HTTPS,确保用户即使输入了HTTP URL也能通过安全的HTTPS连接访问网站。 - 在服务器配置中实现重定向通常很简单,例如在Apache服务器上,你可以使用.htaccess
文件来设置重定向规则。
9.更新网站配置和第三方服务:
10.更新网站的内部链接,确保它们使用HTTPS。 - 如果你使用了第三方服务(如社交媒体登录、在线支付网关等),请确保它们支持HTTPS,并且配置正确。
11.测试HTTPS配置:
12.在全面启用HTTPS之前,使用工具如Qualys SSL Labs的SSL Server Test进行全面测试,确保证书正确安装,且服务器配置符合最佳实践。
Nginx部署本地生成https(左老师笔记)
本地生成在没有域名的情况下基于ip生成,如果存在域名可以基于certbot 生成免费证书
1.检查nginx是否支持配置
(在配置ssl证书之前,要确保你的nginx已经安装了ssl模块,一般情况下自己安装的nginx都是不存在ssl模块的。)
进入/usr/local/nginx/sbin中,执行
./nginx -V
nginx -V(大写)小写只显示版本;
如果出现 (configure arguments: --with-http_ssl_module), 则已安装(下面的步骤可以跳过,直接进行第5步;
2.证书生成
解释ubuntu: sudo apt-get install libssl-dev centos: yum install openssl yum install openssl-devel
3.生成证书
-
.key: RSA私钥(Private Key),用于加密和解密数据。
-
.csr: 证书签名请求(Certificate Signing Request),包含了证书申请者的公钥和相关信息,用于向证书颁发机构(CA)请求签发证书。
-
.crt: 自签名证书(Self-signed Certificate),由私钥持有者自行签名的证书,用于证明公钥的真实性。在这种情况下,私钥持有者也是证书颁发机构。
-
.pem: Diffie-Hellman参数,用于支持TLS协商过程中的密钥交换,确保通信的机密性和安全性。
解释# 1.进入证书目录 cd /etc/nginx/sslkey # 2.创建本地私有密钥 openssl genrsa -out ssl.key 2048 # 3.按提示输入即可 openssl req -new -key ssl.key -out ssl.csr # 4.创建证书crt openssl x509 -req -days 1460 -in ssl.csr -signkey ssl.key -out ssl.crt # 5.创建证书pem openssl dhparam -out ssl.pem 2048
4.Nginx 配置
解释server { listen 80; return 301 https://$host$request_uri; } server { listen 443 ssl; # ssl证书的pem文件路径 ssl_certificate /etc/nginx/sslkey/ssl.crt; #ssl 证书的key文件路径 ssl_certificate_key /etc/nginx/sslkey/ssl.key; ssl_session_timeout 5m; ssl_protocols TLSv1.2; ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!KRB5:!aECDH:!EDH+3DES; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; }
检查配置项,并重启
nginx -t nginx -s reload
自签名证书是一种由服务器管理员自己创建的证书,而不是由 CA 颁发的。这种证书提供了相同级别的加密,但不提供第三方验证身份的信任。自签名证书通常用于内部网络、测试环境或其他不需要公众信任的场景。使用自签名证书的主要问题是浏览器会警告用户这个证书不受信任,因为它没有由已知的 CA 颁发。用户需要手动添加一个例外或信任该证书,才能访问网站。
nginx配置https服务(网络资源)
前置条件:
在配置https之前请确保下面的步骤已经完成
服务器已经安装nginx并且通过http可以正常访问
不会安装nginx的可以参考下这篇文章:Linux安装nginx(超详细)
拥有ssl证书,没有的可以去阿里购买或者免费申请一年
如果以上条件都满足了,接下来开始配置https
第一步:Nginx的ssl模块安装
在配置ssl证书之前,要确保你的nginx已经安装了ssl模块,一般情况下自己安装的nginx都是不存在ssl模块的。
这里先检查下自己是否存在ssl模块:
进入到你的nginx安装目录下面,我的目录是在(/usr/local/nginx),如果你的nginx安装步骤和上面的文章一致的话,那你的目录和我应该是一致的
进入到目录的sbin目录下,输入
#注意这里是大写的V,小写的只显示版本号 ./nginx -V
如果出现 (configure arguments: --with-http_ssl_module), 则已安装(下面的步骤可以跳过,直接进行第二步)。
一般情况下都是不存在ssl模块的,接下来进入到你的解压缩后的nginx目录,注意这里不是nginx安装目录,是解压缩后的目录,我的是在(/root/nginx),进入目录后,输入
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
接下来执行
make #切记不要执行make install,否则会重新安装nginx
上述操作执行完成以后,你的目录下会出现objs文件夹,文件夹内存在nginx文件,如图:
接下来使用新的nginx文件替换掉之前安装目录sbin下的nginx,注意这里的替换的时候可以先将之前的文件备份下,停掉nginx服务
./nginx -s stop #停止nginx服务 #替换之前的nginx cp /root/nginx/objs/nginx /usr/local/nginx/sbin
成功之后,进入到nginx安装目录下,查看ssl时候成功
#注意这里是大写的V,小写的只显示版本号 ./nginx -V #可以看到这里出现了configure arguments: --with-http_ssl_module 证明已经安装成功
提示:这里替换后在执行 -V命令如果提示权限不足,先给这个nginx文件提升下权限
我是用的是finalshell连接工具,直接右键就可以修改权限了,当然,也可以通过指令修改,如下:
chmod 111 nginx
第二步:配置ssl证书
解压缩下载好的证书(证书一般是pem文件和key文件,这里名字可以随便改)
将下载好的证书上上传到服务器,我将证书放在了root目录下的card文件夹
#在root目录下创建card文件夹 cd /root mkdir card
第三步:进行nginx.conf配置
进入nginx.conf文件下
cd /usr/locla/nginx/conf #修改nginx.conf文件 vim nginx.conf
打开之后文件内容如图
可以将没用的东西都删除掉,删除的时候注意,括号要对应起来。
然后进行配置,输入:
解释http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { #监听443端口 listen 443; #你的域名 server_name huiblog.top; ssl on; #ssl证书的pem文件路径 ssl_certificate /root/card/huiblog.top.pem; #ssl证书的key文件路径 ssl_certificate_key /root/card/huiblog.top.key; location / { proxy_pass http://公网地址:项目端口号; } } server { listen 80; server_name huiblog.top; #将请求转成https rewrite ^(.*)$ https://$host$1 permanent; } }
注意:这里需要在安全组中开放443端口。
第四步:重启nginx
ok,如果上述步骤都完成了,没有问题,接下来只需要重启nginx服务即可。
进入sbin目录下,输入
./nginx -s reload ./nginx -s stop ./nginx
无提示信息的话,就大功告成了。
ok,配置https到此就结束了,
4.1申请https CA证书
1.购买域名
1)然后 DNS域名解析
2)域名—–IP
2.备案
服务器在大陆地区,域名需要备案(20个工作日)
3.根据域名申请CA证书
1)购买CA证书
2)通过域名或公网IP申请
3)通过DNS验证域名有效性,验证通过后才能申请
4)配置web服务器,nginx/apache/IIS中HTTPS功能;
如何购买域名
Gitee软件
可以下载同步、回滚,版本控制;
cd /d;
git clone https
静态网页搭建
https://gitee.com
游戏网站搭建
第一步:下载好gitee这个软件
第二步:局域网内:在左老师网站下载 “小游戏压缩包”
外网:“码云–开源”下载游戏源码
第三步:在虚拟机下载并解压
wget 加下载地址
zip格式,所以用unzip解压;
第四步:下载好之后 进nginx配置文件修改路径;
vim nginx.conf
root /data/game
静态网站和动态网站的区别
静态网站:修改的话,需要修改源代码;
动态网站:修改数据库即可;
静态网站是指在服务器上预先创建好的网页,内容固定不变。这意味着无论用户的请求如何,网页都保持不变。一旦静态网站创建完成,它们就可以直接在用户的浏览器上显示,不需要进行任何额外的处理。这种网站通常由HTML、CSS和JavaScript等静态文件组成。由于内容不变,静态网站的加载速度很快,适用于展示简单的信息、产品或服务。但是,静态网站的交互性和个性化程度较低,无法根据用户的需求和操作动态地显示内容。
动态网站**则具有更高的交互性和个性化程度。与静态网站不同,动态网站的内容是根据用户的请求和操作生成的。动态网站通常使用服务器端脚本语言(如PHP、Python或Ruby)和数据库来存储和处理数据。当**用户访问动态网站时,服务器会根据用户的请求从数据库中检索和生成网页内容。这使得动态网站能够根据用户的登录状态、个人偏好和所在位置等信息显示相关内容,提供更加个性化的服务。通过动态网站,用户可以进行交互操作,例如提交表单、评论文章或进行在线购物等。
总结一下,静态网站和动态网站的区别主要在于内容的生成和显示方式。静态网站在服务器上预先生成并存储网页,内容不随用户的请求而变化,加载速度快;
而动态网站根据用户的请求和操作从数据库中生成内容,具有更高的交互性和个性化程度。两者各有优劣,可根据不同的需求选择使用
一键安装(Oneinstack)
4.2安装tomcat
1.局域网内,在老师网站下载压缩包 http://192.168.3.200/Software/apache-tomcat-9.0.87.tar.gz
2.在虚拟机上安装
wget http://192.168.3.200/Software/apache-tomcat-9.0.87.tar.gz
【安装之前/之后安装java】
3.解压,解压到 /opt目录下;
tar -zxvf apache-tomcat-9.0.87.tar.gz -C /opt/
4.查看
5.cd /opt/
cd tomcat1
ls
cd bin
sh startup.sh
netstat -antp | grep java
nginx反向代理
反向代理的实现
location / {
#针对静态网站,php的网站
index index.php index.html index.htm;
#定义首页索引文件的名称 proxy_pass http://192.168.8.58 ;
#请求转向mysvr 定义的服务器列表 }
反向代理的本质就是一个中介服务。
nginx的反向代理和负载均衡(合理分配)是隧道模式。所有的请求和响应都是要经过nginx的转发
有多台服务器时,使用负载均衡,进行业务的分发。
轮询(按照顺序依次分发给服务器)
加权轮询(根据权重,来分配业务量)
动态网站一般有session和cookie: session(建立会话,服务器端会存放一个登录记录,返回sessionid)
cookie(浏览器的缓存,sessionid)
ip_hash 根据IP地址进行hash运算,根据hash值来匹配一台服务器,每次访问的都是之前访问的服务器;
url_hash 根据访问的url进行hash运算,每次访问的都是之前访问的服务器;;
HTTP状态码
200访问成功
403浏览器没有访问权限,后端目录设置问题(权限,路径),selinx拦截;
404网络路径不存在,浏览器地址栏写错了,服务端的url修改了;
502后端服务报错了,常见原因:数据库连接失败,后台程序崩溃等;
302临时重定向,网址临时跳转;
301永久重定向,网页的强制跳转;
跳转百度:
server { listen 80; server_name localhost;
return 301 https: //www.baidu.com;
}
server { listen 80; server_name localhost; #反向代理:添加这句 location / { proxy_pass http://127.0.0.1:8080 #return 301 https: //$host$request_uri; } } #return 返回新的网页
还需要再下面添加:
server {
listen 127.0.0.1:8080;
index index.html index.hml;
location /{
root /data/game;
}
}
负载均衡的配置
nginx负载均衡和反向代理的区别有:1、实现负载均衡一定要需要反向代理;2、反向代理主要是缓存东西,而负载均衡则是减少高并发情况;3、负载均衡是做反向代理的目的之一。
下面是详细介绍:
负载均衡需要通过反向代理来实现。
反向代理就是指nginx作为前端服务器,将请求转发到后端,再将后端服务器的结果,返回给客户端。
它在中间做了一个代理服务器的角色。
负载均衡对反向代理增加了一些策略,因为后端是多台服务器,nginx会根据设定的策略将请求转发给一个相对空闲的服务器,对负载进行分流,减轻服务器压力。
负载均衡方式一:
反向代理的基础上:添加到server外面,会按IP依次访问:
upstream game {
server 127.0.0.1:8080;
server 192.168.8.70:8080;
server 192.168.8.80:8080;
}
负载均衡方式二:加权轮询
upstream game {
server 127.0.0.1:8080 weight=5;
server 192.168.8.70:8080 weight=1;
server 192.168.8.80:8080 weight=1;
}
负载均衡方式三–ip_hash:
upstream game {
ip_hash
server 127.0.0.1:8080;
server 192.168.8.70:8080;
server 192.168.8.80:8080;
}
其他参数
加参数down,(想要修复某台主机,不想被访问时),可以down掉:
upstream game {
server 127.0.0.1:8080 weight=5;
server 192.168.8.70:8080 weight=1 down;
server 192.168.8.80:8080 weight=1;
}
备份主机,其他主机存活时不会被访问;除非其他机器都挂掉,才会被访问到;
upstream game {
server 127.0.0.1:8080;
server 192.168.8.70:8080 backup;
server 192.168.8.80:8080;
}
nginx优化
nginx速查手册
Nginx功能速查手册
这个 nginx 快速参考常用命和配置使用清单。
由于使用root用户操作太过危险,此手册使用普通用户sudo操作。
yum安装Nginx
sudo yum install yum-utils # 配置Nginx官方的Yum源。 sudo vim /etc/yum.repos.d/nginx.repo # 稳定版 [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 module_hotfixes=true # 测试版 [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 module_hotfixes=true
sudo yum install nginx
Docker 安装
docker run --name myNginx \ -p 80:80 \ -v /data/www/html:/usr/share/nginx/html \ -d nginx
配置入门
服务管理
sudo systemctl status nginx # nginx当前状态 sudo systemctl reload nginx # 重新加载 nginx sudo systemctl restart nginx # 重启nginx sudo nginx -t # 检查语法 sudo nginx # 启动 sudo nginx -s reload # 重启 sudo nginx -s stop # 关闭进程 sudo nginx -s quit # 平滑关闭nginx sudo nginx -V # 查看nginx的安装状态,
简单代理
location / { # 反向代理地址 proxy_pass http://127.0.0.1:3000; # 代理重定向 proxy_redirect off; # 代理请求头 proxy_set_header Host $host; }
全局变量
变量 | 说明 |
---|---|
$args | 这个变量等于请求行中的参数,同 $query_string |
$remote_port | 客户端的端口 |
$content_length | 请求头中的 Content-length 字段 |
$remote_user | 已经经过 Auth Basic Module 验证的用户名 |
$content_type | 请求头中的 Content-Type 字段 |
$request_filename | 当前请求的文件路径,由 root 或alias指令与URI请求生成 |
$document_root | 当前请求在 root 指令中指定的值 |
$scheme | HTTP方法(如http,https) |
$host | 请求主机头字段,否则为服务器名称 |
$hostname | 主机名 |
$http_user_agent | 客户端agent 信息 |
$http_cookie | 客户端cookie 信息 |
$server_protocol | 请求使用的协议,通常是HTTP/1.0 或HTTP/1.1 |
$server_addr | 服务器地址,在完成一次系统调用后可以确定这个值 |
$server_name | 服务器名称 |
$server_port | 请求到达服务器的端口号 |
$limit_rate | 这个变量可以限制连接速率 |
$request_method | 客户端请求的动作,如 GET/POST |
$request_uri | 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz |
$remote_addr | 客户端的IP地址 |
$uri | 不带请求参数的当前URI,$uri 不包含主机名,如 /foo/bar.html |
$document_uri | 与 $uri 相同 |
$nginx_version | nginx 版本 |
监听端口
server { listen 80; # 标准 HTTP 协议 listen 443 ssl; # 标准 HTTPS 协议 listen 443 ssl http2; # 对于 http2 listen [::]:80; # 使用 IPv6 在 80 上收听 # 仅收听使用 IPv6 listen [::]:80 ipv6only=on; }
域名 (server_name)
server { # 监听 example.com server_name example.com; # 监听多个域 server_name example.com www.example.com; # 监听所有子域 server_name *.example.com; # 监听所有顶级域 server_name example.*; # 监听未指定的主机名(监听 IP 地址本身) server_name ""; }
负载均衡(简单实例)
# 默认使用轮训 upstream test1 { server 0.0.0.0:3000; server 0.0.0.0:4000; server 127.155.142.421; }
负载均衡(权重)
upstream test2 { server localhost:8080 weight=9; server localhost:8081 weight=1; }
upstream ip_hash
upstream test3 { ip_hash; server localhost:8080; server localhost:8081; }
解决负载均衡 session
的问题
upstream fair
upstream test4 { fair; server localhost:8080; server localhost:8081; }
响应时间短的优先分配
server 可选参数
:- | :- |
---|---|
weight | 访问权重数值越高,收到请求越多 |
fail_timeout | 指定的时间内必须提供响应 |
max_fails | 尝试失败服务器连接的最大次数 |
down | 标记一个服务器不再接受任何请求 |
backup | 有服务器宕机,标记的机器接收请求 |
配置示例
upstream test5 { server 127.0.0.1:83 weight=9; # 权重 server 127.0.0.1:83 weight=1; # 权重 # 失败超时时间 server 127.0.0.1:83 max_fails=3; server 127.0.0.1:83 weight=3 down; }
upstream url_hash
upstream test6 { hash $request_uri; hash_method crc32; server localhost:8080; server localhost:8081; }
按访问url的hash结果来分配请求
upstream keepalive
upstream test7 { server 127.0.0.1:11211; server 10.0.0.2:11211; keepalive 32; }
激活缓存以连接到上游服务器
子文件夹中的代理
location /folder/ {# / 很重要! proxy_pass http://127.0.0.1:3000/; # / 很重要! proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
反向代理
基础
server { listen 80; server_name example.com; location / { proxy_pass http://0.0.0.0:3000; # 其中 0.0.0.0:3000 是绑定在 # 0.0.0.0端口3000 列表上的 Node.js 服务器 } }
基础 + (upstream)
upstream test1 { server 0.0.0.0:3000; # 其中 0.0.0.0:3000 是绑定在 # 0.0.0.0端口3000 列表上的 Node.js 服务器 } server { listen 80; server_name example.com; location / { proxy_pass http://test1; } }
升级连接(适用于支持 WebSockets 的应用程序)
upstream test1 { server 0.0.0.0:3000; } server { listen 80; server_name example.com; location / { proxy_pass http://test1; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; } }
适用于 Node.js、Streamlit、Jupyter 等
静态资源(传统 Web 服务器)
server { listen 80; server_name example.com; root /data/website; # root /path/to/website/ 示例,如果里面没有'root',它将寻找 /data/website/index.html location / { } location /images/ { /data/website/images; } location /videos/ { root /data/www/media; } }
HTTPS 协议
大多数 SSL 选项取决于您的应用程序做什么或需要什么
server { listen 443 ssl http2; server_name example.com; # 开启ssl功能 ssl on; ssl_certificate /path/to/ssl.crt; ssl_certificate_key /path/to/ssl.key; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/fullchain.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; add_header Strict-Transport-Security max-age=15768000; }
重定向(301永久)
将 www.example.com[1] 重定向到 example.com
server { listen 80; server_name www.example.com; return 301 http://example.com$request_uri; }
将 http 重定向到 https
server { listen 80; server_name example.com; return 301 https://example.com$request_uri; }
重定向(302临时)
server { listen 80; server_name yourdomain.com; return 302 http://otherdomain.com; }
永久重定向到 HTTPS 安全域
server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; }
重定向参数
:- | :- |
---|---|
permanent | 永久性重定向。日志中的状态码为 301 |
redirect | 临时重定向。日志中的状态码为 302 |
HTTP 请求端真实的IP
location / { proxy_set_header X-Forwarded-For $remote_addr; }
示例
websocket 的代理 keepalive
# Upstreams upstream backend { server 127.0.0.1:3000; keepalive 5; } # HTTP Server server { server_name your_hostname.com; error_log /var/log/nginx/rocketchat.access.log; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; proxy_set_header X-Forward-Proto http; proxy_set_header X-Nginx-Proxy true; proxy_redirect off; } }
Apache 的反向代理
server { server_name domain.tld; access_log /log/domain.tld.access.log; error_log /log/domain.tld.error.log; root /var/www/domain.tld/htdocs; # 将请求传递给 Apache 后端 location / { proxy_pass http://backend; } # 使用后备处理静态文件 location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|woff2|ttf|m4a|mp4|ttf|rss|atom|jpe?g|gif|cur|heic|png|tiff|ico|zip|webm|mp3|aac|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|swf|webp)$ { add_header "Access-Control-Allow-Origin" "*"; access_log off; log_not_found off; expires max; try_files $uri @fallback; } # 如果找不到文件,则回退以将请求传递给 Apache location @fallback { proxy_pass http://backend; } }
Gitlab 的反向代理
server { #侦听的80端口 listen 80; server_name git.example.cn; location / { proxy_pass http://localhost:3000; # 以下是一些反向代理的配置可删除 proxy_redirect off; # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header Host $host; client_max_body_size 10m; # 允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; # 缓冲区代理缓冲用户端请求的最大字节数 proxy_connect_timeout 300; # nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 300; # 后端服务器数据回传时间(代理发送超时) proxy_read_timeout 300; # 连接成功后,后端服务器响应时间(代理接收超时) # 设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffer_size 4k; # proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_buffers 4 32k; # 高负荷下缓冲大小(proxy_buffers*2) proxy_busy_buffers_size 64k; } }
重定向整个网站
server { server_name old-site.com; return 301 $scheme://new-site.com$request_uri; }
重定向单页
server { location = /oldpage.html { return 301 http://example.org/newpage.html; } }
重定向整个子路径
location /old-site { rewrite ^/old-site/(.*) http://example.org/new-site/$1 permanent; }
负载均衡
upstream example { ip_hash; # upstream的负载均衡,weight是权重,可以根据机器配置定义权重。 # weigth参数表示权值,权值越高被分配到的几率越大。 server 192.168.122.11:8081 ; server 127.0.0.1:82 weight=3; server 127.0.0.1:83 weight=3 down; server 127.0.0.1:84 weight=3; max_fails=3 fail_timeout=20s; server 127.0.0.1:85 weight=4; keepalive 32; } server { #侦听的80端口 listen 80; server_name git.example.cn; location / { # 在这里设置一个代理,和 upstream 的名字一样 proxy_pass http://example; } }
内容缓存
允许浏览器基本上永久地缓存静态内容。Nginx 将为您设置 Expires 和 Cache-Control 头信息
location /static { root /data; expires max; }
如果要求浏览器永远不会缓存响应(例如用于跟踪请求),请使用 -1
location = /empty.gif { empty_gif; expires -1; }
跨域问题
server { listen 80; server_name api.xxx.com; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET,POST,HEAD'; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; } }
重定向 URI 来解决跨域问题
upstream test { server 127.0.0.1:8080; server localhost:8081; } server { listen 80; server_name api.xxx.com; location / { root html; # 去请求../html文件夹里的文件 index index.html index.htm; # 首页响应地址 } # 用于拦截请求,匹配任何以 /api/开头的地址, # 匹配符合以后,停止往下搜索正则。 location ^~/api/{ # 代表重写拦截进来的请求,并且只能对域名后边的除去传递的参数外的字符串起作用 # 例如www.a.com/api/msg?meth=1&par=2重写,只对/api/msg重写。 # rewrite后面的参数是一个简单的正则 ^/api/(.*)$, # $1代表正则中的第一个(),$2代表第二个()的值,以此类推。 rewrite ^/api/(.*)$ /$1 break; # 把请求代理到其他主机 # 其中 http://www.b.com/ 写法和 http://www.b.com写法的区别如下 # 如果你的请求地址是他 http://server/html/test.jsp # 配置一:http://www.b.com/ 后面有“/” # 将反向代理成 http://www.b.com/html/test.jsp 访问 # 配置一:http://www.b.com 后面没有有“/” # 将反向代理成 http://www.b.com/test.jsp 访问 proxy_pass http://test; # 如果 proxy_pass URL 是 http://a.xx.com/platform/ 这种情况 # proxy_cookie_path应该设置成 /platform/ / (注意两个斜杠之间有空格)。 proxy_cookie_path /platfrom/ /; # 设置 Cookie 头通过 proxy_pass_header Set-Cookie; } }
跳转到带 www 的域上面
server { listen 80; # 配置正常的带www的域名 server_name www.zuolaoshi.cn; root /home/www/wabg/download; location / { try_files $uri $uri/ /index.html =404; } } server { # 将不带 www 的 zuolaoshi.cn # 永久性重定向到 https://www.zuolaoshi.cn server_name zuolaoshi.cn; rewrite ^(.*) https://www.zuolaoshi.cn$1 permanent; }
代理转发
upstream server-api { # api 代理服务地址 server 127.0.0.1:3110; } upstream server-resource { # 静态资源 代理服务地址 server 127.0.0.1:3120; } server { listen 3111; server_name localhost; # 这里指定域名 root /home/www/server-statics; # 匹配 api 路由的反向代理到API服务 location ^~/api/ { rewrite ^/(.*)$ /$1 break; proxy_pass http://server-api; } # 假设这里验证码也在API服务中 location ^~/captcha { rewrite ^/(.*)$ /$1 break; proxy_pass http://server-api; } # 假设你的图片资源全部在另外一个服务上面 location ^~/img/ { rewrite ^/(.*)$ /$1 break; proxy_pass http://server-resource; } # 路由在前端,后端没有真实路由, # 路由不存在的 404 状态的页面返回 /index.html # 使用场景,用在 React/Vue项目没有真实路由 location / { try_files $uri $uri/ /index.html =404; # 空格很重要 ^ } }
屏蔽 IP
可以放到 http
, server
, location
, limit_except
语句块
include blockip.conf;
在 blockip.conf
里面输入内容,如:
deny 165.91.122.67; deny IP; # 屏蔽单个 ip 访问 allow IP; # 允许单个 ip 访问 deny all; # 屏蔽所有 ip 访问 allow all; # 允许所有 ip 访问 deny 123.0.0.0/8; # 屏蔽整个段即从 123.0.0.1 到 123.255.255.254 访问的命令 deny 124.45.0.0/16; # 屏蔽IP段即从 123.45.0.1 到 123.45.255.254 访问的命令 deny 123.45.6.0/24; # 屏蔽IP段即从 123.45.6.1 到 123.45.6.254 访问的命令 # 如果你想实现这样的应用,除了几个IP外,其他全部拒绝 allow 1.1.1.1; allow 1.1.1.2; deny all;
强制将 http 重定向到 https
server { listen 80; server_name example.com; rewrite ^ https://$http_host$request_uri? permanent; # 强制将 http 重定向到 https # 在错误页面和“服务器”响应头字段中启用或禁用发射nginx版本。 防止黑客利用版本漏洞攻击 server_tokens off; }
代理转发连接替换
location ^~/api/upload { rewrite ^/(.*)$ /wfs/v1/upload break; proxy_pass http://wfs-api; }
将地址 /api/upload
替换为 /wfs/v1/upload
爬虫 User-Agent 过滤
location / { if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp") { return 503; } # 正常处理 # ... }
图片防盗链
location ~* \.(gif|jpg|png|swf|flv)$ { root html; valid_referers none blocked *.nginx.com; if ($invalid_referer) { rewrite ^/ www.nginx.cn; # return 404; } }
虚拟目录配置
location /img/ { alias /var/www/image/; } # 访问 /img/ 目录里面的文件时, # 会自动去 /var/www/image/ 目录找文件 location /img/ { root /var/www/image; } # 访问 /img/ 目录下的文件时, # 会去 /var/www/image/img/ 目录下找文件
屏蔽文件目录
通用备份和归档文件
location ~* "\.(old|orig|original|php#|php~|php_bak|save|swo|aspx?|tpl|sh|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" { deny all; }
拒绝访问 .git
和 .svn
目录
location ~ (.git|.svn) { deny all; }
拒绝访问隐藏文件和目录
location ~ /\.(?!well-known\/) { deny all; }
防盗图配置
location ~ \/public\/(css|js|img)\/.*\.(js|css|gif|jpg|jpeg|png|bmp|swf) { valid_referers none blocked *.jslite.io; if ($invalid_referer) { rewrite ^/ http://zuolaoshi.cn/piratesp.png; } }
ulimit 不继承系统设置的问题
-
• 执行 status 命令
sudo service nginx status
执行 status 命令,看到 Loaded: loaded (/lib/systemd/system/nginx.service;...) 这一行的nginx.service 文件位置
-
• 打开 service 文件
sudo vim /lib/systemd/system/nginx.service
-
• 修改 service 中的配置 找到
[Service]
部分,将LimitNOFILE=65535
添加到该部分[Service] ... LimitNOFILE=65535 ...
解决 systemctl
管理的 ulimit 不继承系统设置的问题
Gzip 配置
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 "msie6";
阻止常见攻击
base64编码的网址
location ~* "(base64_encode)(.*)(\()" { deny all; }
javascript eval() url
location ~* "(eval\()" { deny all; }
使网站不可索引
add_header X-Robots-Tag "noindex"; location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }