Nginx教程

Nginx教程

1.安装

1.1 官网

地址:http://nginx.org/

20230905204730

1.2 版本选择

一般选择稳定版

20230905205236

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的内存中,而是直接发送

image-20220502113913235

启动nginx并访问测试

20230909104026

4.虚拟主机

4.1配置主机域名解析

​ 这里由于在本地做的测试,没有域名,需要在宿主机配置让其可以域名解析,方便后续测试。

​ 在宿主机上找到"C:\Windows\System32\drivers\etc"下面的hosts文件,这里由于不能直接编辑,需要把它拷贝到其它地方编辑之后再覆盖到源路径。

20230909104532

完成之后ping一下域名或者使用浏览器访问测试。

20230909105026

解析成功,公网或生产环境请通过合规途径购买域名。

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

20230909112926

20230909113056

5.nginx代理

5.1正向代理

20220919121907

理解:

​ 正向代理可以理解为「客户端」的代理。它的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我,从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

结论:

	正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。就像要访问google用vpn代理FQ去访问(用户知道要访问真正的服务器)

5.2反向代理

20220919122008

理解:

​ 反向代理可以理解为「服务器」的代理,例用户访问 https://www.baidu.com/readme,但https://www.baidu.com上并不存在readme页面,他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户,但用户并不知情,这里所提到的 https://www.baidu.com 这个域名对应的服务器就设置了反向代理功能。

结论:

	反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。(用户不知道要访问真正的服务器)

6.反向代理与负载均衡

反向代理:这种代理方式叫做,隧道代理。有性能瓶颈,因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要。

20220502173846436

负载均衡:把请求,按照一定算法规则,分配给多台业务服务器(即使其中一个坏了/维护升级,还有其他服务器可以继续提供服务)。

20220502174023144

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;
        }
    }
}

重新加载配置文件后访问测试:

20230909203256

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!

分别添加在对应主机上准备好站点:

20230909211656

20230909211723

20230909211856

8.1定义地址别名

使用upstream定义一组地址【在server字段下】

访问guojie.com,访问都会代理到172.16.1.3172.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):

20230909222656

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/*;
}
posted @   国杰响当当  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示