一、Nginx能干什么
- 作为web服务器
- 解析http协议,为防火墙内的局域网客户端提供访问Internet的途径
- 反向代理服务器
- 客户的请求发送给反向代理服务器,再被转发给后面的N台服务器
- 邮件服务器
- 解析邮件相关的协议: pop3/smtp/imap
二、linux上安装
-
先安装OpenSSL、ZLib、PCRE
安装openssl时:需要zlib ./config shared zlib --prefix=/usr/local/openssl && make && make install
安装nginx:注意自己的各个安装包路径 ./configure --with-openssl=../openssl-1.0.1t --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.13
如果make时报错 error: this statement may fall through [-Werror=implicit-fallthrough=] 37 | h ^= data[2] << 16;
nginx报错
三、Nginx的安装位置
- /usr/local/nginx/sbin/下有可执行程序nginx,为了方便使用:在PATH环境变量里的目录中创建一个该文件的软链接(或者直接把这个目录添加到PATH环境变量中)
- 查看PATH环境变量
echo $PATH
- 这里选择在/usr/bin目录里创建软链接
sudo ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
- 查看PATH环境变量
四、基本操作
-
启动Nginx
# 假设软连接已经创建完毕 sudo nginx # 启动
-
关闭Nginx
# 第一种, 马上关闭 sudo nginx -s stop # 第二种, 等nginx做完当前操作之后关闭 sudo nginx -s quit
-
重新加载Nginx
sudo nginx -s reload # 修改了nginx的配置文件之后, 需要执行该命令
五、配置文件
book@100ask:/usr/local/nginx/conf$ vi nginx.conf
- 配置文件的结构
- http -> 模块, http相关的通信设置
- server模块 -> 每个server对应的是一台web服务器
- location 模块
- 处理的是客户端的请求
- location 模块
- mail -> 模块, 处理邮件相关的动作
- 常用配置项
- user nobody; # 启动之后的worker进程属于谁
- 将nobody 改为 root,避免有时权限不够,导致403 Forbidden
- worker_processes 1; # 设置worker进程的个数
- error_log logs/error.log; # 错误日志
- pid logs/nginx.pid; # pid文件, 里面是nginx的进程ID
- events {
use epoll; # 多路IO转接模型使用epoll
worker_connections 1024; // 每个工作的进程的最大连接数
}
http下的 每个server模块对应一台web服务器: - server{
listen 80; # web服务器监听的端口, http协议的默认端口
server_name localhost; # 客户端通过该域名访问服务器
charset utf8; # 字符串编码
location { // 模块, 处理客户端的请求
}
}
- user nobody; # 启动之后的worker进程属于谁
六、部署静态网页
- 将网页资源(yundisk文件夹)放在服务器的资源根目录(/usr/local/nginx)下:
book@100ask:/usr/local/nginx$ ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp yundisk
book@100ask:/usr/local/nginx/yundisk$ ls
50x.html cloud_file.html index.html login.html reg.html static upload.html zyupload
-
服务器要处理的动作
如果现在客户端要访问http://192.168.232.132/login.html# 对应这个请求,服务器要修改nginx.conf:添加一个location location 指令(/) { # 找一个静态网页 root yundisk; # 相对于/usr/local/nginx/来找 # 如果客户端的请求是一个目录, nginx需要找一默认显示的网页。访问login.html不需要这行 index index.html index.htm; } # 配置之后重启nginx sudo nginx -s reload
同理:
如果现在客户端要访问http://192.168.232.132/hello/reg.htmllocation /hello/ { root yundisk; }
特别的,如果是访问目录,应该得到一个默认网页upoad.html:
如果现在客户端要访问http://192.168.232.132/upload/location /upload/ { root yundisk; index upload.html; }
七、反向代理
修改C:\Windows\System32\drivers\etc\hosts,使域名nihao.com、hello.com、hi.com都对应IP 127.0.0.1
在hosts中加入下面内容:
127.0.0.1 nihao.com
127.0.0.1 hello.com
127.0.0.1 hi.com
配置一下windows端,使其作为反向代理服务器。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 代理几台服务器就需要几个server模块
server {
listen 8088; #客户端访问反向代理服务器时,反向代理服务器监听的端口
server_name nihao.com;#客户端访问反向代理服务器时,需要一个反向代理服务器的域名
#作为反向代理服务器时,这里面应该是转发指令给服务器
#/是指令 http://是固定的,后面的yx.test.com是自己起的名字
location / {
proxy_pass http://yx.test.com;
# root html;
# index index.html index.htm;
}
}
#添加一个代理模块:要和上面的名字对应
upstream yx.test.com
{
server 192.168.232.131:80;
}
#另一台服务器
server {
listen 8088;
server_name hello.com;
location / {
proxy_pass http://luffy.test.com;
}
}
upstream luffy.test.com
{
server 192.168.232.132:80;
}
}
效果:访问nihao.com时,被解析为127.0.0.1,本机是一个反向代理服务器,将请求转发给192.168.232.131:80。
八、负载均衡
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8088; #客户端访问反向代理服务器时,反向代理服务器监听的端口
server_name localhost;#客户端访问反向代理服务器时,需要一个反向代理服务器的域名
location / {
proxy_pass http://yx.test.com;
}
}
upstream yx.test.com #该模块自动的轮流把请求给下列服务器
{
server 192.168.232.131:80;
server 192.168.232.132:80;
}
}
可以给不同的服务器设置权重:像下面这样加个weight
upstream yx.test.com #该模块自动的轮流把请求给下列服务器
{
server 192.168.232.131:80 weight=2;
server 192.168.232.132:80 weight=1;
}
一些其它问题:
- 使用阿里云时,需要设置安全组,在入方向添加80端口
- 连接不上虚拟机时:设置ipv4为自动获取ip、自动获得dns