以前总是偷懒使用 Http-Server 来启动一个本地服务,后来花时间学习了一下 Nginx,感觉挺好用。总结整理一下,就当打点存档了。
一、简单介绍
Nginx — Ngine X,是一款自由的、开源的、高性能 HTTP 服务器和反向代理服务器;也是一个 IMAP 、POP3 、SMTP 代理服务器;也就是说 Nginx 本身就可以托管网站(类似于 Tomcat 一样),进行 Http 服务处理,也可以作为反向代理服务器使用。
Nginx 解决了服务器的 C10K(就是在一秒之内连接客户端的数目为10k即1万)问题。它的设计不像传统的服务器那样使用线程处理请求,而是一个更加高级的机制—事件驱动机制,是一种异步事件驱动结构。
Nginx 有一个主线程( master process)和几个工作线程(worker process)。主线程的目的是加载和验证配置文件、维护工作线程。
工作线程处理实际的请求,Nginx 采用基于事件的模型和依赖操作系统的机制在工作线程之间高效地分发请求。工作线程的数量可配置,也可自动调整为服务器 CPU 的数量。
二、搞懂正向代理和反向代码
-
正向代理:
首先,代理服务器一般指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端。例如:GoAgent FQ软件。我们的客户端在进行FQ操作的时候,我们使用的正是正向代理,通过正向代理的方式,在我们的客户端运行一个软件,将我们的 HTTP 请求转发到其他不同的服务器端,实现请求的分发。 -
反向代理:
反向代理服务器作用在服务器端,它在服务器端接收客户端的请求,然后将请求分发给具体的服务器进行处理,然后再将服务器的相应结果反馈给客户端。Nginx 就是一个反向代理服务器软件。
三、Nginx 安装与使用
这里我已 Mac 安装举例:
1
|
brew search nginx
|
Nginx 及其模块的工作方式由配置文件确定。 默认情况下,配置文件名为 nginx.conf
,放在 /usr/local/nginx/conf
、/etc/nginx
或者 /usr/local/etc/nginx
文件夹中。
安装完,打开浏览器,访问 localhost:8080
,页面出现欢迎语 Welcome to nginx!
,则说明安装成功。
四、Nginx 查看配置
1
|
nginx -t
|
当你执行 nginx -t
的时候,Nginx
会去测试你得配置文件得语法,并告诉你配置文件是否写得正确,同时也告诉了你配置文件得路径,如下:
1
|
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
|
通过 vim
查看与编辑配置文件:
vim /usr/local/etc/nginx/nginx.confıg
|
启动 Nginx
:
1
|
nginx
|
重启 Nginx
:
1
|
nginx -s reload
|
退出 Nginx
:
1
|
nginx -s quit
|
五、Nginx 配置文件
通过 vim /usr/local/etc/nginx/nginx.confıg
打开 Nginx
配置文件:
1
|
#定义 Nginx 运行的用户和用户组
|
深入了解,请参考:Config 配置详解
六、Nginx 配置 HTTPS
1
|
server {
|
七、Nginx 中使用 rewrite
1.Nginx Rewrite 基本标记( flags )
last - 基本上都用这个 Flag。
※相当于Apache里的[L]标记,表示完成 rewrite,不再匹配后面的规则
break - 中止 Rewirte ,不再继续匹配
redirect - 返回临时重定向的 HTTP 状态302
permanent - 返回永久重定向的 HTTP 状态301 ※原有的 url 支持正则,重写的 url 不支持正则
2.正则表达式匹配,其中:
- ~ 为区分大小写匹配
- ~* 为不区分大小写匹配
- !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配
3.文件及目录匹配,其中:
- -f和!-f用来判断是否存在文件
- -d和!-d用来判断是否存在目录
- -e和!-e用来判断是否存在文件或目录
- -x和!-x用来判断文件是否可执行
4.Nginx 的一些可用的全局变量,可用做条件判断:
- $args
- $content_length
- $content_type
- $document_root
- $document_uri
- $host
- $http_user_agent
- $http_cookie
- $limit_rate
- $request_body_file
- $request_method
- $remote_addr
- $remote_port
- $remote_user
- $request_filename
- $request_uri
- $query_string
- $scheme
- $server_protocol
- $server_addr
- $server_name
- $server_port
- $uri
举个例子,将所有 ithov.com
与 netseek.ithov.com
域名全部自跳转到 http://www.ithov.com
1
|
server
|
深入了解,请参考:
Nginx Rewrite 和 Redirect 模块配置方法说明
Nginx rewrite 指令
Nginx 中文文档
八、Nginx open 异常
1
|
nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)
|
解决方法:
1
|
[root@localhost nginx]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
|
使用 nginx -c
的参数指定 nginx.conf
文件的位置
1
|
[root@localhost nginx]# cd logs/
|
总用量 12
-rw-r--r-- 1 root root 1246 12月 9 18:10 access.log
|
可以看到 nginx.pid
文件已经有了,之后执行 nginx -s reload
重启 Nginx,问题搞定。
九、Nginx 启动异常
当我们运行 nginx -s reload
的时候,会报这样的错误:
1
|
nginx: [alert] kill(647, 1) failed (3: No such process)
|
这是因为,我们并没有启动 Nginx
服务,执行 nginx
命令启动服务。
十、invalid PID number
在 Mac
上用 brew
安装 Nginx
,然后修改 Nginx
配置文件,再重启时报出如下错误:
1
|
nginx: [error] invalid PID number “” in “/usr/local/var/run/nginx/nginx.pid”
|
解决方案:
1
|
$ sudo nginx -c /usr/local/etc/nginx/nginx.conf
|
十一、Nginx 403 forbidden 原因
引起 nginx 403 forbidden
可能有二种原因,具体如下:
1.缺少 index.html
或者 index.php
文件
1
|
server {
|
如果在 /home/jartto/www
下面没有 index.php,index.html
的时候,直接访问域名,找不到文件,会报 403 forbidden
。
2.权限问题详情请参考
因为权限问题引起的403,比较难查找,但是值得我们注意。
1
|
server {
|
可以看到, web
目录放在用户的所属目录下面,Nginx
的启动用户默认是 Nginx
的,所以对目录根本没有读的权限,这样就会报403错误了。
解决方案:
这个时候,把 web
目录的权限改大,或者是把 Nginx
的启动用户改成目录的所属用户,重启一下。