教你如何在 Debian10 上搭建 PrestaShop 外贸电商平台

PrestaShop 是一个开源,免费,可扩展的网上购物系统, 基于 PHP 和 MySQL 以及 Smarty 引擎编程,模块化设计,可以使用插件和主题进行扩展,能轻易实现多种语言,多种货币浏览交易,支持Paypal等几乎所有的支付手段,是外贸网站建站的佳选。

Prestashop是目前为止,操作最简单,最人性化,用户体验最佳的电子商务解决方案之一。

本教程讲一步一步教你如何在Debian10上搭建PrestaShop电商系统。

前提条件

1、一台安装了Debian10系统的VPS服务器。

2、登录用的root账号。

配置SSH登录

首先,我们使用root账号登录系统,创建应用账号以及配置SSH登录。

ssh root@your_server_ip

更新系统软件:

apt update -y && apt upgrade -y

新建一个linux265账号供后续使用:

adduser linux265
usermod -a -G sudo linux265

修改SSH配置,为加固安全调整其默认的22端口号。

nano /etc/ssh/sshd_config

在sush_config文件中,找到以下选项并修改为如下内容,其中的端口号你可以根据自己需要设置:

Port 22100
Protocol 2
PermitRootLogin no

在文件最后增加如下内容:

UseDNS no
AllowUsers linux265

保存sush_config文件,并通过如下命令重启ssh服务,使其配置生效。

systemctl restart ssh.service

此时,可以按CTRL+D退出当前终端登录,使用新创建的账号ssh登录到服务器。

ssh -p 22100 linux265@ip_address

安装PHP及相关PHP模块

通过下面一条命令安装PHP环境以及相关PHP模块:

sudo apt install php-fpm php-common php-mysql php-gmp php-curl php-intl php-mbstring php-xmlrpc php-gd php-bcmath php-imap php-xml php-cli php-zip unzip wget git curl -y

安装完成后,打开/etc/php/7.3/fpm/php.ini文件进行编辑,找到如下内容选项,调整文件上传等相关参数值如下:

file_uploads = On
allow_url_fopen = On
short_open_tag = On
memory_limit = 256M
cgi.fix_pathinfo = 0
upload_max_filesize = 100M
max_execution_time = 360

保存文件,通过以下命令重启PHP-FPM服务:

sudo systemctl restart php7.3-fpm.service

安装配置Nginx

nginx的安装也非常简单,只需要简单的一条命令即可。

sudo apt install nginx

安装完成后,配置PrestaShop需要的站点服务。此时在目录/etc/nginx/sites-available/创建myshop.com配置文件:

sudo nano /etc/nginx/sites-available/myshop.com

在文件中添加如下内容:

