简介
布署到生产环境跟开发环境有显著的区别,一个关注性能和安全,一个关注开发效率。如果将开发环境直接布署到线上,常常会出现敏感信息泄露和性能低下的问题。因此这里简单介绍布署到生产环境的一些基础检查点,分成以下几部分讨论:
- nginx配置
- php.ini配置
- Laravel应用配置
- 服务器SSH使用密钥登陆
nginx配置
- 不显示nginx版本
- 开启gzip压缩
- 工作进程数与CPU核数一致
- 禁止直接访问index.php
不显示nginx版本
当你发出请求时:
curl -I https://codefriend.top
HTTP/1.1 200 OK
Server: nginx/1.16.7 <---出现该提示
Date: Tue, 01 Jun 2017 00:00:00 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.2.25
通过增加如下配置可关nginx版本提示。
server_tokens off
需要注意,仍然会出现Server: nginx
,想彻底不显示这个信息,需要重编译nginx,具体见以下链接
https://serverfault.com/questions/214242/can-i-hide-all-server-os-info
gzip压缩
正式环境一定要开gzip压缩,否则传输效率可以差十来倍,nginx增加如下配置:
gzip on;
gzip_disable "msie6";
gzip_min_length 1k;
gzip_comp_level 1;
gzip_vary on;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif
image/png;
工作进程数与CPU核数一致
服务器为4核就改成4,为8就改成8:
worker_processes 4;
/etc/nginx/nginx.conf参考:
user www;
worker_processes 4;
pid /run/nginx.pid;
daemon off;
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
http {
server_tokens off;
gzip on;
gzip_disable "msie6";
gzip_min_length 1k;
gzip_comp_level 1;
gzip_vary on;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif
image/png;
# 省略其他配置
}
禁止直接访问index.php
许多攻击的构造方式是/index.php?c=homecontroncller&a=login
的这种方式去尝试,因此直接关闭对php的直接访问是有必要的。
server {
listen 80;
listen [::]:80;
server_name localhost;
root /var/www;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ .php$ {
internal; # 重点要设置成内部,访问*.php时可以直接返回404
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
参考文件:
https://stackoverflow.com/questions/47379091/nginx-block-access-to-php-files
php.ini配置
当你发出请求时:
curl -I https://codefriend.top
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 01 Jun 2017 00:00:00 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.2.25 <---出现该提示
修改php.ini
文件,即可关闭该提示
expose_php = Off
Laravel应用
- 配置成生产环境
- 关闭所有调试
- API发现500错误只返回Server Error信息
第1,2点,直接修改.env
文件即可:
APP_ENV=production
APP_DEBUG=false
API_DEBUG=false
第3点,需要手动修改,可参考下以下链接:
Laravel应用进阶检查
- 表单后端验证防止用户恶意刷数据
- 路由检查是否存在未授权可以得到过多的资源
这2个无法通过简单检查配置解决,主要依赖于开发人员水平以及依赖于安全工具的检查。
服务器SSH使用密钥登陆
使用密码登陆SSH时,多个人使用时是无法区分出谁是谁的。但是使用密钥做无密码登陆时,安全审计都有记录密钥的指纹,于是可以区分出某一个时间点的登陆是谁。因此,对于生产环境,建议不使用密码登陆,而用密钥做无密码登陆。