Vendure 是一個開源的無頭商務框架,允許構建由 Node.js、TypeScript 和 GraphQL 提供支持的生產就緒電子商務應用程序。它的工作原理是通過 API 公開所有應用程序功能。Vendure 在 GraphQL API 上公開了所有商店前端功能,并且不提供默認的商店前端界面。這提高了開發(fā)人員的靈活性,因為它允許您使用任何前端技術創(chuàng)建店面。
本文介紹如何在 Ubuntu 22.04 Vultr 服務器上部署 Vendure。您需要將該框架與 Vultr Object Storage(PostgreSQL 托管數據庫)和 Redis? 集成,以構建生產就緒型應用程序。
準備工作:
# su example_user
$ sudo apt install s3cmd
Vendure 需要 Node.js 版本 16.x 或更高版本。按照以下步驟中的說明安裝最新的 Node.js 版本。
$ sudo apt update
keyrings
$ sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
apt
20
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
$ sudo apt update
$ sudo apt install nodejs -y
$ nodejs --version
輸出:
v20.5.1
要在服務器上安裝 Vendure,您需要將應用程序數據臨時保存在本地 PostgreSQL 數據庫服務器上。稍后,您可以先將數據遷移到 Vultr Managed Database for MySQL,然后再將應用程序部署到生產環(huán)境。如下所述設置本地數據庫。
$ psql --version
輸出:
psql (PostgreSQL) 14.16 (Ubuntu 14.16-0ubuntu0.22.04.1)
pg_hba.conf
nano
$ sudo nano /etc/postgresql/14/main/pg_hba.conf
# "local" is for Unix domain socket connections only
local all all peer
peer
md5
local all all md5
保存并關閉文件
$ sudo systemctl restart postgresql
$ sudo -u postgres psql
postgres=# CREATE DATABASE vendure_db;
輸出:
CREATE DATABASE
postgres=# CREATE USER vendure_user WITH ENCRYPTED PASSWORD 'strong-password';
輸出:
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE vendure_db TO vendure_user;
輸出:
GRANT
postgres-# \q
npx
@vendure/create
$ npx @vendure/create vendure-app
@vendure/create
Need to install the following packages:
@vendure/create@2.0.2
Ok to proceed? (y) y
選擇為正在使用的數據庫Postgres
◆ Which database are you using?
│ ○ MySQL
│ ○ MariaDB
│ ● Postgres
│ ○ SQLite
│ ○ SQL.js
按下可設置為 PostgreSQL 主機名ENTERlocalhost
◆ What's the database host address?
│ localhost
按下可保留為 PostgreSQL 端口號ENTER5432
◆ What port is the database listening on?
│ 5432
輸入您之前創(chuàng)建的 PostgreSQL 數據庫名稱
◆ What's the name of the database?
│ vendure_db
按下可將 PostgreSQL 架構設置為 publicENTER
What's the schema name we should use?
│ public
輸入您之前創(chuàng)建的 PostgreSQL 用戶
◇ What's the database user name?
│ vendure_user
輸入您之前創(chuàng)建的 PostgreSQL 數據庫用戶密碼
◇ What's the database password?
│ strong-password
按下可保留為默認管理員用戶名。將用戶名更改為所需值ENTERsuperadmin
◇ What identifier do you want to use for the superadmin user?
│ superadmin
│
輸入您想要的超級管理員用戶名或按下以使用默認密碼ENTER
◇ What password do you want to use for the superadmin user?
│ superadmin
│
Select?and press?to populate the database with sample product datayes
ENTER
◆ Populate with some sample product data?
│ ● yes
│ ○ no
◇ Server successfully initialized and populated
│
◇ ──────────────────────────────────────────╮
│ │
│ Success! Created a new Vendure server at: │
│ │
│ │
│ /home/example_user/vendure-app │
│ │
│ │
│ We suggest that you start by typing: │
│ │
│ │
│ $ cd vendure-app │
│ $ npm run dev │
│ │
├─────────────────────────────────────────────╯
│
└ Happy hacking!
$ ls
Output:
vendure-app
Verify that a new?directory is available on the listvendure-app
vultradmin
1234
host.vultrdb.com
$ psql -h host.vultrdb.com -d postgres -U vultradmin
Or, copy and use your database connection string from your Vultr Managed Database for PostgreSQL control panel
defaultdb=> CREATE DATABASE venduredb;
Output:
CREATE DATABASE
defaultdb=> \q
venduredb.sql
$ pg_dump --no-owner -U vendure_user -d vendure_db -W > venduredb.sql
出現提示時,輸入您之前設置的正確的 Vendure 用戶數據庫密碼
host.vultrdb.com
vendure_db
vultradmin
$ psql -h host.vultrdb.com -d vendure_db -U vultradmin < venduredb.sql
$ psql -h host.vultrdb.com -d vendure_db -U vultradmin
vendure_db=> \dt
輸出:
List of relations
Schema | Name | Type | Owner
--------+---------------------------------------------+-------+-------
public | address | table | vultradmin
public | administrator | table | vultradmin
public | asset | table | vultradmin
public | asset_channels_channel | table | vultradmin
public | asset_tags_tag | table | vultradmin
public | authentication_method | table | vultradmin
public | channel | table | vultradmin
public | collection | table | vultradmin
public | collection_asset | table | vultradmin
public | collection_channels_channel | table | vultradmin
public | collection_closure | table | vultradmin
public | collection_product_variants_product_variant | table | vultradmin
public | collection_translation | table | vultradmin
public | customer | table | vultradmin
public | customer_channels_channel | table | vultradmin
public | customer_group | table | vultradmin
public | customer_groups_customer_group | table | vultradmin
public | facet | table | vultradmin
public | facet_channels_channel | table | vultradmin
:
Enter 退出 PostgreSQL 尋呼機Q
# \q
ca-certificate.crt
scp
$ scp ca-certificate.crt example_user@SERVER-IP:/home/example_user/
$ ls
輸出:
ca-certificate.crt
/usr/local/share/ca-certificates/
$ sudo mv ca-certificate.crt /usr/local/share/ca-certificates/
vendure-config.ts
$ nano src/vendure-config.ts
readFileSync
node:fs
import { readFileSync } from 'node:fs';
dbConnectionOptions
ssl: {
rejectUnauthorized: true,
ca: readFileSync('/usr/local/share/ca-certificates/ca-certificate.crt').toString(),
},
您編輯的部分應如下所示:dbConnectionOptions
dbConnectionOptions: {
type: 'postgres',
// See the README.md "Migrations" section for an explanation of
// the `synchronize` and `migrations` options.
synchronize: false,
migrations: [path.join(__dirname, './migrations/*.+(js|ts)')],
logging: false,
database: process.env.DB_NAME,
schema: process.env.DB_SCHEMA,
host: process.env.DB_HOST,
port: +process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
ssl: {
rejectUnauthorized: true,
ca: readFileSync('/usr/local/share/ca-certificates/ca-certificate.crt').toString(),
},
},
保存并關閉文件。
vendure-app
$ cd vendure-app
.env
$ nano .env
DB_HOST=host.vultrdb.com
DB_PORT=1234
DB_NAME=vendure_db
DB_USERNAME=vultradmin
DB_PASSWORD=managed-db-password
Save and close the file.
vendure
$ pwd
Verify that you're operating in the?directory, or switch to the directoryvendure-app
$ cd vendure-app
s3cmd
$ s3cmd sync static/assets/ s3://vendure/
Verify that the file transfer completes successfully
npm
@aws-sdk/client-s3
@aws-sdk/lib-storage
$ npm install @aws-sdk/client-s3 @aws-sdk/lib-storage --save
environment.d.ts
$ nano src/environment.d.ts
ProcessEnv
S3_ENDPOINT: string;
S3_ACCESS_KEY_ID: string;
S3_SECRET_ACCESS_KEY: string;
S3_BUCKET_NAME: string;
Save and close the file.
Your edited file should look like the one below:
namespace NodeJS {
interface ProcessEnv {
APP_ENV: string;
COOKIE_SECRET: string;
SUPERADMIN_USERNAME: string;
SUPERADMIN_PASSWORD: string;
DB_HOST: string;
DB_PORT: number;
DB_NAME: string;
DB_USERNAME: string;
DB_PASSWORD: string;
DB_SCHEMA: string;
S3_ENDPOINT: string;
S3_ACCESS_KEY_ID: string;
S3_SECRET_ACCESS_KEY: string;
S3_BUCKET_NAME: string;
}
.env
$ nano .env
S3_ENDPOINT=https://YOUR_VULTR_OBJECT_STORAGE_HOST
S3_ACCESS_KEY_ID=YOUR_VULTR_OBJECT_STORAGE_ACCESS_KEY
S3_SECRET_ACCESS_KEY=YOUR_VULTR_OBJECT_STORAGE_SECRET_KEY
S3_BUCKET_NAME=YOUR_VULTR_OBJECT_STORAGE_BUCKET_NAME
Save and close the file.
You can view your Vultr Object Storage details on the instance overview section
vendure-config.ts
$ mv src/vendure-config.ts src/vendure-config.ORIG
$ nano src/vendure-config.ts
example.com
import {
dummyPaymentHandler,
DefaultJobQueuePlugin,
DefaultSearchPlugin,
VendureConfig,
} from '@vendure/core';
import { AssetServerPlugin, configureS3AssetStorage } from '@vendure/asset-server-plugin';
import { defaultEmailHandlers, EmailPlugin } from '@vendure/email-plugin';
import { AdminUiPlugin } from '@vendure/admin-ui-plugin';
import 'dotenv/config';
import path from 'path';
const IS_DEV = process.env.APP_ENV === 'dev';
export const config: VendureConfig = {
apiOptions: {
port: 3000,
adminApiPath: 'admin-api',
shopApiPath: 'shop-api',
// The following options are useful in development mode,
// but are best turned off for production for security
// reasons.
...(IS_DEV ? {
adminApiPlayground: {
settings: { 'request.credentials': 'include' } as any,
},
adminApiDebug: true,
shopApiPlayground: {
settings: { 'request.credentials': 'include' } as any,
},
shopApiDebug: true,
} : {}),
},
authOptions: {
tokenMethod: ['bearer', 'cookie'],
superadminCredentials: {
identifier: process.env.SUPERADMIN_USERNAME,
password: process.env.SUPERADMIN_PASSWORD,
},
cookieOptions: {
secret: process.env.COOKIE_SECRET,
},
},
dbConnectionOptions: {
type: 'postgres',
// See the README.md "Migrations" section for an explanation of
// the `synchronize` and `migrations` options.
synchronize: false,
migrations: [path.join(__dirname, './migrations/*.+(js|ts)')],
logging: false,
database: process.env.DB_NAME,
schema: process.env.DB_SCHEMA,
host: process.env.DB_HOST,
port: +process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
},
paymentOptions: {
paymentMethodHandlers: [dummyPaymentHandler],
},
// When adding or altering custom field definitions, the database will
// need to be updated. See the "Migrations" section in README.md.
customFields: {},
plugins: [
AssetServerPlugin.init({
route: 'assets',
assetUploadDir: path.join(__dirname, '../static/assets'),
assetUrlPrefix: IS_DEV ? undefined : 'https://example.com/assets/',
storageStrategyFactory: configureS3AssetStorage({
bucket: process.env.S3_BUCKET_NAME,
credentials: {
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
},
nativeS3Configuration: {
endpoint: process.env.S3_ENDPOINT,
forcePathStyle: true,
signatureVersion: 'v4',
region: 'eu-west-1',
},
}),
}),
DefaultJobQueuePlugin.init({ useDatabaseForBuffer: true }),
DefaultSearchPlugin.init({ bufferUpdates: false, indexStockStatus: true }),
EmailPlugin.init({
devMode: true,
outputPath: path.join(__dirname, '../static/email/test-emails'),
route: 'mailbox',
handlers: defaultEmailHandlers,
templatePath: path.join(__dirname, '../static/email/templates'),
globalTemplateVars: {
// The following variables will change depending on your storefront implementation.
// Here we are assuming a storefront running at http://localhost:8080.
fromAddress: '"example" <noreply@example.com>',
verifyEmailAddressUrl: 'http://localhost:8080/verify',
passwordResetUrl: 'http://localhost:8080/password-reset',
changeEmailAddressUrl: 'http://localhost:8080/verify-email-address-change'
},
}),
AdminUiPlugin.init({
route: 'admin',
port: 3002,
}),
],
};
Save and close the file.
The above configuration imports the?and?assets to Vendure. Then, it defines the Vendure URL?in the?section.configureS3AssetStorage
asset-server-plugin
example.com
AssetServerPlugin.init({
Vendure keeps the job queue in the PostgreSQL database by default. To store the jobs in a Vultr Managed Database for Caching, use the BullMQ job queue plugin as described in the steps below.
$ npm install @vendure/job-queue-plugin bullmq@1 --save
environment.d.ts
$ nano src/environment.d.ts
ProcessEnv
S3
REDIS_HOST: string;
REDIS_PORT: number;
REDIS_USERNAME: string;
REDIS_PASSWORD: string;
Save and close the file.
vendure-config.ts
$ nano src/vendure-config.ts
BullMQJobQueuePlugin
import { BullMQJobQueuePlugin } from '@vendure/job-queue-plugin/package/bullmq';
In the?section, find the?initialization directiveplugins:
DefaultJobQueuePlugin
DefaultJobQueuePlugin.init({ useDatabaseForBuffer: true }),
Replace it with the following?declarationsBullMQJobQueuePlugin
BullMQJobQueuePlugin.init({
connection: {
port: process.env.REDIS_PORT,
host: process.env.REDIS_HOST,
username: process.env.REDIS_USERNAME,
password: process.env.REDIS_PASSWORD,
tls: {},
}
}),
Save and close the file.
.env
$ nano .env
REDIS_HOST=host.vultrd.com
REDIS_PORT=1234
REDIS_USERNAME=admin
REDIS_PASSWORD=strong-password
You can find your Vultr Managed Database for Caching details on your instance overview section
Vendure stores the session object cache in your system memory. It's fast and suitable for a single-instance deployment. However, for horizontal scaling or multi-instance deployment, you must store the session cache to an external data store such as a Vultr Managed Database for Caching. To enable Redis?, create a custom session cache strategy as described below.
redis-session-cache-strategy.ts
plugins
$ nano src/plugins/redis-session-cache-strategy.ts
import { CachedSession, Logger, SessionCacheStrategy, VendurePlugin } from '@vendure/core';
import { Redis, RedisOptions } from 'ioredis';
export interface RedisSessionCachePluginOptions {
namespace?: string;
redisOptions?: RedisOptions;
}
const loggerCtx = 'RedisSessionCacheStrategy';
const DEFAULT_NAMESPACE = 'vendure-session-cache';
export class RedisSessionCacheStrategy implements SessionCacheStrategy {
private client: Redis;
constructor(private options: RedisSessionCachePluginOptions) {}
init() {
this.client = new Redis(this.options.redisOptions as RedisOptions);
this.client.on('error', err => Logger.error(err.message, loggerCtx, err.stack));
}
async get(sessionToken: string): Promise<CachedSession | undefined> {
const retrieved = await this.client.get(this.namespace(sessionToken));
if (retrieved) {
try {
return JSON.parse(retrieved);
} catch (e: any) {
Logger.error(`Could not parse cached session data: ${e.message}`, loggerCtx);
}
}
}
async set(session: CachedSession) {
await this.client.set(this.namespace(session.token), JSON.stringify(session));
}
async delete(sessionToken: string) {
await this.client.del(this.namespace(sessionToken));
}
clear() {
// not implemented
}
private namespace(key: string) {
return `${this.options.namespace ?? DEFAULT_NAMESPACE}:${key}`;
}
}
@VendurePlugin({
configuration: config => {
config.authOptions.sessionCacheStrategy = new RedisSessionCacheStrategy(
RedisSessionCachePlugin.options,
);
return config;
},
})
export class RedisSessionCachePlugin {
static options: RedisSessionCachePluginOptions;
static init(options: RedisSessionCachePluginOptions) {
this.options = options;
return this;
}
}
Save and close the file
vendure-config.ts
$ nano src/vendure-config.ts
RedisSessionCachePlugin
import { RedisSessionCachePlugin } from './plugins/redis-session-cache-strategy';
Within the?section, add the following code after?to initialize the?Plugins: [
AdminUiPlugin.init(...)
RedisSessionCachePlugin
RedisSessionCachePlugin.init({
redisOptions: {
port: process.env.REDIS_PORT,
host: process.env.REDIS_HOST,
username: process.env.REDIS_USERNAME,
password: process.env.REDIS_PASSWORD,
tls: {},
}
}),
Save and close the file.
.env
$ nano .env
APP_ENV
dev
production
APP_ENV=production
Save and close the file.
$ npm install @vendure/harden-plugin --save
vendure-config.ts
$ nano src/vendure-config.ts
harden plugin
import
import { HardenPlugin } from '@vendure/harden-plugin';
Within the?section, add the following code to initialize the harden pluginPlugins:
HardenPlugin.init({
maxQueryComplexity: 500,
apiMode: IS_DEV ? 'dev' : 'prod',
}),
Save and close the file.
The edited?file should look like the one below:vendure-config.ts
import {
dummyPaymentHandler,
DefaultJobQueuePlugin,
DefaultSearchPlugin,
VendureConfig,
} from '@vendure/core';
import { defaultEmailHandlers, EmailPlugin } from '@vendure/email-plugin';
import { AssetServerPlugin, configureS3AssetStorage } from '@vendure/asset-server-plugin';
import { AdminUiPlugin } from '@vendure/admin-ui-plugin';
import { BullMQJobQueuePlugin } from '@vendure/job-queue-plugin/package/bullmq';
import { RedisSessionCachePlugin } from './plugins/redis-session-cache-strategy';
import { HardenPlugin } from '@vendure/harden-plugin';
import 'dotenv/config';
import path from 'path';
import { readFileSync } from 'node:fs';
const IS_DEV = process.env.APP_ENV === 'dev';
export const config: VendureConfig = {
apiOptions: {
port: 3000,
adminApiPath: 'admin-api',
shopApiPath: 'shop-api',
// The following options are useful in development mode,
// but are best turned off for production for security
// reasons.
...(IS_DEV ? {
adminApiPlayground: {
settings: { 'request.credentials': 'include' } as any,
},
adminApiDebug: true,
shopApiPlayground: {
settings: { 'request.credentials': 'include' } as any,
},
shopApiDebug: true,
} : {}),
},
authOptions: {
tokenMethod: ['bearer', 'cookie'],
superadminCredentials: {
identifier: process.env.SUPERADMIN_USERNAME,
password: process.env.SUPERADMIN_PASSWORD,
},
cookieOptions: {
secret: process.env.COOKIE_SECRET,
},
},
dbConnectionOptions: {
type: 'postgres',
// See the README.md "Migrations" section for an explanation of
// the `synchronize` and `migrations` options.
synchronize: false,
migrations: [path.join(__dirname, './migrations/*.+(js|ts)')],
logging: false,
database: process.env.DB_NAME,
schema: process.env.DB_SCHEMA,
host: process.env.DB_HOST,
port: +process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
ssl: {
rejectUnauthorized: true,
ca: readFileSync('/usr/local/share/ca-certificates/ca-certificate.crt').toString(),
},
},
paymentOptions: {
paymentMethodHandlers: [dummyPaymentHandler],
},
// When adding or altering custom field definitions, the database will
// need to be updated. See the "Migrations" section in README.md.
customFields: {},
plugins: [
AssetServerPlugin.init({
route: 'assets',
assetUploadDir: path.join(__dirname, '../static/assets'),
assetUrlPrefix: IS_DEV ? undefined : 'https://example.hisman.org/assets/',
storageStrategyFactory: configureS3AssetStorage({
bucket: process.env.S3_BUCKET_NAME,
credentials: {
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
},
nativeS3Configuration: {
endpoint: process.env.S3_ENDPOINT,
forcePathStyle: true,
signatureVersion: 'v4',
region: 'eu-west-1',
},
}),
}),
RedisSessionCachePlugin.init({
redisOptions: {
port: process.env.REDIS_PORT,
host: process.env.REDIS_HOST,
username: process.env.REDIS_USERNAME,
password: process.env.REDIS_PASSWORD,
tls: {},
}
}),
BullMQJobQueuePlugin.init({
connection: {
port: process.env.REDIS_PORT,
host: process.env.REDIS_HOST,
username: process.env.REDIS_USERNAME,
password: process.env.REDIS_PASSWORD,
tls: {},
}
}),
HardenPlugin.init({
maxQueryComplexity: 500,
apiMode: IS_DEV ? 'dev' : 'prod',
}),
DefaultSearchPlugin.init({ bufferUpdates: false, indexStockStatus: true }),
EmailPlugin.init({
devMode: true,
outputPath: path.join(__dirname, '../static/email/test-emails'),
route: 'mailbox',
handlers: defaultEmailHandlers,
templatePath: path.join(__dirname, '../static/email/templates'),
globalTemplateVars: {
// The following variables will change depending on your storefront implementation.
// Here we are assuming a storefront running at http://localhost:8080.
fromAddress: '"example" <noreply@example.com>',
verifyEmailAddressUrl: 'http://localhost:8080/verify',
passwordResetUrl: 'http://localhost:8080/password-reset',
changeEmailAddressUrl: 'http://localhost:8080/verify-email-address-change'
},
}),
AdminUiPlugin.init({
route: 'admin',
port: 3002,
}),
],
};
$ npm run build
npm
?writes the build files to the?directorydist
PM2
$ sudo npm install pm2 -g
$ pm2 start ./dist/index.js -i max
$ pm2 start ./dist/index-worker.js -i max
Output:
[PM2] Starting /home/user/vendure-app/dist/index-worker.js in cluster_mode (0 instance)
[PM2] Done.
┌────┬─────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ? │ status │ cpu │ mem │ user │ watching │
├────┼─────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ index │ default │ 0.1.0 │ cluster │ 232015 │ 47s │ 0 │ online │ 0% │ 135.0mb │ user │ disabled │
│ 1 │ index-worker │ default │ 0.1.0 │ cluster │ 232052 │ 0s │ 0 │ online │ 0% │ 36.5mb │ user │ disabled │
└────┴─────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
$ pm2 startup
Output:
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u example_user --hp /home/example_user
$ pm2 save
wget
3000
$ wget -S http://localhost:3000/admin/
Output:
--2023-08-18 10:30:28-- http://localhost:3000/admin/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:3000... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
X-Powered-By: Express
Vary: Origin
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: vendure-auth-token
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Fri, 18 Aug 2023 09:34:01 GMT
ETag: W/"268-18a07fe9b82"
Content-Type: text/html; charset=UTF-8
Content-Length: 616
Date: Fri, 18 Aug 2023 10:30:28 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Length: 616 [text/html]
Saving to: ‘index.html’
If Vendure fails to run and listen on port?. Start it using the following command to view the runtime log and catch any errors3000
$ npm run dev
Output:
[server] info 8/31/23, 8:25 PM - [BullMQJobQueuePlugin] Checking Redis connection...
[server] info 8/31/23, 8:25 PM - [BullMQJobQueuePlugin] Connected to Redis ✔
[server] info 8/31/23, 8:25 PM - [NestApplication] Nest application successfully started
[server] info 8/31/23, 8:25 PM - [Vendure Server] ================================================
[server] info 8/31/23, 8:25 PM - [Vendure Server] Vendure server (v2.0.6) now running on port 3000
[server] info 8/31/23, 8:25 PM - [Vendure Server] ------------------------------------------------
[server] info 8/31/23, 8:25 PM - [Vendure Server] Shop API: http://localhost:3000/shop-api
[server] info 8/31/23, 8:25 PM - [Vendure Server] Admin API: http://localhost:3000/admin-api
[server] info 8/31/23, 8:25 PM - [Vendure Server] Asset server: http://localhost:3000/assets
[server] info 8/31/23, 8:25 PM - [Vendure Server] Dev mailbox: http://localhost:3000/mailbox
[server] info 8/31/23, 8:25 PM - [Vendure Server] Admin UI: http://localhost:3000/admin
[server] info 8/31/23, 8:25 PM - [Vendure Server] ================================================
When successful, verify that Vendure runs on port?3000
To securely access the Vendure app through your domain name, configure Nginx as a reverse proxy to handle connections to the backend port?as described below.3000
$ sudo apt install nginx
$ sudo unlink /etc/nginx/sites-enabled/default
$ sudo nano /etc/nginx/sites-available/vendure
example.com
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
}
}
Save and close the file.
$ sudo ln -s /etc/nginx/sites-available/vendure /etc/nginx/sites-enabled/
$ sudo nginx -t
$ sudo nginx -s reload
To secure Vendure for production use, allow Nginx to accept incoming connections on HTTP port?and the HTTPS port?. Then, securely redirect all HTTP requests to HTTPS by generating SSL certificates as described in the steps below.80
443
$ sudo ufw allow 'OpenSSH'
$ sudo ufw allow 'Nginx Full'
$ sudo ufw enable
$ sudo ufw status
Output:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
Nginx Full ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
snap
$ sudo snap install --classic certbot
/usr/bin
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
example.com
hello@example.com
$ sudo certbot --nginx -d example.com -m hello@example.com --agree-tos
$ sudo certbot renew --dry-run
https://example.com/admin
Log in with the?credentials you set earlier. When successful, the administrator dashboard should displaysuperadmin
https://example.com/admin-api
https://example.com/shop-api
當您設計 Vendure 商店時,前端界面會隨著您的產品和設計而激活。
在本指南中,您安裝了 Vendure 應用程序并將其部署到生產環(huán)境。您還將 Vendure 配置為使用 Vultr 對象存儲、用于 PostgreSQL 的 Vultr 托管數據庫和用于緩存的 Vultr 托管數據庫。有關 Vendure 的更多信息,請訪問官方文檔。
SSH 是一種協(xié)議,允許您從遠程系統(tǒng)連接到基于 Linux 或 Unix 的服務器。OpenSSH 是一種連接工具,它使用 SSH 協(xié)議通過安全外殼在客戶端和服務器之間進行通信。本指南介紹了如何使用密碼通過 SSH 連接到您的 Vultr 服務器或使用 OpenSSH 的 SSH 密鑰。它還介紹了如何生成 SSH 密鑰并將其手動添加到服務器。
若要使用 SSH 客戶端和密碼連接到服務器,請在本地工作站上打開命令提示符并執(zhí)行以下命令。將示例 IP 地址替換為服務器的 IP 地址,您可以在 Vultr 客戶門戶的服務器信息頁面上找到該地址。
$ ssh root@192.0.2.123
SSH 顯示一條警告以確認服務器的真實性。鍵入并按 。您將看到密碼提示。鍵入密碼,然后按 。Yes
ENTERENTER
注意:鍵入時密碼將不可見。
現在,您將登錄到服務器,您可以使用命令與服務器進行交互。
SSH 密鑰對包含公鑰和私鑰。公鑰存儲在服務器上,私鑰存儲在將用于連接到遠程服務器的本地計算機上。這兩個密鑰對于使用 SSH 密鑰通過 SSH 連接到服務器都是必需的。
ssh-keygen
實用程序可用于生成 SSH 密鑰。
ssh-keygen
使用以下命令在 Windows、Linux 和 Mac 中生成密鑰對。
ssh-keygen -t ed25519 -C email@example.com
哪里
ssh-keygen
- 生成SSH密鑰對的命令-t
- 用于指定密鑰類型的標志ed25519
- 要生成的密鑰的類型。 建議使用,因為它比 RSA 類型密鑰更安全ed25519
-C
- 標志以指定鍵的注釋email
- 要在密鑰中添加的注釋。此注釋將附加在公鑰字符串的末尾。當服務器上有更多公鑰可用時,它將有助于識別密鑰(稍后將詳細介紹本主題)。啟動命令提示符并使用以下命令生成 SSH 密鑰對。
C:\users\username> ssh-keygen -t ed25519 -C email@example.com
系統(tǒng)會提示您輸入生成密鑰的位置。默認值在括號中顯示為?(C:\Users\Username/.ssh/id_ed25519)。
注意:建議使用此目錄。因為在登錄時,SSH會在默認目錄中查找密鑰。如果使用默認目錄以外的目錄,則需要顯式指定鍵位置。
按下可使用默認位置。ENTER
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ed25519):
系統(tǒng)會提示輸入密鑰的密碼。您可以根據需要輸入密碼,也可以按下創(chuàng)建沒有密碼的鍵。如果您選擇輸入密碼,則每次使用此密鑰登錄時都需要使用它。ENTER
Enter passphrase (empty for no passphrase):
確認密碼后,將生成密鑰并將其存儲在默認位置,并顯示以下消息。
Your identification has been saved in C:\Users\username/.ssh/id_ed25519.
Your public key has been saved in C:\Users\username/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:W6ceE1mGIi87YjD9BEUoROg3Aie/fOZMr1c+qOSD8Wk email@example.com
The key's randomart image is:
+--[ED25519 256]--+
| +o oo |
+----[SHA256]-----+
啟動 Linux shell 并使用以下命令創(chuàng)建 SSH 密鑰對。
$ ssh-keygen -t ed25519 -C email@example.com
系統(tǒng)會提示您輸入密鑰的位置。默認值在括號中顯示為?(/home/username/.ssh/id_ed25519)
注意:建議使用此目錄。因為在登錄時,SSH會在默認目錄中查找密鑰。如果使用默認目錄以外的目錄,則需要顯式指定鍵位置。
按下可使用默認位置。ENTER
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ed25519):
系統(tǒng)會提示輸入密鑰的密碼。您可以根據需要輸入密碼,也可以按下創(chuàng)建沒有密碼的鍵。如果您選擇輸入密碼,則每次使用此密鑰登錄時都需要使用它。ENTER
Enter passphrase (empty for no passphrase):
確認密碼后,將生成密鑰并將其存儲在默認位置,并顯示以下消息。
Your identification has been saved in /home/ubuntu/.ssh/id_ed25519
Your public key has been saved in /home/ubuntu/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:c0hYyBV+e1vY7DUVage/3nYk4z9DvxzrLmsiek7dkZE email@example.com
The key's randomart image is:
+--[ED25519 256]--+
| . o+. . . |
+----[SHA256]-----+
| o+ = .|
啟動終端并使用以下命令生成 SSH 密鑰對。
% ssh-keygen -t ed25519 -C email@example.com
系統(tǒng)會提示您輸入生成密鑰的位置。默認值在括號中顯示為?(/Users/Username/.ssh/id_ed25519)。
注意:建議使用此目錄。因為在登錄時,SSH會在默認目錄中查找密鑰。如果使用默認目錄以外的目錄,則需要顯式指定鍵位置。
按下可使用默認位置。ENTER
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/Username/.ssh/id_ed25519):
系統(tǒng)會提示輸入密鑰的密碼。您可以根據需要輸入密碼,也可以按下創(chuàng)建沒有密碼的鍵。如果您選擇輸入密碼,則每次使用此密鑰登錄時都需要使用它。ENTER
Enter passphrase (empty for no passphrase):
確認密碼后,將生成密鑰并將其存儲在默認位置,并顯示以下消息。
Your identification has been saved in /Users/Username/.ssh/id_ed25519.
Your public key has been saved in /Users/Username/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:W6ceE1mGIi87YjD9BEUoROg3Aie/fOZMr1c+qOSD8Wk email@example.com
The key's randomart image is:
+--[ED25519 256]--+
| +o oo |
+----[SHA256]-----+
SCP 命令用于將文件復制到遠程服務器。必須將公有 SSH 密鑰復制到服務器才能啟用 SSH 身份驗證。您可以使用該命令將公鑰復制到遠程服務器。scp
啟動命令提示符或 Linux shell,然后執(zhí)行以下命令以復制公鑰。
C:\users\username> scp C:\Users\username\.ssh\id_ed25519.pub example_user@192.0.2.123:/home/example_user
哪里
SCP
- 復制文件的命令C:\Users\username\.ssh\id_ed25519.pub
- 生成的公鑰位置example_user
- 需要將文件復制到的服務器的用戶名。您需要有權訪問此服務器192.0.2.123
- 服務器的IP地址/home/example_user
- 服務器上的目標文件夾位置文件將復制到目錄中?,F在,您需要將密鑰復制到文件中并啟用 SSH 身份驗證。登錄到新創(chuàng)建的 Vultr 服務器,并使用以下命令導航到用戶的主目錄。authorized_keys
$ cd /home/example_user/
如果目錄尚不存在,請使用以下命令創(chuàng)建一個目錄。.ssh
$ mkdir .ssh
導航到 .ssh 文件夾。
$ cd .ssh
使用以下命令創(chuàng)建一個將公鑰存儲在服務器中的密鑰。authorized_keys
$ touch authorized_keys
僅當文件不存在時,該命令才會創(chuàng)建文件。touch
創(chuàng)建文件后,使用如下所示的命令將公鑰的內容復制到文件中。authorized_keys
cat
$ cat /home/example_user/id_ed25519.pub >> authorized_keys
鑰匙放置在適當的位置。
SSH 身份驗證方法在名為sshd_config.
要使用 SSH 密鑰啟用身份驗證,請使用以下命令導航到該目錄。/etc/ssh/
$ cd /etc/ssh
使用以下命令打開文件。sshd_config
$ sudo nano sshd_config
在文件中,查找并取消注釋以下兩行。
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
將參數設置為啟用使用公鑰的身份驗證。該參數指定公鑰的位置?,F在,密鑰已添加到現有服務器。您可以使用下一節(jié)中定義的步驟使用公鑰通過 SSH 連接到服務器。PubkeyAuthentication
yes
AuthorizedKeysFile
OpenSSH 客戶端提供與服務器建立 SSH 連接的命令。啟動命令提示符,然后使用以下命令使用 SSH 密鑰通過 SSH 連接到服務器。ssh
C:\users\username> ssh example_user@192.0.2.123
哪里
ssh
- 建立連接的命令example_user
- 用于建立連接的用戶名192.0.2.123
- 服務器的IP地址此命令將使用本地計算機的默認 ssh 目錄 () 中的私鑰。如果公鑰和私鑰正確匹配,則將建立SSH連接,并且您可以與服務器通信。./users/.ssh
要使用 SSH 密鑰部署新服務器,您需要在 Vultr Dashboard 中創(chuàng)建 SSH 密鑰。請按照以下步驟將 SSH 密鑰添加到您的 Vultr 帳戶。
將添加 SSH 密鑰,您可以在啟動新服務器時在 SSH 密鑰部分中選擇此 SSH 密鑰。
如何使用SSH、RDP或SFTP連接到您的Vultr云服務器
]]>
默認情況下,vultr服務器將安裝干凈的操作系統(tǒng),而無需這些附加軟件包,但您將擁有完整的 root/管理員權限來安裝所需的任何附加軟件。國內的用戶建議直接使用寶塔面板即可滿足大多數的要求。vultr服務器搭建寶塔面板圖文教程
如果您希望您的實例附帶一些已安裝的預打包軟件,我們確實提供了一套一鍵式應用程序,可添加一些流行的軟件包,包括 cPanel/WHM、LEMP、OpenVPN 等。
vultr服務器提供下面的一鍵式應用程序供大家使用。
]]>Vultr服務器機房眾多,擁有日本、美國洛杉磯、Dallas、Chicago、New York、Seattle、Atlanta、新加坡、英國、德國、荷蘭等線路,目前新增韓國數據中心。Vultr哪個機房好呢,對于國內用戶來說,Vultr日本機房及Vultr韓國機房訪問速度都不錯。
Vultr服務器推出了最新的限時促銷活動,「新用戶」注冊并充值5美元以上,即可獲得100美元的免費贈送金額!力度相當巨大??!用于建外貿站、學習、自建網盤等都很實用。有購買海外VPS服務器需求的同學就得抓緊機會了。
Vultr服務器是我們除阿里云、搬瓦工之外,最為推薦的國外服務器之一!這也是全球知名的VPS商家,口碑相當不錯!全系服務器配備SSD硬盤,可按小時付費,全球擁有21個節(jié)點可選。
具體規(guī)則是「新用戶」注冊后,進入后臺的「Billing」頁面,至少充值25 美元 (信用卡 5 美元,支付寶 / 微信支付 / PayPal 等渠道至少充值25美元) 才能激活賬號。你的賬號必須充值后才算“激活”完成,才能獲贈使用金。
一般在充值完成之后,24 小時內就會收到贈送的 100 美元賬戶余額,該余額有效期是 30 天內使用,大家就不要浪費了哦。
注意事項:
活動僅限新用戶!即需要全新的賬號+郵箱+支付方式。如果用同樣的 IP、支付方式等綁定到新的郵箱都會被視作老用戶,是不會獲贈余額的。
注冊后必須充值25 美元或以上金額「激活賬號」,才能享有獲贈資格。這點無可厚非啦,100 美元也不算小數目,總不能讓所有人隨便白薅羊毛是不是?
Vultr 支付方式支持信用卡、PayPal、支付寶、微信支付
$100 美元的賬戶余額 (信用額度) 除了不能提現,與充值的沒有差別,可購買任何產品。
由于優(yōu)惠力度不小,因此Vultr對新用戶的審核比較嚴格,如以前有注冊過的,必須保證使用全新的郵箱、IP地址、設備、新的支付方式,否則可能就白費功夫了。不過只要是正規(guī)的新用戶,賬號注冊充值成功后,都會在 24 小時內發(fā)放$100的,放心開擼吧。
]]>
經測試。發(fā)現延遲在100左右,有丟包現象,讓人比較意外的是雖然丟包現象比較多,但是下載速度還比較快。在速度上,Vultr已經沒有早年的直連速度機房,但并不影響大家對于便宜、穩(wěn)定,以及可以隨意的切換機房選擇。
個人還是推薦日本或者是洛杉磯的數據中心。
]]>vultr全球共有16個數據中心,其中對國內速度較好的是日本東京、硅谷和洛杉磯,我們今天這個寶塔面板安裝教程是為了在vultr服務器上面存放網站。
注冊后,登錄到管理中心,如果你只是想測試一個月,可先充值一個月的費用。
操作系統(tǒng)可自行選擇
最低2.5美元/月,但2.5元/月這個選擇只有在選擇美國部分城市才會出現,并且它分配的IP地址是IPV6的,您可根據自己的網站需求選擇相應的服務器配置。
本教程選擇的是新加坡的CentOS 7 64位的系統(tǒng),每月5美元,
開通后。我們先ping一下這個IP,看看能不能PING通。我這次運氣不錯,隨意開了一個ping值100多,
如果ping不通,再重新開通一個,一個賬號大概可以同時開通5個站點(如果提示無法新開服務器,可提交工單,讓微客服增加開通數),等選中需要的服務器后,再把其他PING不通,或者ping值很高的站點刪除就可以了。這樣做的好處就是每次購買的服務器IP都不一樣,如果你直接刪除再新開,獲取的IP還是你刪除的那個IP。點擊后面三個點,點擊銷毀服務器,
購買服務器后,我們需要一個SSH客戶端連接工具來遠程部署系統(tǒng)。我這里推薦Xshell windows版下載地址:
國外云盤2下載?提取密碼:666
國外云盤3下載?密碼:123
Xshell安裝過程就不介紹了,安裝完成后,打開Xshell,新建連接
輸入你的ip ,點擊確定,彈出一個窗口。選擇你剛才新建的連接,點擊連接,彈出輸入用戶名窗口,選擇記住用戶名
輸入連接密碼。密碼在服務器選項里面可以查看到
把密碼復制過來后,下面的記住密碼也打上勾,方便以后連接。
點確定。
出現這個界面,就說明連接成功
下面我們就來安裝寶塔面板,由于vultr服務器默認就一個盤。所以不用掛載磁盤,如果你有單獨的磁盤,就需要先執(zhí)行掛載磁盤操作,centos系統(tǒng)VPS服務器掛載數據盤教程? 。寶塔版本這里我選擇5.9(原因看后面),如果你想安裝最新版本,請點擊
點擊立即安裝,在彈出的頁面里面復制安裝命令。
注意:下面安裝命令是5.9的版本的。
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh
然后點確定,出現下面提示,意思是問你是否把寶塔面板安裝在WWW文件夾里。如果你想安裝在其他目錄,就選n,然后輸入你的目錄名稱。這里我直接安裝在www文件夾,輸入y 回車。就開始安裝了。
安裝時間大約一分鐘左右。
出現這個界面,說明面板安裝好了,記住上面登錄信息。
打開管理地址,輸入上面的登錄信息
安裝套件,我這里就用它推薦的LNMP一鍵安裝,當然,你也可以選擇LAMP。
這個安裝過程得兩三分鐘。安裝完成后,打開就這個頁面。
關于我為什么選擇5.9版本呢。因為5.9帶有過濾器,相當于防火墻,而新的版本去掉了這個功能,改為收費的防火墻了。新版本功能估計會多些,如果不在意這個,當然新版本的更好啦!
面板安裝好了。剩下的就是一些安全設置了。把上圖過濾器打開。除POST過濾外,其他的都勾選,如果你勾選了POST過濾,在網站后臺修改廣告JS代碼保存時,就保存不了,出現下面提示:
1、在面板設置里面修改用戶名和密碼;
2、修改默認端口;
最后一步,在安全里面把剛才替換掉的端口刪除,查看后面的狀態(tài),未使用的都刪除掉。20、21、22、8888、888,默認的80端口不能刪除。
至此,vultr服務器安裝寶塔面板圖文教程完成.
]]>推薦阿里云,注冊過程就不用多說了,如果你已有注冊好的域名,可直接跳過這一步。
推薦Vultr,vultr全球共有16個數據中心,其中對國內速度較好的是日本東京、硅谷和洛杉磯,我們今天這個教程就是以vultr服務器搭建個人私有云。
點擊購買Vultr服務器
注冊后,登錄到管理中心,Vultr SSD VPS服務器2020限時優(yōu)惠:新用戶注冊充值25美元贈送100美元,非常劃算,購買5美元的服務器話,可使用一兩年,
操作系統(tǒng)可自行選擇
最低2.5美元/月,但2.5元/月這個選擇只有在選擇美國部分城市才會出現,并且它分配的IP地址是IPV6的,您可根據自己的網站需求選擇相應的服務器配置。
本教程選擇的是日本的CentOS 7 64位的系統(tǒng),每月5美元。
安裝完成后,把域名解析到新購買的IP上。
先下載NextCloud,或者是新建網站后,在網站里面遠程下載。
https://download.nextcloud.com/server/releases/nextcloud-15.0.2.zip
點擊上傳我們剛才下載的文件?;蛘呤窃谶h程下載里面
解壓完成后,我們發(fā)現,這個壓縮包的文件并不在根目錄,而是在nextcloud文件夾里面,所以。我們得把里面的文件全部移動到根目錄,在移動之前先把根目錄下自動生成的index.html文件刪除,不然根目錄下有同名文件時,它不會覆蓋,而是會跳過。
然后輸入我們的域名看看。出現以下提示,大概意思就是Nextcloud只能在php7.0以上版本運行,而本系統(tǒng)用的是5.45,讓升級PHP版本。
下面我們來解決這個問題,打開面板的軟件商店,找到php7.0,點擊后面的安裝。
這樣就安裝好了,然后,打開網站設置,在PHP版本切換到php7.0。
然后,我們輸入網址再看看,成功。
填寫我們數據庫連接參數,正確填寫后,點擊下面的安裝完成。稍等片刻,安裝完成后,自動進入管理后臺界面。
教程結束,然后到下面地址下載客戶端使用吧。
https://nextcloud.com/install/
如果你想搭建SSR 或者搭建v2ray,請查看下面教程
]]>
由于vultr vps的windows服務器是英文版本的,所以對于英文不熟悉的小伙伴可以把英文版修改為中文版的。
修改教程:vultr vps服務器windows英文操作系統(tǒng)修改為中文
如果不知道怎么遠程連接管理服務器,請查看:Vultr主機如何遠程管理windows服務器
windows server 2012 r2系統(tǒng)自帶的瀏覽器是IE11,用它下載東西讓你抓狂,所以在本地先下載一個ChromeSetup安裝程序,1M多,然后復制到服務器上直接安裝,它自動下載的速度很快的。當然 ,你可以下載完整的Chrome安裝程序,大概60多M,然后復制到服務器進行安裝。
需要提前下載的工具軟件
1、php5.45 windows使用PHP的非線程安全(NTS)版本。我經常用織夢程序做站,所以選擇php-5.4.45-nts-Win32-VC9-x86.zip,下載地址:
https://windows.php.net/downloads/releases/archives/php-5.4.45-nts-Win32-VC9-x86.zip
下面是PHP7.4版本的。如果你想多版本運行,也可下載下面7.4
https://windows.php.net/downloads/releases/php-7.4.19-nts-Win32-vc15-x64.zip
2、MYSQL數據庫,我這里選擇了mysql-5.5.62-winx64。下載地址
https://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.62-winx64.msi
3、phpMyAdmin數據庫管理軟件? 下載地址:
https://files.phpmyadmin.net/phpMyAdmin/4.4.12/phpMyAdmin-4.4.12-all-languages.7z
首先,右鍵單擊底部狀態(tài)欄的服務器管理器(它一般是隨服務器自動啟動的),點擊添加角色和功能,如下圖
下一步
下一步
下一步,我們發(fā)現雖然系統(tǒng)界面變成中文了,但里面的小選項還是英文的,這個可以忽略,我們只用選中其中一兩個選項就可以了。
在上圖中,往下拖動滾動條,點擊web server(IIS),會自動彈出下面窗口
點擊添加功能后,web server(IIS)前面的勾就選中了
然后下一步
下一步
在下圖界面里面,如果你的網站需要用到偽靜態(tài)功能,請選中http Redirection,如果不需要,可無視
在應用程序開發(fā)選項(Application Development)里面,選中CGI,如果你還需要支持運行ASP或者ASP.net語言的網站環(huán)境的話,你可以把相應功能勾選上。本教程只針對PHP運行環(huán)境的安裝。
安裝完成后,點擊關閉
打開瀏覽器,在地址欄里輸入http://localhost,或者http://127.0.0.1,如果出現下面頁面,說明我們的IIS安裝成功了。
由于Vultr的主機windows系統(tǒng)只有一個C盤,所以在c盤根目錄新建一個名為php的文件夾,這個文件夾用來存放PHP配置文件、數據庫文件。
如果你用其他服務器里面還有其他盤,那你在其他盤新文件夾了(下圖截圖是有D盤的情況下截取的)。然后在這個文件夾再新建一個名為php的文件夾,把我們剛才下載的PHP文件解壓到這個文件夾里面。把php文件里面的php.ini-development復制一份,然后把名稱修改為php.ini,如下圖:
用記事本打開這個php.ini,搜索extension_dir,大約在721行
把extension_dir前面分號去掉;把后面的ext修改為:c:\php\php\ext ,修改后如下。
搜索date.timezone,大約在909行,把它前面的分號去掉,把date.timezone =修改為:date.timezone = Asia/Shanghai
繼續(xù)搜索extension=php_ 把下列幾個擴展前面的分號去掉,下面幾個是必須要打開的。如果你運行程序提示缺少哪個擴展,直接修改PHP.INI文件就行了。
extension=php_curl.dll
extension=php_gd2.dll
extension=php_mysql.dll
extension=php_mbstring.dll
extension=php_mysqli.dll
extension=php_pdo_mysql.dll
保存。打開windows服務器管理器,點擊右上角的工具,在彈出的菜單里打開IIS管理器
首先點擊左邊的服務器名稱,右邊會出現功能選項,然后點擊處理程序映射
點擊右邊的添加模塊映射
在彈出的窗口里面請求路徑填寫:*.php
模塊選擇:fastCgiModule
可執(zhí)行文件這一項,點擊 后面的選項
在彈出的窗口里面,你看到的都是.dll文件,所以得先選擇擴展名為*.EXE的,然后才會出現exe的文件,選擇PHP-cgi,
選擇完成后,如下圖所示
選擇是
如果你還有網站程序需要PHP版本在7.0以上的,你可以照上面方法把下載好的php7以上的文件放到D:\php\下面,與以前的版本區(qū)分開(如下圖)。新建網站時單獨添加模塊映射就行了。
然后再點擊選項里面的默認文檔
添加一個新的默認的文檔index.php,然后點擊確定
我們在C盤根目錄下新建一個名為WEB的文件夾,用來存放所有網站的文件,然后在這個文件夾里再新建一個文件夾,取名為site1
在這個site1文件夾里面新建一個名為1的PHP文件(名稱隨意,注意新建的文件名字為1.php,而不是1.php.txt)。內容為
<?php
phpinfo();
?>
然后,我們添加一個站點,來看看PHP有沒有配置成功
把物理路徑指向我們上一步新建site1網站目錄,物理路徑指向我們剛上面新建的文件夾,端口處默認80,主機名處填寫你的域名。我這是服務器上演示,沒綁定域名,有一個默認的站點,不綁定域名的話,它會提示端口被占用,你可以刪除,也可以在默認站點上修改物理路徑為你新建的站點路徑,這里我是新建一個,沒有刪除默認站點,所以得把端口設置為8001。
我們在地址欄里輸入http://localhost:8001? 或者http://127.0.0.1:8001 回車
出現這個畫面,說明我們的PHP運行環(huán)境配置成功。這都是在服務器本地測試,所以網址后面要加上指定的端口,如果有綁定的域名,端口就不需要設置,用默認的80就行了。
上面步驟中,在添加處理程序映射模塊及默認首頁文件檔這兩個環(huán)節(jié)我這邊是全站添加的,就是說,添加后,后面的新建的站點都用這個配置,你也可以不用添加全站,新建一個站點就添加一個。
直接雙擊安裝,到這一步后,選第二項,
把mysql server默認安裝路徑修改為c:\PHP\..如下圖所示
點擊server data files,把數據庫路徑也修改為c盤PHP文件夾里面。如下圖
然后一路NEXT
編碼選擇UTF8
輸入數據庫密碼。
安裝結束
把上面下載的phpmyadmin解壓到c盤PHP文件夾里面
打開IIS管理工具,新建phpmyadmin管理網站
訪問這個管理,輸入用戶名和密碼,
成功登錄
教程完畢。我修改過的php.ini提供下載。(注意,如果你的網站保存在C盤以外的地方。比如D盤。你要把php.ini文件721行的位置修改一下。)
]]>