server {

    # Ipv4
    listen 80;
 
    # IPv6
    listen [::]:80;

    # SSL Ipv4 & v6
    # listen 443 ssl;
    # listen [::]:443 ssl;

    # ssl_session_timeout 24h;
    # ssl_session_cache shared:SSL:10m;
    # ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:AES128-SHA:!ADH:!AECDH:!MD5;
    # ssl_prefer_server_ciphers on;
    # Do not forget to create this file before with OpenSSL : "openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048"
    # ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    # Your domain names here
    server_name myshop.com  www.myshop.com;

    #Your website root location
    root /var/www/myshop/;

    index index.php;

    #Log
    access_log /var/log/nginx/myshop_access.log;
    error_log /var/log/nginx/myshop_error.log;

    # Your admin folder
    set $admin_dir /admin730nzdtkb;

    # Gzip Settings, convert all types.
    gzip on;
    gzip_vary on;
    gzip_proxied any;

    # Can be enhance to 5, but it can slow you server
    # gzip_comp_level    5;
    # gzip_min_length    256;

    gzip_types
        application/atom+xml
        application/javascript
        application/json
        application/ld+json
        application/manifest+json
        application/rss+xml
        application/vnd.geo+json
        application/vnd.ms-fontobject
        application/x-font-ttf
        application/x-web-app-manifest+json
        application/xhtml+xml
        application/xml
        font/opentype
        image/bmp
        image/svg+xml
        image/x-icon
        text/cache-manifest
        text/css
        text/plain
        text/vcard
        text/vnd.rim.location.xloc
        text/vtt
        text/x-component
        text/x-cross-domain-policy;
        # Supposed to be the case but we never know
        # text/html;
        
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    
    # Symfony controllers
    location ~ /(international|_profiler|module|product|feature|attribute|supplier|combination|specific-price|configure)/(.*)$ {
        try_files $uri $uri/ /index.php?q=$uri&$args $admin_dir/index.php$is_args$args;     
    }


    # Redirect needed to "hide" index.php
    location / {
#        try_files $uri $uri/ /index.php$uri&$args;

        # Old image system ?
                    rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
                    rewrite ^/([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$1$2.jpg last;
                    rewrite ^/([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$1$2$3.jpg last;
                    rewrite ^/([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$1$2$3$4.jpg last;
                    rewrite ^/([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$1$2$3$4$5.jpg last;
                    rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6.jpg last;
                    rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7.jpg last;
                    rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8.jpg last;
                    rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9.jpg last;
                    rewrite ^/c/([0-9]+)(-[_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ /img/c/$1$2.jpg last;
                    rewrite ^/c/([a-zA-Z-]+)(-[0-9]+)?/.+\.jpg$ /img/c/$1.jpg last;
                    rewrite ^/([0-9]+)(-[_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ /img/c/$1$2.jpg last;
                    try_files $uri $uri/ /index.php?$args;  
    }
    
    error_page 404 /index.php?controller=404;

    # Static assets delivery optimisations
    add_header Strict-Transport-Security max-age=31536000;

    # Cloudflare / Max CDN fix
    location ~* \.(eot|otf|ttf|woff|woff2)$ {
        add_header Access-Control-Allow-Origin *;
    }

    location ~* \.(css|js|docx|zip|pptx|swf|txt|jpg|jpeg|png|gif|swf|webp|flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav|mp4|m4v|ogg|webm|aac)$ {
      expires max;
      log_not_found off;
      add_header Pragma public;
      add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }

    # Deny access to .htaccess .DS_Store .htpasswd etc
    location ~ /\. {
        deny all;
    }

    # PHP 7 FPM part
    location ~ [^/]\.php(/|$) {

        fastcgi_index index.php;

        # Switch if needed
        include /etc/nginx/fastcgi_params;
        # include fcgi.conf;

        # Do not forget to update this part if needed
        # fastcgi_pass 127.0.0.1:9000;  
        fastcgi_pass unix:/run/php/php7.3-fpm.sock;
        
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_keep_conn on;
        fastcgi_read_timeout 30s;
        fastcgi_send_timeout 30s;

        # In case of long loading or 502 / 504 errors
        # fastcgi_buffer_size 256k;
        # fastcgi_buffers 256 16k;
        # fastcgi_busy_buffers_size 256k;
        client_max_body_size 10M;

        # Temp file tweak
        fastcgi_max_temp_file_size 0;
        fastcgi_temp_file_write_size 256k;

   }

   # Allow access to robots.txt but disable logging every access
   location = /robots.txt {
       allow all;
       log_not_found off;
       access_log off;
   }


   # Prevent injection of php files in directories a user can upload stuff
   location /upload {
       location ~ \.php$ { deny all; }
   }
   location /img {
       location ~ \.php$ {  deny all;}
   }

   # Ban access to source code directories
   location ~ ^/(app|bin|cache|classes|config|controllers|docs|localization|override|src|tests|tools|translations|travis-scripts|vendor)/ {
      deny all;
   }

   # Banned file types
   location ~ \.(htaccess|yml|log|twig|sass|git|tpl)$ {
       deny all;
   }

}

注意:配置文件中的域名根据自己实际情况填写,这里只是使用了myshop.com进行举例。证书则需要自己购买或者申请免费的 Let's Encrypt 证书。关于Let's Encrypt 证书,可以参考「如何在 Debian 10 上安装 Nginx 并使用 Let's Encrypt实现https加密」教程。

当然你也可以执行如下命令来使用Let's Encrypt 证书:

sudo apt install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing python3-zope.interface -y
sudo apt install python3-certbot-nginx
sudo certbot --nginx -d myshop.com -d www.myshop.com

如果要从新获得证书可以还行如下命令,你也可以将其设置为crontab job定期执行获取更新证书:

sudo certbot renew --dry-run

保存myshop.com配置文件,并创建如下软链接。

sudo ln -s /etc/nginx/sites-available/myshop.com /etc/nginx/sites-enabled/

以上操作完成后,使用如下命令验证配置文件的正确性以及重启nginx以及PHP-FPM服务。

sudo nginx -t //验证配置文件的正确性
sudo systemctl restart nginx.service
sudo systemctl restart php7.3-fpm.service

安装数据库

在Debian10上,mariadb已经取代MySQL成为默认的数据库,我们通过以下命令进行安装:

sudo apt install mariadb-server mariadb-client

安装完成后,执行如下命令,加固数据库安全并重置数据库root账号密码:

sudo mysql_secure_installation

命令执行后,终端会有交互提示,所有的默认输入"y"回车即可。

之后,通过以下命令登录数据库:

mysql -u root -p

登录成功后,之后输入以下命令创建数据库以及数据库账号:

CREATE DATABASE dbprestashop DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
GRANT ALL ON dbprestashop.* TO 'prestashopuser'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
EXIT;

下载并安装PrestaShop

通过wget命令下载安装PrestaShop,如果想了解wget命令的使用,可以参考

cd /tmp && wget https://download.prestashop.com/download/releases/prestashop_1.7.6.5.zip

下载完成后,通过unzip命令解压,将解压的程序拷贝到/var/www/目录中,并修改相应的权限,如下命令:

sudo unzip prestashop.zip -d /var/www/myshop
sudo chown -R www-data:www-data /var/www/myshop/
sudo find . -type d -exec chmod 0755 {} \;
sudo find . -type f -exec chmod 0644 {} \;

以上所有操作完成后,我们就可以在浏览器中输入对应的地址通过安装向导一步一步安装PrestaShop了。

例如在浏览器地址中输入:

https://www.myshop.com

之后就会进入到安装向导页面。

设置防火墙

使用ufw对防火墙进行管理,可以通过以下命令进行设置:

sudo apt install ufw  //install ufw
sudo ufw enable
sudo ufw app list
sudo ufw allow 22100/tcp comment 'Open port ssh tcp port 22100'
sudo ufw allow 80
sudo ufw allow 443
sudo ufw status

至此,整个在Debian10上如何一步一步安装PrestaShop电商平台程序的讲解已经完成,如果你想搭建自己的外贸电商平台,不妨尝试一下PrestaShop。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 175,490评论 5 419
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 74,060评论 2 335
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 124,407评论 0 291
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 47,741评论 0 248
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 56,543评论 3 329
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 43,040评论 1 246
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 34,107评论 3 358
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 32,646评论 0 229
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 36,694评论 1 271
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 32,398评论 2 279
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 33,987评论 1 288
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 30,097评论 3 285
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 35,298评论 3 282
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 27,278评论 0 14
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 28,413评论 1 232
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 38,397评论 2 309
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 38,099评论 2 314

推荐阅读更多精彩内容