Nginx教程
Nginx教程
1.安装
1.1 官网
1.2 版本选择
一般选择稳定版
1.3 安装
#下载
wget http://nginx.org/download/nginx-1.24.0.tar.gz
#解压
tar -zxvf nginx-1.24.0.tar.gz
#进入解压后的文件夹
cd nginx-1.24.0
#安装依赖
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
#编译安装
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make && make install
#--prefix用来指定安装路径.--with-http_ssl_module是让它支持https
1.4 防火墙
#关闭
systemctl stop firewalld
#或者开放端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload
#这里由于学习比较麻烦建议直接关闭
systemctl stop firewalld
systemctl disable firewalld
1.5 管理
进入到执行文件路径,这里是/usr/local/nginx/sbin/
#启动
./nginx
#快速停止
./nginx -s stop
#优雅的关闭,在退出前完成已经接受的连接请求
./nginx -s quit
#重新加载配置
./nginx -s reload
#检查nginx配置是否正确
./nginx -t
1.6 注册成系统服务(可选)
vi /usr/lib/systemd/system/nginx.service
注意要根据自己的情况做修改
[Unit]
Description=nginx - web server
After=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=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载系统服务
systemctl daemon-reload
启动服务
systemctl start nginx
#如果启动异常使用“ps -aux|grep nginx”找到进程并杀掉再试试
没有异常的话就可以删除软件包和解压后的软件包了
2.目录结构及文件功
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp # POST 大文件暂存目录
├── conf # Nginx所有配置文件的目录
│ ├── fastcgi.conf # fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件
│ ├── fastcgi_params # fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf #这是Nginx默认的主配置文件,日常使用和修改的文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html # 错误页面优雅替代显示文件,例如出现502错误时会调用此页面
│ └── index.html # 默认的首页文件
├── logs # Nginx日志目录
│ ├── access.log # 访问日志文件
│ ├── error.log # 错误日志文件
│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp # 临时目录
├── sbin # Nginx 可执行文件目录
│ └── nginx # Nginx 二进制可执行程序
├── scgi_temp # 临时目录
└── uwsgi_temp # 临时目录
3.默认配置文件
egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf
worker_processes 1; #启动的worker进程数
events {
worker_connections 1024; #每个worker进程的连接数
}
http {
include mime.types; #include是引入关键字,这里引入了mime.types这个配置文件
default_type application/octet-stream; #mime.types未定义的,使用默认格式application/octet-stream
sendfile on; #打开sendfile,用户请求的数据不用再加载到nginx的内存中,而是直接发送
keepalive_timeout 65; #长链接超时时间
server { #一个nginx可以启用多个server(虚拟服务器)
listen 80; #监听端口80
server_name localhost; #接收的域名
location / {
root html; #根目录指向html目录
index index.html index.htm; #域名/index 指向 index.html index.htm文件
}
error_page 500 502 503 504 /50x.html; #服务器错误码为500 502 503 504,转到"域名/50x.html"
location = /50x.html { #指定到html文件夹下找/50x.htm
root html;
}
}
}
sendfile
打开sendfile,用户请求的数据不用再加载到nginx的内存中,而是直接发送
启动nginx并访问测试
4.虚拟主机
4.1配置主机域名解析
这里由于在本地做的测试,没有域名,需要在宿主机配置让其可以域名解析,方便后续测试。
在宿主机上找到"C:\Windows\System32\drivers\etc"下面的hosts文件,这里由于不能直接编辑,需要把它拷贝到其它地方编辑之后再覆盖到源路径。

