windows下安装nginx并配置端口转发 + 负载均衡,使用80端口转发多个本机的虚拟域名
下载nginx |
nginx下载地址:http://nginx.org/en/download.html
当前最新版本为nginx-1.20.0
启动nginx |
下后nginx后解压【nginx-1.20.0.zip】到你指定的目录。
打开cmd命令行窗口,进入nginx解压目录,在cmd窗口中输入【nginx.exe】或【start nginx】命令启动nginx,推荐在用【start nginx】命令,因为它是后台启动方式。
在浏览器地址栏中输入localhost:80查看nginx启动效果:
看到这个页面说明nginx已经启动成功。
这个时候可以关掉cmd窗口,nginx仍然在运行状态,不会退出。
也可以在cmd窗口中输入命令【tasklist /fi "imagename eq nginx.exe" 】,查看启动状态。
如果启动报错,是80端口被其它应用程序占用了,此是要关闭其它应用程序,把80端口让出来,然后征新启动nginx 。
nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
检查80端口是否被占用的命令是:【 netstat -ano | findstr 0.0.0.0:80 】,或 【netstat -ano | findstr "80"】。
配置本机域名 |
要通过域名访问网站,生产环境必须申请域名,然后把域名指向外网服务器的ip。
但是在开发环境,而且是在内网,申请域名也不好使,那么如何在内网环境使用域名访问呢?
解决办法是,修改hosts配置文件,
用文本编辑器打开 C:\Windows\System32\drivers\etc\hosts 文件,添加两个域名指向本机127.0.0.1的域名,
#在本机的hosts文件配置 127.0.0.1 local-crm.021sports.com 127.0.0.1 local-mall.021sports.com
如果要添加访问内网其它服务器的域名,就将其它服务器的ip替换127.0.0.1(比如10.10.61.169),同时,10.10.61.169这台服务器也要配置hosts,
#在本机的hosts文件配置 10.10.61.169 dev-crm.021sports.com 10.10.61.169 dev-mall.021sports.com
(本机的hosts配置)
如果要在本机可以访问内网10.10.61.169这台服务器的两个域名dev-crm.021sports.com及dev-mall.021sports.com,那么同时需要配置10.10.61.169服务器的hosts,
#同时必须在10.10.61.169服务器的hosts文件里配置 127.0.0.1 dev-crm.021sports.com 127.0.0.1 dev-mall.021sports.com
(10.10.61.169服务器的hosts配置)
配置完成后,在本机就可以同时访问四个域名了。
配置反向代理端口转发 + 负载均衡 |
nginx的配置文件是 conf/nginx.config 。
现在,我们要配置两个域名转发,
第一个域名 local-crm.021sports.com 转发到本机的 http:/、127.0.0.115900 站点,
第二个域名 local-mall.021sports.com 转到发本机的 http://127.0.0.1:55888 站点,
域名local-crm.021sports.com与域名local-mall.021sports.com是没带端口号的,表示默认用 80端口。
步骤:
(1)添加两个server配置
在http{}节点中,添加两个server配置,分别对应两个域名。
server { listen 80; server_name local-crm.021sports.com; location / { proxy_pass http://local-crm; } } server { listen 80; server_name local-mall.021sports.com; location / { proxy_pass http://local-mall; } }
listen:对外访问的端口。
server_name:对外访问的域名。
proxy_pass:转发的请求地址,可以是静态域名,也可以是变量。
(2) 添加两个upstream节点
然后,在http{}节点中,添加两个upstream配置,对应负载均衡。
upstream local-crm { server 127.0.0.1:15900 weight=1; server 127.0.0.1:15900 weight=1; server 127.0.0.1:15900 weight=1; } upstream local-mall { server 127.0.0.1:55888 weight=1; server 127.0.0.1:55888 weight=1; server 127.0.0.1:55888 weight=1; }
server:负载均衡节点,有几个节点就添加几个。
weight:权重
注意:本地站点host必须使用127.0.0.1,而不能使用localhost,因为windows 10系统,在cmd窗口ping localhost,它的ip不是127.0.0.1,而是IPV6地址::1,所以nginx找不到这个主机,会报Invalid Hostname的错误。
那么在浏览器中访问local-mall.021sports.com,或访问local-crm.021sports.com域名的的时候,会报Invalid Hostname的错误。
(3) 整体配置是:
http { server_names_hash_bucket_size 128; upstream local-crm { server 127.0.0.1:15900 weight=1; server 127.0.0.1:15900 weight=1; server 127.0.0.1:15900 weight=1; } upstream local-mall { server 127.0.0.1:55888 weight=1; server 127.0.0.1:55888 weight=1; server 127.0.0.1:55888 weight=1; } server { listen 80; server_name local-crm.021sports.com; location / { # 如果不用负载, 直接写域名 proxy_pass http://127.0.0.1:15900; proxy_pass http://local-crm; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; } } server { listen 80; server_name local-mall.021sports.com; location / { # 如果不用负载, 直接写域名 proxy_pass http://127.0.0.1:55888; proxy_pass http://local-mall; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; } } }
然后在cmd命令窗口中输入【nginx -s reload】重载配置文件。
如果执行nginx -s reload命令后,输出如下错误信息:
nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
这段提示信息是说需要增加服务器名字哈希别名的大小。如何解决呢,
在配置文件【conf/nginx.config】的http{}段增加一行配置
server_names_hash_bucket_size 64;
如果64还不够,那么就按32的倍数往上加。
http { server_names_hash_bucket_size 64; ..... }
注意:数值必须是32的倍数。
再次执行命令【nginx -s reload】
nginx命令介绍 |
【查看nginx是否启动】
tasklist /fi "imagename eq nginx.exe"
【启动nginx】
start nginx
nginx.exe
【停止nginx】
从容停止服务(此命令不一定能杀死nginx进程)
这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止。
nginx -s quit
立即停止服务(此命令不一定能杀死nginx进程)
这种方法比较强硬,无论进程是否在工作,都直接停止进程。
nginx -s stop
使用taskkill命令杀死nginx进程(此命令管用,可以杀死nginx)
taskkill /f /t /im nginx.exe
【重新加载配置】
nginx -s reload
【Linux命令】
启动nginx
systemctl start nginx.service
systemctl 停止
systemctl stop nginx.service
重启nginx
systemctl restart nginx.service
查看端口号
netstat -tlnp | grep nginx