在使用lnmp一键安装包安装环境的时候,配置好了nginx,访问域名时却发现报了404错误,用静态文件缉检查路径是对的,说明php的解析有问题。在网上找到的nginx配置也是无法使用,因此,在此简单总结一下。
1.首先找到自己的nginx.conf在哪里
whereis nginx.conf 该命令可以用来查找文件位置
2.然后进入该目录打开nginx.conf查看一下:
简单查看一下几个比较重要的参数
1.user 代表用户
2.error_log 错误日志输出位置
3.access_log 普通日志输出位置,可以在该文件查看各种请求的情况
4.event,http,server是几个大模块,分别处理不同的配置
5.server里面的
root 是指该配置的网站根目录
server_name 是配置的域名,对应的域名会解析到对应的root
listen 80是指监听80端口,配置ssl证书就需要加个listen 443用来区分不同的协议(http/https)
6.location可以用来处理不同的文件类型配置
7.include vhost/*.conf
这个算是这里比较重要的了,include是用来引入文件的,这里使用了通配符*,表示引入了当前目录的vhost文件夹中所有后缀为.conf的文件,这些文件也是用来搞多级域名配置的。
配置多个域名:
1.cd vhost
2.vi blog.mclink.xyz.conf (名字虽然可以随意,最好是对应域名,好找)
3.填入以下配置(改几个地方就能通用):
server {
charset utf-8;
client_max_body_size 128M;
listen 80; ## listen for ipv4
#listen [::]:80 default_server ipv6only=on; ## listen for ipv6
server_name blog.mclink.xyz;
root /data/blog/public/;
index index.php;
access_log /data/blog/log/access.log;
error_log /data/blog/log/error.log;
location / {
# Redirect everything that isn't a real file to index.php
try_files $uri $uri/ /index.php$is_args$args;
}
# uncomment to avoid processing of calls to non-existing static files by Yii
#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
# try_files $uri =404;
#}
#error_page 404 /404.html;
# deny accessing php files for the /assets directory
location ~ ^/assets/.*\.php$ {
deny all;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
try_files $uri =404;
}
location ~* /\. {
deny all;
}
}
来,我们来简单解释一下把。
其中的
server_name blog.baidu.com; 用于编写你的域名
root /data/blog/public/ 该域名指向的项目根路径
access_log /data/blog/log/access.log; 正常接收输出日志
error_log /data/blog/log/error.log; 报错输出日志
这些是比较重要的部分,大多数都是只要改这些就行,但是有些地方需要提供rewrite功能,还得加上这个:
location / {
# Redirect everything that isn't a real file to index.php
try_files $uri $uri/ /index.php$is_args$args;
#下面是第二种写法
#rewrite ^/(.*)$ /index.php/$1 last;
}
有的人会觉得奇怪,怎么跟我的不大一样嘞,因此这个是有两种写法的。
rewrite 和 try_files,那么这两种有啥子区别:
Nginx一般都是配合php-fpm来使用的,
如果使用rewrite的时候会把所有的文件都重定向然后发送给php-fpm,也包括静态文件,这种会造成无意义的开销,因此还是建议使用try_files (Yii框架就是用的这个配置)
然后是这个配置:
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
try_files $uri =404;
}
其中fastcgi_params的$document_root是你在sever里面写的root 目录,像SCRIPT_FILENAME这种变量则是在fastcgi_params所定义的,类似于define,因此要先include fastcgi_params才可使用,这些带$符号的则是协议赋值的变量。
而fastcgi_pass 则是nginx和php-fpm的通信方式,一般有两种:
(来自网上大佬的回答)
一种是TCP,一种是UNIX Domain Socket.
其中TCP是IP加端口,可以跨服务器
.而UNIX Domain Socket不经过网络,只能用于Nginx跟PHP-FPM都在同一服务器的场景.
用哪种取决于你的PHP-FPM配置:
方式1:
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf: fastcgi_pass 127.0.0.1:9000;
方式2:
php-fpm.conf: listen = /tmp/php-fpm.sock
nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock;
其中php-fpm.sock是一个文件,由php-fpm生成,类型是srw-rw----.
UNIX Domain Socket可用于两个没有亲缘关系的进程,是目前广泛使用的IPC机制,
比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的.
这种通信方式是发生在系统内核里而不会在网络里传播.
UNIX Domain Socket和长连接都能避免频繁创建TCP短连接而导致TIME_WAIT连接过多的问题.对于进程间通讯的两个程序,
UNIX Domain Socket的流程不会走到TCP那层,直接以文件形式,以stream socket通讯.
如果是TCP Socket,则需要走到IP层,对于非同一台服务器上,TCP Socket走的就更多了.
UNIX Domain Socket:
Nginx <=> socket <=> PHP-FPM
TCP Socket(本地回环):
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
TCP Socket(Nginx和PHP-FPM位于不同服务器):
Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> PHP-FPM
像mysql命令行客户端连接mysqld服务也类似有这两种方式:
使用Unix Socket连接(默认):
mysql -uroot -p --protocol=socket --socket=/tmp/mysql.sock
使用TCP连接:
mysql -uroot -p --protocol=tcp --host=127.0.0.1 --port=3306
之所以我那个报404,原因之一就是fastcgi_param写错了,还有fpm启动的端口不是默认的9000