因知识水平有限,见解都比较粗浅,仅供道友参考。
目录
关于Nginx
nginx [engine x] 是一个 HTTP 和反向代理服务器、一个邮件代理服务器和一个通用的 TCP/UDP 代理服务器,最初是lgor Sysoev设计开发的一个Web服务器。Nginx功能丰富,可作为HTTP服务器,邮件代理服务器、TCP/UDP代理服务器。nginx采用C语言编写,目前是开源的,其特点是占有内存少,并发能力强。支持FreeBSD、Linux、Solaris、AIX HP-UX、macOS、Windows等操作系统。作为一名运维/实施人员,安装部署应用系统是一项常用技能,所以本文从“配置”的角度来介绍nginx,更多的关注是如何配置程序,不关注源码本身。
获取Nginx
建议从官方网站获取相关程序(nginx: download),nginx-1.21.0的.gz文件包含C源码,有兴趣可以阅读并自行编译。本文的操作全部在Windows10下进行,其他操作系统的对于nginx的操作也类似。
安装 Nginx
由于安装方法因操作系统而异,本人使用经验有限,所以直接引用官网的安装说明(Installing nginx英文版本)。这里说一下Windows版本的包,下载下来的就是编译好的程序,可以直接使用(以cmd命令行的方式去运行nginx.exe)。为了方便使用,可以将程序所在文件夹的路径添加到Windows环境变量的path变量里面,如不添加,需要在使用命令前切换到此目录下。
使用Nginx
1、启动
初次获取程序后,先不修改配置文件,在Windows下通过start nginx命令启动。
d:
cd d:\nginx-1.21.0
start nginx
如果启动成功,用浏览器访问http://127.0.0.1:80/,会出现以下页面,这是nginx默认的http sever启动成功的标志。
如果启动失败,需要查阅logs\error.log,查看失败原因。首次启动失败原因多是因为80端口号被占用,所以需要找到占用80端口号的程序并关闭,若不能关闭占用程序,则需要修改nginx默认http sever的端口号。具体可以参考配置文件介绍这块。
2、停止、重载
可以通过以下命令停止、重载nginx。
nginx -s stop 快速停止。
nginx -s quit 正常停止。
nginx -s reload 修改配置后,根据新的配置重启一个进程,关闭旧进程。可以理解为刷新配置后重启。
nginx -s reopen 重新打开日志文件。
配置Nginx
nginx最重要的配置文件应该就是conf/nginx.conf
1、配置http服务。
这里在nginx.conf中添加一个sever节点来创建http服务。http sever的结构如下,父节点是http,子节点是sever,sever可以有若干个。
http {
server {
}
}
例子1:发布一个静态网页
server{
listen 8099;
server_name localhost;
location / {
root html/cjbhf;
index 中华人民共和国长江保护法.html;
}
}
项目路径:
发布结果:
例子2:使用8099端口发布一个静态网页和一个文件服务器
nginx默认是禁止访问目录的。所以在第一个location配置中,只能通过具体的URL来访问资源。以下是效果图:
不可以通过url访问到test文件夹下的内容。
可以通过url访问到test/index.html。
作为非测试环境、或者是特定局域网内文件共享等特定场景,需要构建一个简单的http文件服务器,可以使用下面的location配置,需要注意的是location后面的路径需要在root后配置的路径中实际存在。在本文中就是要在location后面写pic就必须存在E:/picture/pic这个路径。
server{
listen 8099;
server_name localhost;
location / {
root html/cjbhf;
index 中华人民共和国长江保护法.html;
}
location /pic/ {
root E:/picture;
autoindex on; # 开启目录文件列表
autoindex_exact_size on; # 显示出文件的确切大小,单位是bytes
autoindex_localtime on; # 显示的文件时间为文件的服务器时间
charset utf-8,gbk; # 避免中文乱码
}
}
效果图如下:
2、配置https服务。
https协议可以理解为加密了的http,目前多数互联网站点都是采用https协议,相对于http更加安全,过程也相对复杂。仅从安装部署的角度来说,https与http的区别主要在于https需要使用CA证书。如果是练习的话,可以使用OpenSSL(/index.html (openssl.org))来自签证书,供nginx使用。本文只简单介绍一下配置文件,后续可能会介绍OpenSSL签发CA证书的方法。
server {
listen 9790 ssl;
server_name localhost;
ssl_certificate cert\mysert.crt;
ssl_certificate_key cert\mycert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html/cjbhf;
index 中华人民共和国长江保护法.html;
}
}
在conf文件中找到 HTTPS server字样,反注释掉sever语句块。
ssl_certificate后填写根证书相对nginx.conf的路径,ssl_certificate_key填写私钥文件的相对路径。
ssl_session_cache shared:SSL:1m; 设置会话存储为1兆
ssl_session_timeout 5m;设置缓存超时为5分钟
以上两个配置是为了提高效率,减少https服务对服务器CPU资源的消耗。
ssl_ciphers HIGH:!aNULL:!MD5; SSL 密码为“ HIGH:!aNULL:!MD5”。
证书是个“假的”,所以这里显示是不安全。
3、代理
代理是nginx一项重要的功能。能够提供配置灵活的转发功能。我们可以将代理形象理解为nginx将收到的A的请求报文转发给B,然后将B的响应报文转发给A,A和B都只同nginx直接进行了交互。正向代理可以理解为将客户端代理出局域网,反向代理则是将服务端代理出局域网,代理多应用于客户端和服务端之间无法直接交互的情况。
以下分别是一个简单的http服务的代理和https的反向代理。
server{
listen 8099;
server_name localhost;
location /en/ {
proxy_pass http://nginx.org/;
}
}
server{
listen 9790;
server_name localhost;
ssl_certificate cert\mysert.crt;
ssl_certificate_key cert\mycert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /MyCSDN/ {
proxy_pass https://www.baidu.com/;
}
}
正向代理的简单例子
server {
listen 8099;
server_name localhost;
resolver 8.8.8.8;
location / {
proxy_pass http://$http_host$request_uri;
}
}
以上例子可以通过添加多个location实现一个sever代理多个url对应的服务。
4、负载均衡
负载均衡是nginx将接受到的流量再次转发至多个服务的行为,nginx 中的反向代理实现包括 HTTP、HTTPS、FastCGI、uwsgi、SCGI、memcached 和 gRPC 的负载均衡。它在Web项目是一项非常重要的工作,对于业务繁忙的业务系统,有必要使用多个一样的服务支持同样的、大量的请求。这样可以保障业务的不间断性,即使其中某个服务出现故障,其他的服务也可以支持请求继续下去。
这里介绍一下http服务负载均衡的配置,它的实现方法包括循环法、最少连接法、ip-hash法、权重法等。
要使用负载均衡,首先需要使用upstream指令,在upstream中指定多个sever(可以是域名或ip+端口),然后使用upstream的名称设置为proxy_pass的值。
循环法(默认由nginx分配具体转发到哪个sever)
http {
upstream url1 {
server 192.168.0.1:80;
server 192.168.0.1:7090;
server 192.168.0.2:8081;
}
server {
listen 8099;
location / {
proxy_pass http://url1;
}
}
}
最少连接法
nginx尽量将新请求分发到不太繁忙的服务器,从而避免繁忙服务器过载。
http {
upstream url1 {
least_conn;
server 192.168.0.1:80;
server 192.168.0.1:7090;
server 192.168.0.2:8081;
}
server {
listen 8099;
location / {
proxy_pass http://url1;
}
}
}
ip_hash法
保证来自同一个ip地址请求,最终请求到同一个服务器。
http {
upstream url1 {
ip_hash;
server 192.168.0.1:80;
server 192.168.0.1:7090;
server 192.168.0.2:8081;
}
server {
listen 8099;
location / {
proxy_pass http://url1;
}
}
}
权重法
顾名思义,根据权重决定服务的请求频率。
http {
upstream url1 {
server 192.168.0.1:80 weight 2;
server 192.168.0.1:7090 weight 3;
server 192.168.0.2:8081 weight 5;
}
server {
listen 8099;
location / {
proxy_pass http://url1;
}
}
}
以上例子中,10个请求,有2个会分给192.168.0.1:80,有3个给192.168.0.1:7090,五个给192.168.0.2:8081。
根据使用经验来说,如果使用了上述配置,假如192.168.0.2:8081不可用,那么10个请求只有5个可以被转发处理,从而会体现在业务系统层面。所以还是要选择最适合的场景使用最适合的方法啊。
结语
从使用经验来说,nginx是一个强大的Web工具,可以广泛的应用在网络部署、软件开发、实施、运维等多个方面。从nginx官方资料介绍来看nginx的功能还远不止以上内容,限于知识水平、学习程度及软硬件环境,暂时先写这些。随着不断地学习,作者尽量多研究研究并记录成文。