完成之后ping一下域名或者使用浏览器访问测试。
解析成功,公网或生产环境请通过合规途径购买域名。
4.2虚拟主机配置
4.2.1创建多个站点目录
#创建站点目录site01
mkdir -p /www/{site01,site02}
#添加site01首页
vi /www/site01/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>site01</title>
</head>
<body>
this is site01!
</body>
</html>
#添加site02首页
vi /www/site02/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>site02</title>
</head>
<body>
this is site02!
</body>
</html>
4.2.2修改配置文件
注意server部分
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#虚拟主机site01
server {
listen 81; #监听端口
server_name localhost;
location / {
root /www/site01; #站点目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#虚拟主机site02
server {
listen 82; #监听端口
server_name localhost;
location / {
root /www/site02; #站点目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
重启之后访问测试
systemctl restart nginx
#或者
systemctl reload nginx
5.nginx代理
5.1正向代理
理解:
正向代理可以理解为「客户端」的代理。它的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我,从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
结论:
正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。就像要访问google用vpn代理FQ去访问(用户知道要访问真正的服务器)
5.2反向代理
理解:
反向代理可以理解为「服务器」的代理,例用户访问 https://www.baidu.com/readme,但https://www.baidu.com上并不存在readme页面,他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户,但用户并不知情,这里所提到的 https://www.baidu.com 这个域名对应的服务器就设置了反向代理功能。
结论:
反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。(用户不知道要访问真正的服务器)
6.反向代理与负载均衡
反向代理:这种代理方式叫做,隧道代理。有性能瓶颈,因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要。
负载均衡:把请求,按照一定算法规则,分配给多台业务服务器(即使其中一个坏了/维护升级,还有其他服务器可以继续提供服务)。
7.反向代理
nginx.conf配置文件
启用proxy_pass,root和index字段就会失效
proxy_pass后的地址必须写完整 https://xxx
,要支持https,前面安装编译的时候要安装openssl模块
当访问localhost时(Nginx服务器),网页打开的是https://xxx
(应用服务器),网页地址栏写的还是本机域名
如这里,代理到百度:
添加配置:"proxy_pass https://www.baidu.com;"
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 / {
proxy_pass https://www.baidu.com; #代理到百度
# root html;
# index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
重新加载配置文件后访问测试:
8.负载均衡
这里由于演示需要克隆准备其它被代理的服务器:
角色 | ip | 站点 |
---|---|---|
代理服务器(guojie.com) | 172.16.1.2 | I am a proxy site! |
web01 | 172.16.1.3 | I am site 1! |
web02 | 172.16.1.4 | I am site 2! |
分别添加在对应主机上准备好站点:
8.1定义地址别名
使用upstream定义一组地址【在server字段下】
访问guojie.com,访问都会代理到172.16.1.3
和172.16.1.4
这两个地址之一,这里可以写域名也可以写对应地址,每次访问这两个地址轮着切换(后面讲到,因为默认权重相等)
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream hosts {
server 172.16.1.3:80; #如果是80端口,可以省略不写
server 172.16.1.4:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://hosts; #代理到上面定义的别名列表
# root html;
# index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
此时访问guojie.com将会被代理到site1和site2上,而且是轮流的,应为权重(后面会讲)一样。
8.2权重
访问使用哪个地址的权重,权重高的被访问概率也大,不设置默认是1,这里它会按照172.16.1.3:80访问一次、172.16.1.4:80访问两次这样循环下去。
upstream httpds{
server 172.16.1.3:80 weight=1;
server 172.16.1.4:80 weight=2;
}
8.3关闭
添加down,对应主机将被停止使用,这里将只能代理到172.16.1.4:80。
upstream httpds{
server 172.16.1.3:80 weight=1 down;
server 172.16.1.4:80 weight=2;
}
8.4备用机
如果出现故障,无法提供服务,就用使用backup的这个机器,
upstream httpds{
server 172.16.1.3:80 weight=1;
server 172.16.1.4:80 weight=2 backup;
}
9.证书
9.1证书配置
生成证书:这里使用openssl生成自签名证书于测试,生产环境请通过合法渠道购买获取。
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
#会要求输入密码、国家、省份等等一些信息,测试用的胡乱输入就行
把它放到nginx配置文件夹里:
mkdir /usr/local/nginx/conf/SSL
mv cert.pem /usr/local/nginx/conf/SSL/
mv key.pem /usr/local/nginx/conf/SSL/
在nginx配置文件里配置
server {
listen 443 ss1;
ss1 certificate xxx.pem; #这里是证书路径
ss1_ certificate_key xxx.key #这里是私钥路径
}
这里可以配置成如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream hosts {
server 172.16.1.3:80 weight=1;
server 172.16.1.4:80 weight=2;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://hosts; #代理到上面定义的别名列表
# root html;
# index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 443 ssl;
ssl_certificate /usr/local/nginx/conf/SSL/cert.pem; #这里是证书路径
ssl_certificate_key /usr/local/nginx/conf/SSL/key.pem; #这里是私钥路径
server_name localhost;
location / {
proxy_pass http://hosts; #代理到上面定义的别名列表
# root html;
# index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
此时重启之后再次访问测(会要求你输入证书的PEM pass phrase):
ok!!!
9.2把http请求重定向到https
只需要添加一项配置“return 301 https://$host$request_uri;”即可,这样你访问"http://guojie.com"它将帮你重定向到"https://guojie.com"
server {
listen 80;
server_name localhost; # 指定您的域名
# 配置HTTP到HTTPS的重定向
return 301 https://$host$request_uri;
}
9.3证书格式装换
.key 转换成 .pem:
openssl rsa -in temp.key -out temp.pem
.crt 转换成 .pem:
openssl x509 -in tmp.crt -out tmp.pem
crt转为p12证书:
openssl pkcs12 -export -in from.crt -inkey privatekey.key -out to.p12 -name "<name>"
p12 to jks:
keytool -importkeystore -srckeystore keystore.p12 -destkeystore keystore.jks -deststoretype pkcs12
jks to p12:
keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore keystore.p12
10.使用技巧
10.1配置文件引用
有时候把配置文件全部写在主配置文件里非常的不好看和排错,可以把不同虚拟主机配置分开,写到不同配置文件里,这有助于使配置更清晰和可维护,特别是在管理多个虚拟主机时。
创建用于存放虚拟主机配置文件的文件夹:
mkdir /usr/local/nginx/conf/vhosts
在这个文件中,添加您的虚拟主机配置,例如:
vi /usr/local/nginx/conf/vhosts/guojie.conf
server {
listen 80;
server_name localhost;
location / {
root /www/web01;
index index.html;
}
# 其他配置选项
}
然后在配置文件通过使用“include”指令引用虚拟主机配置文件:
http {
# 其他配置项
include /usr/local/nginx/conf/vhosts/*;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库